linux 最小主机,以一个宿主机手动制作一个精简的小linux

先了解一下开机启动流程

POST-MBR:bootloader-kernel(initrd)-(rootfs|/sbin/init(/etc/rc.d/rc.sysinit(bash))

具体可以描述为:

加电自检-逐一查看启动序列中的启动设备,找到MRB加载启动引导程序-加载内核-initrd(提供可以驱动根分区的驱动程序给内核)-启动init进程(读取/etc/inittab)-执

行/etc/rc.local-mingetty 登录

具体的启动流程还是这样的不能更改,我们能做的就是精简文件系统。

首先我们在虚拟机上面加一块磁盘,制作好之后把这块磁盘移植到其他的linux主机上面让他启动就可以了。

我们新加一块磁盘/dev/sdb,划分两个分区一个100M(/dev/sdb1)用来挂载在boot目录上面,一个给他1G(/dev/sdb2),来装文件系统。

我们在/mnt目录下面建两个目录一个/mnt/boot,一个/mnt/sysroot

1.我们先在/mnt/boot上面装一个GRUB,把内核放进去。

1)grub-install --root-directory=/mnt /dev/sdb 这里指定为boot的父目录这里为/mnt就可以了,这时候这个硬盘就可以做来引导系统了

cp /boot/vmlinuz-2.6.18-164.el5 /mnt/boot

cp /boot/initrd-2.6.18-164.el5.img /tmp/linux

2)我们把initrd-2.6.18-164.el5.img展开,里面修改一下,先来看一个这个文件的类型

file initrd-2.6.18-164.el5.imginitrd-2.6.18-164.el5.img: gzip compressed data

这里显示是一个gzip的压缩文件,那我们就用gzip来解压缩一下

gzip -d initrd-2.6.18-164.el5.imggzip: initrd-2.6.18-164.el5.img: unknown suffix -- ignored

报错了,因为这个文件不是以.gz结尾的,那这好办,我们给他加一个.gz就好了嘛

mv initrd-2.6.18-164.el5.img initrd-2.6.18-164.el5.img.gz

再解压缩

gzip -d initrd-2.6.18-164.el5.img.gz好了,这是一个cpio的归档文件,我们把它释放出来

cpio -id

rm -rf initrd-2.6.18-164.el5.img

这里面init是一个脚本我们打开修改一些东西

把这个mkrootdev -t ext3 -o defaults,ro /dev/vol0/root

修改为:

mkrootdev -t ext3 -o defaults,ro /dev/sda2 这里是我们的根的位置,等下我们这块磁盘要挂载在一个新的linux虚拟机上面,到时候就是sda了,所以这里指定为sda2,

好了再把文件还原了

find .|cpio -H newc -o --quiet |gzip -9 >/mnt/boot/initrd.gz3)然后我们创建一个grub的配置文件

vi grub.confdefault=0

timeout=10

title Little Linux

root (hd0,0)

kernel /vmlinuz-2.6.18-164.el5 ro root=/dev/sda2

initrd /initrd.gz

2.在/mnt/sysroot下面创建我们的文件系统

1)mkdir boot proc sys dev home root etc/{rc.d,sysconfig/network,init.d} bin sbin lib usr/{bin,sbin,lib,include} var/{log,run} tmp mnt opt media -pv作为系统我们当然需要一些命令了,这时候我们把响应的命令复制过来

2)which ls

cp /bin/ls /mnt/sysroot/bin复制到对应的目录下面来

ldd /bin/lslinux-gate.so.1 =>  (0x00f40000)

librt.so.1 => /lib/librt.so.1 (0x00746000)

libacl.so.1 => /lib/libacl.so.1 (0x00751000)

libselinux.so.1 => /lib/libselinux.so.1 (0x00c4e000)

libc.so.6 => /lib/libc.so.6 (0x005b6000)

libpthread.so.0 => /lib/libpthread.so.0 (0x0072d000)

/lib/ld-linux.so.2 (0x00593000)

libattr.so.1 => /lib/libattr.so.1 (0x00d03000)

libdl.so.2 => /lib/libdl.so.2 (0x006fe000)

libsepol.so.1 => /lib/libsepol.so.1 (0x00c68000)

ls这个命令的执行依赖这些个库文件,我们把库文件复制过来,第一个linux-gate是库的入口,实际不需要这个文件,一次拷贝下面的文件到/mnt/sysroot/lib目录下面

cp /lib/librt.so.1 /mnt/sysroot/lib .....下面的不再重复浪费版面了

接下来就是需要什么命令我们就复制什么命令过来就是了

cp /bin/bash /mnt/sysroot/bin

cp /bin/init /mnt/sysroot/bin切换一下目录我们来试一下

chroot /mnt/sysroot 执行一下复制过来的命令试试?

3)我们在/mnt/sysroot/etc下面创建inittab文件

vi /mnt/sysroot/etc/inittabid:3:initdefault:

si::sysinit:/etc/rc.d/rc.sysinit 可以了执行最简单的功能就行了

vi /mnt/sysroot/etc/rc.d/rc.sysinitecho -e "Welcome to \033[32m Little \033[0m Linux"

[ -f /etc/sysconfig/network ] && source /etc/sysconfig/network 这里主要是让我们创建的linux有个主机名

[ -z $HOSTNAME ] && HOSTNAME=localhost

echo $HOSENAME > /proc/sys/kernel/hostname

mount -n -o remount,rw /           这里是让我们创建的系统有读写权限,当然前提是要把mount命令复制进来

mount -n -a

/bin/bash

inittab和rc.sysinit是系统启动必备的脚本,我们这里一定要创建一下

vi /mnt/sysroot/etc/sysconfig/networkHOSTNAME=Little.Linux.org

vi /mnt/sysroot/etc/fstab/dev/sda1 / ext3 defaults 0 0

/dev/sda2 /boot ext3 defaults 0 0

/proc  /proc proc defaults 0 0

/sysfs  /sys sysfs defaults 0 0

vi /mnt/sysroot/etc/mtab这个文件是空的就可以了,但是不能没有,要不我们的rc.sysinit文件中mount命令会出点问题

好了最后我们新建一个虚拟机,直接使用这块硬盘启动就可以了,试试看你得linux能启动吗?再执行几个命令看看!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值