今天做了一个实验,碰到了一个问题。
实验是这样的:
为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区;
(1) 为硬盘新建两个主分区;并为其安装grub;
(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;
(3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;
(4) 为grub提供配置文件;
(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;
这是我的实验步骤:
(1) 为硬盘新建两个主分区;并为其安装grub;
将新添加的磁盘/dev/sdc分为三个主区,其中一个作为swap分区:
[[email protected] ~]# 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
强制内核重读分区表:
[[email protected] ~]# partx -a /dev/sdc
格式化分区:
[[email protected] ~]# mke2fs -t ext4 /dev/sdc1 [[email protected] ~]# mke2fs -t ext4 /dev/sdc2 [[email protected] ~]# mkswap /dev/sdc3
创建挂载点:
[[email protected] ~]# mkdir /mnt/boot
将两个主分区区别挂载至挂载点:
[[email protected] ~]# mount /dev/sdc1 /mnt/boot/
为新添加的/dev/sdc硬盘安装grub:
[[email protected] ~]# grub-install --root-directory=/mnt/sysroot/ /dev/sdc
(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;
[[email protected] ~]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/vmlinuz [[email protected] ~]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot/initramfs.im g
根据FHS创建rootfs必要目录:
[[email protected] ~]# mkdir /mnt/sysroot//创建挂载点; [[email protected] ~]# mount /dev/sdc2 /mnt/sysroot///挂载rootfs; [[email protected] ~]# cd /mnt/sysroot/ [[email protected] 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程序:
[[email protected] ~]# cp /bin/bash /mnt/sysroot/bin/ [[email protected] ~]# cp /bin/ls /mnt/sysroot/bin/ [[email protected] ~]# cp /bin/cat /mnt/sysroot/bin/
接着复制ls程序的库文件:
[[email protected] ~]# 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) [[email protected] ~]# [[email protected] ~]# cp /lib64/libselinux.so.1 /mnt/sysroot/lib64/ [[email protected] ~]# cp /lib64/librt.so.1 /mnt/sysroot/lib64/ [[email protected] ~]# cp /lib64/libcap.so.2 /mnt/sysroot/lib64/ [[email protected] ~]# cp /lib64/libacl.so.1 /mnt/sysroot/lib64/ [[email protected] ~]# cp /lib64/libc.so.6 /mnt/sysroot/lib64/ [[email protected] ~]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64/ [[email protected] ~]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/ [[email protected] ~]# cp /lib64/libpthread.so.0 /mnt/sysroot/lib64/ [[email protected] ~]# 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目录、复制程序和库文件,同步后再重启就可以了。