手把手带你自制Linux系统之二 简易Linux的制作


本文利用CentOS5.5自带内核制作一个可以正常启动的Mini Linux。


打开上一篇准备工作中创建的CentOS虚拟机,为另一台虚拟机MiniLinux添加最小Linux所需要的文件系统。


1. 创建分区

为准备好的Minilinux磁盘创建两个主分区,大小分别为20M和512M。

使用fdisk命令创建分区详细过程:

fdisk /dev/hda

创建第一个20M分区依次输入:

n --> p --> 1 --> <Enter> --> +20M

这几个输入代表的意思分别为:

n: add a new partition

p: primary partition

1: Partition number (1-4)

<Enter>: Enter键,选择起始柱面,First cylinder (1-44384, default 1)

+20M: 选择结柱面,可以是使用+size表示希望创建的磁盘大小,Last cylinder or +size or +sizeM or +sizeK (1-44384, default 44384): 


创建第二个512M分区依次输入:

n --> p --> 2 --> <Enter> --> +512M

保存分区表退出

w

w: write table to disk and exit


保存后,让操作系统重新读取分区表

partprobe /dev/hda

2. 格式化分区

格式化两个分区为etx3格式

mke2fs -j /dev/hda1
mke2fs -j /dev/hda2

3. 挂载分区

/mnt下创建两个目录,分别用来挂载/dev/hda1/和/dev/hda2/

mkdir /mnt/{boot,sysroot}
mount /dev/hda1 /mnt/boot/
mount /dev/hda2 /mnt/sysroot/

4. 添加Linux内核文件

拷贝/boot/目录下CentOS自带内核

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

5. 添加initrd文件

拷贝/boot/目录下initrd文件

cp /boot/initrd-2.6.18-194.el5.img /mnt/boot/initrd.img

6. 安装grub

使用grub-install 命令安装

grub-install --root-directory=/mnt /dev/hda

编辑grub配置文件

vi /mnt/boot/grub/grub.conf

内容为:

default=0
timeout=5
title MiniLinux (2.6.18-194.el5)
        root (hd0,0)
        kernel /vmlinuz root=/dev/hda2
        initrd /initrd.img

7. 添加init和bash

创建根文件系统目录结构

cd /mnt/sysroot
mkdir proc dev lib bin sbin home root etc/rc.d usr/{lib,bin,sbin} var/{log,run,lock} tmp mnt sys -pv

复制init和bash

cp /sbin/init /mnt/sysroot/sbin/
cp /bin/bash /mnt/sysroot/bin/

查看init依赖的库文件

[root@localhost sysroot]# ldd /sbin/init 
 linux-gate.so.1 =>  (0x00d7d000)
 libsepol.so.1 => /lib/libsepol.so.1 (0x00531000)
 libselinux.so.1 => /lib/libselinux.so.1 (0x00579000)
 libc.so.6 => /lib/libc.so.6 (0x00380000)
 libdl.so.2 => /lib/libdl.so.2 (0x004c8000)
 /lib/ld-linux.so.2 (0x0035d000)

复制这几个依赖的库文件

cp /lib/libsepol.so.1 lib/
cp /lib/libselinux.so.1 lib/
cp /lib/libc.so.6 lib/
cp /lib/libdl.so.2 lib/
cp /lib/ld-linux.so.2 lib/

查看bash依赖的库文件

[root@localhost sysroot]# ldd /bin/bash 
 linux-gate.so.1 =>  (0x0071d000)
 libtermcap.so.2 => /lib/libtermcap.so.2 (0x033a8000)
 libdl.so.2 => /lib/libdl.so.2 (0x004c8000)
 libc.so.6 => /lib/libc.so.6 (0x00380000)
 /lib/ld-linux.so.2 (0x0035d000)

复制这几个依赖的库文件

cp /lib/libtermcap.so.2 lib/
cp /lib/libdl.so.2 lib/
cp /lib/libc.so.6 lib/
cp /lib/ld-linux.so.2 lib/

使用chroot测试一下,如果可以正常切换,出现bash提示符,说明上面的步骤没有问题

chroot /mnt/sysroot/

8.  编辑init配置文件

vi /mnt/sysroot/etc/inittab

添加内容:

id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit

定义系统默认启动级别为3,系统初始化时运行/etc/rc.d/rc.sysinit。

inittab文件格式可以man 5 inittab查看,也可以参考这里


9. 编辑rc.sysinit文件

vi /mnt/sysroot/etc/rc.d/rc.sysinit

内容为:

#!/bin/bash
#
echo -e "\t Welcome to \033[31mMy MiniLinux\033[0m."
/bin/bash

为rc.sysinit添加可执行权限

chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit

10. 同步对文件系统的修改到磁盘

sync

11. 验证MiniLinux

将正在使用的CentOS虚拟机挂起,打开虚拟机中的MiniLinux。


首先,会看到grub选择界面

wKiom1W_YazgqAXkAAD62VcBRmM265.jpg


系统启动后会运行bash,进入bash命令提示符后,说明系统可以正常启动

wKiom1W-CYmzpPRcAAJ5JOlbGLU845.jpg


总结

至此,一个可以正常启动的linux就算完成了。但是这个系统除了bash没有其他命令,甚至连关机和重启命令都没有。今后将会逐步对这个mini linux进行完善,添加上你想要的功能,最终定制一个你需要的linux。


附录

如果开启MiniLinux后提示启动失败,如图所示

wKioL1W-C36CQaDQAAIT2zr5Tvo694.jpg


那么就检查一下MiniLinux虚拟机的硬盘是否连接在 IDE 0:0节点

wKiom1W-CYmxcUkpAAKUnJWyr38889.jpg

wKioL1W-C36QfQ1_AACz08vog5g123.jpg




修改:

        为了进一步降低难度,将第5步添加initrd文件做了修改,不再对initrd文件展开做修改,而是直接利用CentOS自带initrd文件,对initrd文件的展开在后面用到。


        直接使用initrd文件的话,需要在第6步grub配置文件中指定kernel时添加内核参数,指明root位置,第6步已做相应修改。


原第5步如下:


5. 添加initrd文件

利用/boot/目录下initrd文件,制作自己的initrd


initrd文件是一个gzip压缩的cpio归档文件,完全解压需要分别使用gzip和cpio命令,经过两步得到最终文件。

gzip和cpio命令的使用点击此处


首先,使用file命令查看/boot/initrd-2.6.18-194.el5.img文件:

[root@localhost~]# file /boot/initrd-2.6.18-194.el5.img 
/boot/initrd-2.6.18-164.el5.img: gzip compressed data, from Unix, last modified: Thu Jul 23 18:46:14 2015, max compression


使用gzip解压initrd-2.6.18-194.el5.img文件,得到initrd-2.6.18-194.el5.img

cp /boot/initrd-2.6.18-194.el5.img /boot/initrd-2.6.18-194.el5.img.gz
gzip -d initrd-2.6.18-194.el5.img.gz


然后,gzip解压得到的initrd-2.6.18-194.el5.img文件是一个cpio归档文件,使用file查看:

[root@localhost~]# file initrd-2.6.18-194.el5.img 
initrd-2.6.18-194.el5.img: ASCII cpio archive (SVR4 with no CRC)


使用cpio解归档

cd /root
mkdir tmp
cd tmp
cpio -id < ../initrd-2.6.18-164.el5.img


上面两步可以合并为一步,一步到位压缩得到文件 

cp /boot/initrd-2.6.18-194.el5.img /boot/initrd-2.6.18-194.el5.img.gz
cd /root
mkdir tmp
cd tmp
zcat /root/initrd-2.6.18-194.el5.img.gz | cpio -id


编辑initrd中的init文件

vi init

将其中的

mkrootdev -t ext3 -o defaults,ro /dev/VolGroup00/LogVol00

修改为

mkrootdev -t ext3 -o defaults,ro /dev/hda2

将/root/tmp下所有文件打包压缩,放在/mnt/boot/下

find . | cpio -H newc  --quiet -o | gzip -9 > /mnt/boot/initrd.gz



原第6步 grub.conf文件内容

default=0
timeout=5
title MiniLinux (2.6.18-194.el5)
        root (hd0,0)
        kernel /vmlinuz
        initrd /initrd.gz