最简单的构建自己的Linux (LFS)
根据Linux的启动过程分解我们可以更明确的了解整个系统的工作,从而也可以利用现有的系统构建个自己的Linux,命令集可以定做,使的Linux更专一,更小巧。
Linux的启动过程分解
加电自检-->BIOS-->MBR(grub引导)-->kernel-->init(/etc/inittab)-->rc.sysinit(/etc/rc.d/rc.sysinit)-->shell
下面就在虚拟机中一步一步的构建我们自己的Linux了。。
一、为磁盘分区并格式化
在虚拟机中新建一块磁盘(不小于200M)(磁盘一定是一个 single file)
将磁盘挂载到当前的主机(宿主机),然后启动系统
#fdisk -l 可查看刚挂载的磁盘/dev/sdb(如果主机中只有一块硬盘设备则为/dev/sda,那么添加的这块新磁盘就是/dev/sdb)
保险起见先将磁盘的MBR段充零
#dd if=/dev/zero of=/dev/sdb bs=512 count=1
为磁盘创建一个100M大小的boot分区和512M大小的根分区
#echo '
n
p
1
+100M
w '|fdisk /dev/sdb
#echo '
n
p
2
+512M
w '|fdisk /dev/sdb
#partprob /dev/sdb ##通知内核重新加载磁盘
将这两个分区格式化为ext3格式
mkfs -t ext3 /dev/sdb1
mkfs -t ext3 /dev/sdb2
#partprob /dev/sdb
二、为磁盘为分区设置挂载点并安装grub
#mkdir /mnt/{boot,sysroot}
#mount /dev/sdb1 /mnt/boot
#mount /dev/sdb2 /mnt/sysroot
#grub-install --root-directory=/mnt /dev/sdb
#cd /mnt/boot/grub
其实为磁盘安装grub的方法还有一种 这里也介绍给大家了
#cp /usr/share/grub/i386-rathat/* /mnt/boot/grub
#umount /dev/sdb1
#grub
grub>root (hd1,0)
grub>setup (hd1)
grub>quit ##退出
#mount /dev/sdb1 /mnt/boot
#cd /mnt/boot
##这两种方法都可以,只使用其一即可
三、将内核文件和initrd文件cp到磁盘中,并编写grub.conf配置文件
#uname -a ##查看当前系统的版本
#ll /boot
#cp /boot/vmlinuz-2.6.18-164.el5 /mnt/boot/Mylinux ##将相应的内核cp到/mnt/boot中
#mkdir /tmp/linux
#cd !$
#zcat /boot/initrd-2.6.18-164.el5.img|cpio -id
# vim init
找到/dev/vol0/root 换成/dev/sda2
# find . | cpio -o -H newc --quiet | gzip -9 > /mnt/boot/initrd.gz
cd /mnt/boot/grub
#vim grub.conf
default=0
timeout=5
title Mylinux
root (hd0,0)
kernel /Mylinux ro root=/dev/sda2
initrd /initrd.gz
##保存退出
四、提供根文件系统
# cd /mnt/sysroot
# mkdir -pv ./{etc/rc.d,bin,sbin,usr,proc,sys,var,tmp,lib,mnt,media ,misc,opt,dev} ##这些目录都要添加虽然有些是空目录,
如果想投机少添加了,rc.sysinit文件会找不到相应目录,初始化僵死
#cp /sbin/init sbin/
#cp /bin/bash bin/
分别复制上述两个可执行文件依赖的库文件:
# ldd /sbin/init
# cp /lib/列出的库文件 lib/
五、提供配置文件
#vim /etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
##保存退出
#vim /etc/rc.d/rc.sysinit
#!/bin/bash
echo "Welcome to Mylinux!!!!!!"
/bin/bash
##保存退出
#chmod +x etc/rc.d/rc/sysinit
上面五步完整的做完一次后 ,将宿主机挂起,新建个虚拟机,并用刚才新建的磁盘做系统盘,系统启动后会出现一堆信息 最后显示的应该是:
Welcome to Mylinux!!!!!!
bash-3.2#
因为命令没有cp到系统中,有很多命令都无法实现,不过pwd,cd 这些内置命令还是可以使用,如果你想实现ls touch等命令时重新开启宿主机,将ls
命令cp到磁盘的相应目录中
[root@localhost ~]# which ls
alias ls='ls --color=tty'
/bin/ls
cd /mnt/sysroot
[root@localhost ~]#cp /bin/ls bin/
[root@localhost ~]# ldd /bin/ls
linux-gate.so.1 => (0x0044b000) (因为第一行为空 所以此行不用cp)
librt.so.1 => /lib/librt.so.1 (0x00d54000)
libacl.so.1 => /lib/libacl.so.1 (0x00b00000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00986000)
libc.so.6 => /lib/libc.so.6 (0x00110000)
libpthread.so.0 => /lib/libpthread.so.0 (0x002aa000)
/lib/ld-linux.so.2 (0x00cd1000)
libattr.so.1 => /lib/libattr.so.1 (0x00267000)
libdl.so.2 => /lib/libdl.so.2 (0x00848000)
libsepol.so.1 => /lib/libsepol.so.1 (0x00e63000)
依次将>后的文件cp到/lib中
touch也是如此
简单构建个人Linux到此就算结束了,其实还有很多步骤都省略,算是投机取巧了,不过它可是个实实在在的Linux哦。。。。