教你做一个属于自己的小
linux
:
在前面我们讲了内核的编译和
linux
的启动顺序这时我们就可以做一个属于自己的小
linux
了,在做之前我们需要做些准备工作,需要在宿主机上新增一块硬盘做分区,还有一个内核,这个可以的我们自己编译的也可以使用我们宿主上的,为了简单我们就使用宿主机的。该操作的在
linux5.5
实现的
我们在宿主机上新加了一块硬盘被认作的
/dev/sdb,
这时就可以分区了前我们讲过分区了这里就不多说了,我们简单地建立三个分区,一个根分区
(/)512M
,一个引导分区(
boot
)
100M
分区和交换分区(
swap
)
64M
,因为我们的
linux
也不大,所以分区空间不用很大
接下来开始分区
fdisk /dev/sdb <<EOF
>n
>p
>1
>
>+100M
>n
>p
>2
>
>+512M
>n
>p
>3
>
>+64M
>t
>3
>82
>w
>EOF
这里每一步的学前都有介绍不明白的可以回顾前前面的笔记。
建完分区可以使用
fdisk �Cl
查看下
这时就需要格式化分区了
#mke2fs -j /dev/sdb1 && mke2fs -j /dev/sdb2 && mkswap /dev/sdb3
在格式化的时候需要注意下我们是用
ext2
还是因为
ext3
的,这个会在后面我们制作
initrd
时用到的。
格式化完成后就可以挂载使用了,建立挂载点
#mkdir /mnt/root &&mkdir /mnt/system
#mount /dev/sdb1 /mnt/mnt/root &&mount /dev/sdb2 /mnt/system
挂载完成了,这时就该考虑都向该硬盘都需要什么可以把我们的
linux
启动起来,首先就是内核,
initrd
文件,还有
grup
引导
init
这时我们一步步剖析,下面复制宿主机的内核到目标主机的硬盘里
#cp /boot/vmlinuz-`uname �Cr` /mnt/boot/
内核拷贝好后就该
initrd
文件了但是这个文件是需要修改的,因为他的宿主的机的有些东西的我们不需要的,但是我们拷贝一份对其做简单的修改,拷贝一份到
/tmp
目录下,使用
file
可以查看该文件的信息发现是压缩文件就需要解压缩但是又是用
cpio
归档打包后的
#mkdir /initrd
cd /initrd
#zcat /boot/initrd-`uname -r`.img | cpio -id
#sed -i '1,$s@/dev/VolGroup00/LogVol00@sda2@g' ini
#sed -i -e "/^lvm.*/d" -e "/^resume.*SWAP.*/d" init
#find . | cpio -H newc -o --quiet | gzip -9 -n > /mnt/boot/initrd.gz
以上四部分别是:使用
zcat
不解压缩用
cpio
解归档,然后紧紧修改下
init
下的两个内容
然后重新归档压缩放在目标主机的
/boot
下
这些都做好了就该做
grup
引导了使用命令
#cd /mnt/boot
#grub-install --root-directory=/mnt /dev/sdb &>/dev/null
#cd /mnt/boot/grub
#cat >>grub.conf <<EOF
>default=0
>timeout=5
>hiddenmenu
>title Small Linux (2.6.28.10)
> root (hd0,0)
> kernel /vmlinuz-2.6.28.10 ro root=/dev/sda2 quiet
> initrd /initrd.gz
>EOF
#ln -s grub.conf menu.lst
创建软链
以上的都比较简单就做说明了,但是有心的人可能看到我们在配置
grup.conf
时写到内核的“
root=/dev/sda2 quiet
”就会有些奇怪了,我们明明建立的是
/dev/sdb2
作为
boot
的,但是这里怎么就变成了
/dev/sda2
了,说明下这块硬盘在宿主机上原有就有一个硬盘
sda
所以第二块就会被认成是
sdb
的但是在我们的目标主机上是没有硬盘的,所以该硬盘会被重新认作是
sda
这里就是我们为什么会是“
root=/dev/sda2 quiet
”的原因了。
下来该做
init
引导了,他的引导我们都知道这时需要读取
/etc/inittab
文件的接下来开始建这个文件
我们是把
/mnt/system
作为根分区的所以我们都只要根分区的需要很多文件的接下来我们先建立下必要的文件其他的文件可以在随后建立
cd /mnt/system
mkdir -p boot root etc lib bin sbin dev home proc var usr/{bin,sbin,etc,src,lib,share,loacal} selinux yum tmp sys
我们就需要把宿主机上的
init
拷到目标主机上:
cp /sbin/init ./sbin/
当我们不知道某个命令在什么位置可以使用
which
来查看路径
#cp /sbin/init /mnt/system/ sbin/
#cp �Cd /lib/libc.so.6 /lib/libc-2.5.so /lib/libdl.so.2 /lib/libdl-2.5.so /lib/libsepol.so.1 /lib/libselinux.so.1 /lib/ld-linux.so.2 /lib/ld-2.5.so lib/
我们知道任何命令或者进程都是需要其依赖的库文件支撑的,所以我们不单单需要把命令拷过去还需要库文件的可以使用:
ldd /sbin/init
查看依赖的库文件,但是有些库文件是作为链接使用的可以使用
ls �Cl
查看是否为链接文件,要是链接文件使用
cp �Cd
将在保持链接名的前提下把库文件拷过来。完成后就该建立
inittab
文件了:
cat >>etc/inittab <<EOF
#inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
EOF
这时我们看到了
rc.sysinit
文件这是系统初始化的文件,这时就该建立
/etc/rc.d/rc.sysinit
文件了
#cat >>etc/rc.d/rc.sysinit<<EOF
>#!/bin/bash
>#
>echo -e "\t\tWelcome to \033[35msmall\033[0mLinux"
>/bin/bash
>EOF
别忘记了给该执行脚本有执行的权限
#chmod +x etc/rc.d/rc.sysinit
我们看到了初始化后执行了
/bin/bash
但是我们的目标主机上并没有
bash
这时就需要从宿主机上把
/bin/bash
拷贝过来
,
前面说过可能需要库文件的支持所以还需要库文件的,方法和前面的一样可以参考下
#cp /bin/bash /mnt/system/bin/
#cp -d /lib/libtermcap.so.2 /lib/libtermcap.so.2.0.8 /mnt/system/lib/
到目前为止我们的小
linux
基本上是可以启动起来了,但是基本上是傻瓜式的,基本是没有命令的可以拷贝个
ls
命令
#cp /bin/ls /mnt/system/bin/
#cp -d /lib/librt.so.1 /lib/librt-2.5.so /lib/libattr.so.1 /lib/libacl.so.1 /lib/libpthread.so.0 /mnt/system/lib/
完成后别忘记了多同步下
sync
命令,使数据写入到硬盘中,这时我们需要挂起我们的宿主机,在新建个虚拟机作为目标主机,但需要说的是这时就不需要新建硬盘了,应该使用第二项使用已有的硬盘,找到我们那块新加硬盘的位置。就可以启动我们的目标主机了,看我们的小
linux
是否可以启动起来。
以上的复制的库文件都是在我这台实验宿主机上拷贝的大家可以参考下自己的宿主机上的库文件举一反三的拷贝下,这个你是懂的!!!
这只是个基本的可以启动的小
linux
我们可以进一步慢慢完善起来的,需要什么命令复制下就可以了,但是别忘记了其所依赖的库文件。