系统开机启动流程:BIOS-->MBR(bootloader(grub))-->/sbin/init,BIOS是裸机自带的它是选择启动设备是硬盘、光盘、还是磁盘;grub是选择启动哪个分区上的系统windows系统、linux系统;那么一个空磁盘是如何把系统安装上然后让grub引导启动的呢?下面在本机(宿主机)安装一块新的磁盘sdb,然后把新磁盘的系统配置好,新建一个虚拟机,把该磁盘放入启动的简单流程走一遍【具体的详细启动流程网上有许多博客讲解】
创建两个分区
在宿主机的第二块磁盘创建boot分区100M,根分区1G,格式化为ext4
【创建分区】
[root@www ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xcd89c970.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-2610, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +100M【创建第一个】
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (15-2610, default 15):
Using default value 15
Last cylinder, +cylinders or +size{K,M,G} (15-2610, default 2610): +1G【创建第二个】
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
【格式化】
[root@www ~]# mke2fs -t ext4 /dev/sdb1
[root@www ~]# mke2fs -t ext4 /dev/sdb2
安装grub
在sdb的0磁道,0柱面,1扇区安装grub
[root@www ~]# mkdir /mnt/{boot,sysroot}【创建boot目录,根目录】
[root@www ~]# mount /dev/sdb1 /mnt/boot
[root@www ~]# mount /dev/sdb2 /mnt/sysroot
# 【--root-directory的路径是boot所在的路径/mnt】
[root@www ~]# grub-install --root-directory=/mnt /dev/sdb【安装grub】
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /mnt/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
(fd0) /dev/fd0
(hd0) /dev/sda
(hd1) /dev/sdb
[root@www ~]# ls /mnt/boot【安装成功】
grub lost+found
复制内核和initrd
复制当前系统的内核及initrd到sdb1【sdb的boot分区】,initrd是识别根分区文件系统所在设备的驱动程序,根分区文件系统可以是各种设备,不仅仅是磁盘,该initrd是系统安装时自动放进来的
[root@www ~]# cp /boot/vmlinuz-2.6.32-504.el6.i686 /mnt/boot/mylinux【重命名为mylinux】
[root@www ~]# cp /boot/initramfs-2.6.32-504.el6.i686.img /mnt/boot/myinitramfs.img
[root@www ~]# ls /mnt/boot
grub lost+found myinitramfs.img mylinux
创建系统必要目录
[root@www ~]# cd /mnt/sysroot/
[root@www sysroot]# ls
lost+found
[root@www sysroot]# mkdir -pv etc/rc.d boot dev proc sys tmp var usr lib bin sbin srv root home media mnt [lib64]【根据宿主机系统判断是否有该库】
mkdir: 已创建目录 "etc"
mkdir: 已创建目录 "etc/rc.d"
mkdir: 已创建目录 "boot"
mkdir: 已创建目录 "dev"
mkdir: 已创建目录 "proc"
mkdir: 已创建目录 "sys"
mkdir: 已创建目录 "tmp"
mkdir: 已创建目录 "var"
mkdir: 已创建目录 "usr"
mkdir: 已创建目录 "lib"
mkdir: 已创建目录 "bin"
mkdir: 已创建目录 "sbin"
mkdir: 已创建目录 "srv"
mkdir: 已创建目录 "root"
mkdir: 已创建目录 "home"
mkdir: 已创建目录 "media"
mkdir: 已创建目录 "mnt"
[root@www sysroot]# ls
bin dev home media proc sbin sys usr
boot etc lib lost+found mnt root srv tmp var
复制本机bash及库文件
要想系统跑起来,必须有个bash程序
[root@www sysroot]# which bash
/bin/bash
[root@www sysroot]# cp /bin/bash /mnt/sysroot/bin/
[root@www sysroot]# ls bin
bash
【复制库文件】
[root@www media]# ldd /bin/bash
linux-gate.so.1 => (0x00bea000)
libtinfo.so.5 => /lib/libtinfo.so.5 (0x04e77000)
libdl.so.2 => /lib/libdl.so.2 (0x008f1000)
libc.so.6 => /lib/libc.so.6 (0x0073c000)
/lib/ld-linux.so.2 (0x00716000)
[root@www media]# ldd /bin/bash | grep -o "/[^[:space:]]\{1,\}"
/lib/libtinfo.so.5
/lib/libdl.so.2
/lib/libc.so.6
/lib/ld-linux.so.2
【写一个bash脚本进行复制】
[root@www ~]# cat cplib.sh
#!/bin/bash
for lib in `ldd /bin/bash | grep -o "/[^[:space:]]\{1,\}"`; do
cp ${lib} /mnt/sysroot/lib【如果你的宿主机是64位,这应该是lib64】
done
【执行脚本复制bsah库到指定目录】
[root@www ~]# chmod +x cplib.sh
[root@www ~]# ./cplib.sh
[root@www ~]# tree /mnt/sysroot/【tree没有需要yum安装】
/mnt/sysroot/
├── bin
│ └── bash
├── boot
├── dev
├── etc
│ └── rc.d
├── home
├── lib
│ ├── ld-linux.so.2
│ ├── libc.so.6
│ ├── libdl.so.2
│ └── libtinfo.so.5
├── lost+found
├── media
├── mnt
├── proc
├── root
├── sbin
├── srv
├── sys
├── tmp
├── usr
└── var
18 directories, 5 files
【测试bash是否能够执行】
[root@www ~]# chroot /mnt/sysroot【切换根目录】
bash-4.1# ls
bash: ls: command not found
bash-4.1# exit
exit
复制几个命令程序
上面复制了bsah,现在复制几个其他的,首先上面的复制库的脚本做了一个修改,使它能够传递一个参数
【复制程序】
[root@www ~]# cp /bin/ls /mnt/sysroot/bin/
[root@www ~]# cp /bin/cat /mnt/sysroot/bin/
[root@www ~]# cp /bin/vi /mnt/sysroot/bin/
【写一个复制程序库的脚本】
[root@www ~]# cat cplib.sh
#!/bin/bash
echo $1
for lib in `ldd /bin/$1 | grep -o "/[^[:space:]]\{1,\}"`; do
cp ${lib} /mnt/sysroot/lib
done
【复制上面一个程序对应的库】
[root@www ~]# ./cplib.sh ls
ls
[root@www ~]# vim cplib.sh
[root@www ~]# ./cplib.sh ls
ls
[root@www ~]# ./cplib.sh cat
cat
[root@www ~]# ./cplib.sh vi
vi
【切换根】
[root@www ~]# chroot /mnt/sysroot/
bash-4.1# ls【可以执行ls命令了,现在就能执行ls、cat、vi命令】
bin dev home lost+found mnt root srv tmp var
boot etc lib media proc sbin sys usr
写一个grub.conf配置文件
[root@www ~]# cd /mnt/boot/grub
[root@www grub]# vi grub.conf
[root@www grub]# sync
[root@www grub]# cat grub.conf
default=0
timeout=5
title simplinux
root (hd0,0)【指定把第一块磁盘的第一个扇区(boot)作为临时根】
kernel /mylinux ro root=/dev/sda2【新系统根】 quiet selinux=0 init=/bin/bash【指定初始化文件为bash而不是 /sbin/init(默认)】
initrd /myinitramfs.img
然后点击新建虚拟机,选择自定义配置-->使用现有磁盘
开机就可以了
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。