首页 > 代码库 > 系统启动时遇到“设备忙”问题的解决

系统启动时遇到“设备忙”问题的解决

今天做了一个实验,碰到了一个问题。

实验是这样的:

为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区;

(1) 为硬盘新建两个主分区;并为其安装grub;

(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;

(3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;

(4) 为grub提供配置文件;

(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;


这是我的实验步骤:

(1) 为硬盘新建两个主分区;并为其安装grub;

将新添加的磁盘/dev/sdc分为三个主区,其中一个作为swap分区:

[root@localhost ~]# fdisk -l /dev/sdc

Disk /dev/sdc: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x8a6c3caa

  Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1          26      208813+  83  Linux
/dev/sdc2              27         680     5253255   83  Linux
/dev/sdc3             681         942     2104515   82  Linux swap / Solaris



强制内核重读分区表:

[root@localhost ~]# partx -a /dev/sdc



格式化分区:

[root@localhost ~]# mke2fs -t ext4 /dev/sdc1
[root@localhost ~]# mke2fs -t ext4 /dev/sdc2
[root@localhost ~]# mkswap /dev/sdc3



创建挂载点:

[root@localhost ~]# mkdir /mnt/boot



将两个主分区区别挂载至挂载点:

[root@localhost ~]# mount /dev/sdc1 /mnt/boot/


为新添加的/dev/sdc硬盘安装grub:

[root@localhost ~]# grub-install --root-directory=/mnt/sysroot/ /dev/sdc



(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;

[root@localhost ~]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/vmlinuz
[root@localhost ~]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot/initramfs.im
g



根据FHS创建rootfs必要目录:

[root@localhost ~]# mkdir /mnt/sysroot//创建挂载点;
[root@localhost ~]# mount /dev/sdc2 /mnt/sysroot///挂载rootfs;
[root@localhost ~]# cd /mnt/sysroot/
[root@localhost sysroot]# mkdir -pv etc bin sbin lib lib64 tmp mnt media home root dev 
selinux usr var proc sys



(3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;


首先复制bash、ls、cat程序:

[root@localhost ~]# cp /bin/bash /mnt/sysroot/bin/
[root@localhost ~]# cp /bin/ls /mnt/sysroot/bin/
[root@localhost ~]# cp /bin/cat /mnt/sysroot/bin/


接着复制ls程序的库文件:

[root@localhost ~]# ldd /bin/ls
linux-vdso.so.1 =>  (0x00007fff32bda000)//应用程序访问库文件的入口;
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003eff200000)
librt.so.1 => /lib64/librt.so.1 (0x0000003efe600000)
libcap.so.2 => /lib64/libcap.so.2 (0x000000341d800000)
libacl.so.1 => /lib64/libacl.so.1 (0x000000341b800000)
libc.so.6 => /lib64/libc.so.6 (0x0000003efde00000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003efda00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003efd600000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003efe200000)
libattr.so.1 => /lib64/libattr.so.1 (0x000000341b400000)
[root@localhost ~]# 
[root@localhost ~]# cp /lib64/libselinux.so.1 /mnt/sysroot/lib64/    
[root@localhost ~]# cp /lib64/librt.so.1 /mnt/sysroot/lib64/
[root@localhost ~]# cp /lib64/libcap.so.2 /mnt/sysroot/lib64/
[root@localhost ~]# cp /lib64/libacl.so.1 /mnt/sysroot/lib64/
[root@localhost ~]# cp /lib64/libc.so.6 /mnt/sysroot/lib64/
[root@localhost ~]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64/
[root@localhost ~]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/
[root@localhost ~]# cp /lib64/libpthread.so.0 /mnt/sysroot/lib64/
[root@localhost ~]# cp /lib64/libattr.so.1 /mnt/sysroot/lib64/

以同样的方式复制bash、cat程序的库文件。



(4) 为grub提供配置文件;


    根据系统的启动流程可知:当设置硬盘为第一启动项时,第一个安装有引导程序的硬盘会被BIOS设置为要启动的硬盘,因为BIOS扫描顺序是从/dev/sda开始扫描的,而/dev/sda之上有grub,所以需要在/dev/sda之上的grub的配置文件中添加启动项,其指向/dev/sdc硬盘上的引导程序grub。

    因此,需要编辑/boot/grub/grub.conf,在其中添加以下几项:


title CentOS 6 (Express)

    root (hd2,0) 

    //这里表示为系统上第3块硬盘之上的第一个分区,即/dev/sdc之上的/dev/sdc1;

    kernel /vmlinuz ro root=/dev/sdc2 selinux=0 init=/bin/bash

    //指定要启动的内核文件;这里还需指定不开启selinux功能,并指定第一个启动的用户空间的程序是/bin/bash;

    initrd /initramfs.img

    //指定与该内核匹配的ramdisk文件,作为临时根文件系统,提供真正的根文件系统所在设备的驱动程序;



(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;

    因为新添加的菜单项为/boot/grub/grub.conf的第三项,所以将/boot/grub/grub.conf中的default参数设置为2:

    default=2


最后一步:同步后(sync)重启。


启动之后遇到以下问题:一直显示/dev/sdc2设备忙,但设备根本还没有挂载,更何况是使用。

技术分享


后来通过读取/dev/sda上的MBR中的grub启动系统,使用fsck检查/dev/sdc设备,显示如下:

技术分享


到这里问题就解决了,是这样的,用fsck检查了一下/dev/sdc2,信息提示说是磁盘的超级块损坏了,然后我就重新格式化了一下/dev/sdc2,重新创建FHS目录、复制程序和库文件,同步后再重启就可以了。



本文出自 “Tab” 博客,请务必保留此出处http://xuweitao.blog.51cto.com/11761672/1905651

系统启动时遇到“设备忙”问题的解决