台式机单独运行Linux内核,基于宿主机制作一个简单可启动的linux

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

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

bVNSD8?w=498&h=412

bVNSEe?w=498&h=412

开机就可以了

bVNSI6?w=723&h=218

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值