借鸡生蛋--巧做Linux PE系统
本篇以虚拟机为主要实验对象,实验需要提前建立好一个正常的Linux系统,还有一个新的系统(不需要安装Linux).
一、准备工作
1.添加新硬盘
使用vmware,在正常的Linux系统中添加一块新的硬盘.启动Linux系统.
2.挂载新硬盘
使用fdisk -l 发现多出来一块硬盘,(/dev/sdb).之后使用fdisk /dev/sdb给/dev/sdb创建两个主分区,(/dev/sdb1和/dev/sdb2分别为100M和200M)并使用a改变/dev/sdb1,使其称为boot.
接下来格式化后,再将/dev/sdb1挂载在/mnt/boot/,将/dev/sdb2挂载在/mnt/sysroot/.
二、制作过程
1.做Grub
grub-install --root-directory=/mnt(此处不用详细填写,系统会自动去找) /dev/sdb
cp /boot/vmli ... /mnt/boot/
cp /boot/initrd /mnt/boot/
cd /mnt/boot
vim grub.conf
default=0
timeout=5
title LinuxPE
root(hd0,0)
kernel /vmlinuz.. ro root=/dev/sda2 rhgb quiet
initrd /initrd-2. (此处不需要手工输入,使用.! ls /mnt/boot/读取进来文件)
2.做init进程
which init查找init
cd /mnt/sysroot/
mkdir dev tmp etc proc sys lib sbin bin usr
chmod o+wt tmp
cp /sbin/init ./sbin/
ldd /sbin/init (查看init所依赖的库)
cp /lib/libsepol.so.1 /mnt/sysroot/lib
cp /lib/libselinux.so.1 /mnt/sysroot/lib
cp /lib/ libc.so.6 /mnt/sysroot/lib
cp /lib/ libl.so.2 /mnt/sysroot/lib
cp /lib/ld-linux.so.2 /mnt/sysroot/lib
(以上所依赖的库名称不需要手工输入,可以使用脚本自动处理)
3.做bash
which bash查找bash
cp /bin/bash /mnt/sysroot/bin/
ldd /bin/bash(查找bash所依赖的库)
cp /lib/libtermcap.so.2 /mnt/sysroot/lib
4.做Inittab
cd /mnt/sysroot/etc
cp /etc/inittab ./
vim inittab
只需要 id 3 default
si::....
l3 .......这几行
可以使用.,$(d)删除掉剩余的内容
5.做rc.sysinit
mkdir /mnt/sysroot/etc/rc.d
vim /mnt/sysroot/etc/rc.d/rc.sysiniit
vim /mnt/rc.d/rc.sys
#!/bin/bash:`:
/bin/bash(主要是给用户一个shell)
chmod a+x rc.sysinit
执行sync同步,并且要多次执行
6.添加一些特殊的指令(如ls)
基本上,做完以上步骤就可以使用了,但是会发现新的系统,没有一些指令.因此,可以添加一些指令,更加便于操作,限于篇幅,仅仅演示添加ls指令.
which ls(查找ls指令)
cp /bin/ls /mt/sysroot/bin/
ldd /bin/ls (查找ls指令所依赖的库)
cd /mnt/sysroot/lib/
cp /lib/librt.so.1 ./
cp /lib/libacl.so.1 ./
cp /lib/libpthread.so.0 ./
cp /lib/libattr.so.1 ./
cp /lib/libdl.so.2 ./
Sync多次执行
三、测试过程
这样,制作就已经完成了,接下来,将Linux系统关闭或者暂停(如果不这样,会影响接下来的实验).将新的系统的硬盘替换为新添加的硬盘,然后启动系统.这样,就可以进入新的系统了.
四、其它问题
通过以上步骤,会发现步骤很繁琐,而且容易出错,因此可以考虑将制作过程使用脚本来完成.
#!/bin/bash
#####How to make an Operating System###
###step1:make the grub
grub-install --root-directory=/mnt /dev/sdb &>/root/rubbish
echo "Ok!the grub has been done!"
###step2:make the kernel
cp -f /boot/initrd-2.6.18-164.e15.img /mnt/boot/
cp -f /boot/vmlinuz-2.6.18-164.e15 /mnt/boot/
#need to make the file grub.conf
touch /mnt/boot/grub/grub.conf
echo "default=0">/mnt/boot/grub/grub.conf
echo"timeout=5">>/mnt/boot/grub/grub.conf
echo"title Linux_PE">>/mnt/boot/grub/grub.conf
echo"Kernel /vmlinuz-2.6.18-164.e15 ro root=/dev/sda2 rhgb quiet ">>/mnt/boot/grub/grub.conf
echo"initrd /initrd-2.6.18-164.e15.img">>/mnt/boot/grub/grub.conf
echo"Ok!The kerel has been done!"
###step3:make the init
cd /mnt/sysroot/
mkdir dev tmp etc proc sys lib bin sbin usr &>~/rubbish
chmod o+wt tmp
##copy the init files
cp /sbin/init /mnt/sysroot/sbin/
ldd /sbin/init|cut -d= -f1 -s >/root/tempfile
while read LINE;do
cp /lib/$LINE /mnt/sysroot/lib &>~/rubbish
done
cp /lib/ld-linux.so2 /mnt/sysroot/lib
echo"Ok!the init has been done!"
###step4:make the bash
cp /bin/bash /mnt/sysroot/bin/
ldd /bin/bash |cut -d= -f1 -s >/root/tempfile
while read LINE;do
cp /lib/$LINE /mnt/sysroot/lib &>~/rubbish
done
echo "Ok!The bash has been done!"
###step5:make the inittab
touch /mnt/sysroot/etc/inittab &>~/rubbish
grep "id:3"/etc/inittab >/mnt/sysroot/etc/inittab
grep "si::"/etc/inittab >>/mnt/sysroot/etc/inittab
grep "l3:"/etc/inittab >>/mnt/sysroot/etc/inittab
echo"Ok!The initatab has been done!"
###step6:make the bash
mkdir /mnt/sysroot/etc/rc.d &>~/rubbish
touch /mnt/sysroot/etc/rc.d/rc.sysinit &>~/rubbish
ehco "#!/bin/bash">/mnt/sysroot/etc/rc.d/rc.sysinit
echo "/bin/bash">>/mnt/sysroot/etc/rc.d/rc.sysinit
chmod a+x /mnt/sysroot/etc/rc.d/rc.sysinit
##sysnc serverl times
let I=1
for I in {1..10};do
sysnc
done
echo "Ok!The bash has been done!"
###step7:make the other oder:such as ls
cp /bin/ls /mnt/sysroot/bin/
ldd /bin/ls |cut -d= -f1 -s >~/tempfile
while read LINE;do
cp /lib/$LINE /mnt/sysroot/bin/ &>~/rubbish
done
echo "alias ls=`ls --color=tty`">>/mnt/sysroot/etc/rc.d/rc.sysinit
let P=1
for P in {1..10};do
sync
done
echo "Great!Job has been finished!"