系统开机启动流程: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

然后点击新建虚拟机,选择自定义配置-->使用现有磁盘

图片描述

图片描述

开机就可以了

图片描述


Big_fat_cat
207 声望10 粉丝