以清华同方一体机安装为例

一、问题描述

1, 问题描述

问题的现象是,清华同方一体机安装完成后,关机,启动,屏幕未进入桌面,屏幕打印如下信息。必现。

— Boot args (cat /proc/cmdline)
— Check rootdelay= (did the system wait long enough?)
— Check root= (did the system wait for the right device?)
— Missing modules (cat /proc/modules; ls /dev)
ALERT! /dev/disk/by-uuid/xxxxxxxxx does not exist. Dropping to a shell!

2, 问题复现步骤和各个阶段的现象说明

2.1 准备清华同方一体机,或者其他更老启动速度更慢的机器,或者慢速linux usb启动盘。

2.2 安装方德桌面操作系统, 推荐版本是1.5 0822.0004。

2.3 安装完毕后,关机后开机。

2.4 启动后未进入桌面,屏幕打印字符串,进入initrd环境,进入桌面失败。

3, 对比测试和复现条件说明

在金刚组提供的清华同方一体上,该现象必现。其他机器暂未复现。 根据以往经验在启动较慢的服务器,linux usb系统盘,慢速启动机器也有可能出现

二、问题分析

1、第一阶段

起止时间:2016.12.14至2016.12.14

分析思路:

该问题必现,分析打印信息,alert! /dev/disk/by-uuid/########### does not exist。直接断言信息initrd通过UUID查找硬盘失败。

直接原因肯定是找不到硬盘UUID,找不到的原因,推测可能是UUID的值不正确,或者其他原因导致。

验证过程:

进入u盘启动盘。

$blkid/dev/sda1: UUID="e9399244-24c6-46bd-9786-051806f0f93f" TYPE="ext4" /dev/sda5: UUID="df7a3fc6-d2dc-4c85-a445-8bbc02ff7c84" TYPE="swap"

......

对比硬盘的UUID与硬盘内的文件系统里grub内的UUID是否相同。发现两者相同,证明硬盘的UUID值是正确的。

分析结果:

硬盘的UUID值正确,排除UUID错误的嫌疑。排除硬盘本身损坏的嫌疑。

2、第二阶段

起止时间:2016.12.14至2016.12.15

分析思路:
    经过第一阶段分析验证,原因指向initrd,grub,内核或者启动速度太慢导致加载UUID失败。修改硬盘加载方式,和增加挂载root分区等待时间来验证推测。

验证过程:

1、启动到Grub阶段,修改grub参数root=UUID=XXXXXXX 这里,改成root=/dev/sdXY,然后按ctrl+x启动。(这里sdXY中的X代表一个字母,Y代表一个数字,通常是/dev/sda1啦。可以在live cd模式下通过fdisk -l来看都有哪些设备,以此来确定X和Y的值)

通过指定根分区为/dev/sda1方式启动,正常进入桌面。

2、启动到Grub阶段,修改grub参数root=UUID=XXXXXXX 这里,添加rootdelay=60。

rootdelay 作用— Time to delay before attempting to mount the root filesystem.

通过延长根分区加载时等待时间方式启动,正常进入桌面。

分析结果:

通过修改根分区加载时间或者修改根分区加载方式可修复这个问题。

直接原因内核处理UUID的加载方式时,对于一些设备需要更长时间初始化。Initrd加载完成,根文件系统通过UUID方式未成功挂载。

2、第三阶段

起止时间:2016.12.15至2016.12.16

分析思路:
    从内核代码分析initrd执行过程,挂载根文件系统的方式,从initrd分析根分区挂载过程。

验证过程:

查阅资料,跟踪内核代码发现prepare_namespace()里面mount root fail才会导致本问题,发现在系统开始做mount root的时候,硬盘还没有被bind。同时也发现这个function里面有个全局变量root_delay。在这个函数被调用时会先做delay root_delay。然后又查找了一下这个变量被赋值的地方,发现是通过bootargs环境变量传入的。在bootargs里面加上rootdelay之后,系统就能够正常的mount root了。

对于启动比较慢的盘设备,从盘驱动加载到盘设备真正可用大概需要几秒钟时间。如果将盘驱动编译进内核,内核通常不能成功访问设备中的文件系统。因为在内核访问设备时,盘设备通常没有初始化完毕。所以常规的做法是,在initrd 中加载盘驱动,然后休眠几秒钟,等待设备初始化完毕后再挂载盘设备中的文件系统。

内核有三种方式加载根文佳系统,(这一段摘自kernel-4.3/linux-4.3/Documentation/early-userspace/README)

(a)将所有需要的设备和文件系统驱动程序编译到内核中,非initrd。 init / main.c:init()将调用prepare_namespace()来装载 最终根文件系统,根据 root = 选项和选项 init = 运行 一些其他的init二进制文件。

(b)将一些设备和文件系统驱动程序构建成模块并存储在 initrd中。initrd必须包含一个二进制'/ linuxrc'加载这些驱动程序模块。安装最后的根文件系统就是通过linuxrc使用pivot_root系统调用完成。 initrd安装是通过内核prepare_namespace()函数执行。

(c)使用initramfs。必须跳过对prepare_namespace()的调用。这意味着二进制必须完成所有的工作。这个二进制通过修改usr / gen_init_cpio.c或通过新的initramfs initrd格式(cpio归档文件)存储。它必须命名为“/ init”。这个二进制是负责做prepare_namespace()做的所有事情。为了保持向后兼容性,/ init二进制只会 通过initramfs cpio归档文件运行。如果不是这样,init / main.c:init()将运行prepare_namespace()来挂载最后的根并执行预定义的init二进制文件。

initrd相关代码的调用层次关系图:

分析结果:

验证结果证明通过UUID方式加载需要更长时间,系统的主线程运行完毕需要的时间较短。而硬盘的初始化是在启动过程的最后几步进行的,而且和硬件通讯所需的时间比较长。这就造成了在主线程已经跑完的时候硬盘还没有ready.

HGJ系统Grub提供两种根分区加载方式,UUID方式和根分区方式,UUID方式需要内核执行prepare_namespace()函数完全初始化完成,使用根分区方式只要保“driver_probe_done() != 0”即mount操作成功即可。使用UUID的好处是分区被唯一标识,不会受分区调整的影响,对于linux usb类系统盘,应添加加载根文件系统等待时间。

三、问题分析结论

出错原因是通过UUID查找根分区失败,根分区挂载有UUID方式和直接写根分区方式,UUID方式加载需要的时间要比根分区方式长(UUID方式需要硬盘完全初始化,根分区方式只需要初始化过程中mount操作成功),此硬盘加载过慢,initrd执行结束,硬盘初始化未完成,导致挂载根分区失败。

四、解决方法

内核的设计者已经为这种情况,提供对应的启动参数,修改grub参数即可。

方案一,在加载根文件系统时添加超时等待:

在/etc/default/grub中添加参数GRUB_CMDLINE_LINUX="rootdelay=10",使用pdate-grub命令更新grub菜单。

方案二,使用根分区方式加载:

在/etc/default/grub中添加参数GRUB_DISABLE_LINUX_UUID=true,使用update-grub命令菜单更新grub菜单。

ALERT! /dev/disk/by-uuid/xxxxxxxxx does not exist. Dropping to a shell!相关推荐

  1. ALERT! UUID=xxxxxxxxx does not exist. Dropping to a shell!

    ALERT! UUID=xxxxxxxxx does not exist. Dropping to a shell! 文章目录 ALERT! UUID=xxxxxxxxx does not exist ...

  2. /dev/disk/by-uuid ***** does not exits

    首先要说明的是 make xconfig  "对号"是编译进内核  通过与make menuconfig 对比可知 我一开始选反了.. 编译内核后出现找不到磁盘的情况 解决方法一: ...

  3. linux /dev/disk/by-path 修改,Linux磁盘分区

    一.fdisk分区 第一步:查看机器所有磁盘 执行命令:ll /dev/disk/by-path image.png 第二步:格式化硬盘 执行命令:fdisk /dev/sdc p:查看当前磁盘的分区 ...

  4. Could not find an open hard disk with UUID {57bbe8fe-8b4f-4a0d-aef4-1291b23d2bef}. 返回 代码: VBOX_E_OBJ

    Could not find an open hard disk with UUID {57bbe8fe-8b4f-4a0d-aef4-1291b23d2bef}. 返回 代码: VBOX_E_OBJ ...

  5. 哪个Linux ATA 硬盘,linux – scsi和/ dev / disk / by-id下相同硬盘的ata条目

    你可以使用其中之一. 显示的大部分内容取决于您的控制器和磁盘.我使用SAS控制器和SAS磁盘(在某些情况下使用SATA SSD),但您可以随意使用任何您想要的zpool驱动器标识.您在这里看到ata和 ...

  6. linux误删除 dev disk文件,误删除 linux 系统文件了?这个方法教你解决

    转载于互联网并适当的修改 误删除linux系统文件了?不用急,本文将给你一个恢复linux文件的方法,让你轻松应对运维中的各风险问题.方法总比问题多~ 说在前面的话 针对日常维护操作,难免会出现文件误 ...

  7. git clone报错:repository ‘xxxxxxxxx’does not exist

    git clone时报错: [root@test01 test]git clone root@192.168.1.38/home/git/solo.git fatal: repository 'roo ...

  8. 软件相关的小问题记录

    0.此博客主要来记录在开发过程中, 遇到的一些小问题(new or surprise to me). Keep a record of information that was new or surp ...

  9. android平板刷linux系统下载,android平板刷Ubuntu启动停在initramfs

    本帖最后由 112pop 于 2015-7-28 17:40 编辑 3288的平板想刷成Ubuntu系统,在Firefly-RK3288的内核上进行定制,挂载不上linux文件系统,请问有哪位有解决方 ...

最新文章

  1. web浏览器_如何在iPhone和iPad上更改默认的Web浏览器
  2. 【每日DP】day 5、P1095 守望者的逃离(好像悟到了DP的真谛)难度⭐⭐★
  3. 为什么static成员必须在类外初始化
  4. php call_user_func_array 性能,php-call_user_func_array是否太慢?
  5. VC++实现QPSK调制
  6. 面试官最爱的volatile关键字
  7. 理财子公司成长的烦恼
  8. ftp工具FileZilla下载安装配置
  9. Windows 批量添加删除路由资源性能优化
  10. html5点赞计数功能,点赞功能
  11. 【测试工具】搭建API服务
  12. 【网络】无线相关名词解释:RSSI、RSRP、SNR
  13. 移动安全办公的难点在哪?
  14. css3的弹性盒子模型,css3弹性盒子模型——回顾。
  15. (玩具箱)unity游戏——maze(简介,代码,链接)
  16. 计算机恢复原始桌面图标,电脑界面图标怎么恢复成最原始的样子?
  17. Unity3D-LOL部分效果生成方法---cd效果
  18. 跟着大宇学Redis--------目录帖
  19. 灵魂拷问:31岁拿了阿里P6的offer,要去吗?
  20. [认证 授权] 1. OAuth2授权

热门文章

  1. 计算机科学与技术专业师范类,计算机科学与技术专业(师范)简介.PDF
  2. c语言三种插入排序算法
  3. 我的爱情与Python不得不说的故事
  4. 基于layui框架的登录验证
  5. Pr 除水印及视频统一字幕
  6. 无线WEP、WPA加密与解密原理
  7. Oracle笔记 之 行列互换
  8. idea控制台中文乱码的解决方法(最后一种亲测有效)
  9. 【centos7 编译安装gcc\g++4.8.2 非常全面】
  10. 获取IE与FF中鼠标坐标