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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Toormi/article/details/47615105

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

 

本文将会利用CentOS5.5自带内核制作一个可以正常启动的Mini Linux,开始前请将准备工作完成,详见 手把手带你自制Linux系统之一 准备工作

 

准备工作做完后,还需要简单了解一下Linux的启动过程,点击此处

 

Linux的启动过程大致可分解为:

BIOS(Boot Sequence) --> MBR(GRUB) --> Kernel --> initrd --> (ROOTFS)/sbin/init(/etc/inittab)

 

接下来就围绕这个流程中提到的GRUB, kernel, initrd, /sbin/init,这4部分,用最简单、快速的办法制作一个Linux系统。

 

打开准备工作中创建的安装有CentOS系统的虚拟机,开始为虚拟机MiniLinux添加最小Linux所需要的文件系统。

 

1. 创建分区

系统中有两块硬盘,其中/dev/hda是为Mini Linux准备的磁盘,为这个磁盘创建两个主分区,大小分别为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


 
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. 创建根文件系统目录结构

 

 

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

 


 

 

8. 添加init和bash

复制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/

 

9.  编辑init配置文件


 
vi /mnt/sysroot/etc/inittab

这里我们定义系统默认启动级别为3,并且指定系统初始化时运行脚本/etc/rc.d/rc.sysinit。内容:


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

 

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

 

10. 编辑rc.sysinit文件


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

这里仅仅打印一条信息,然后启动/bin/bash程序来接收我们输入的命令,内容为:


 
#!/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

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


 
sync

12. 验证MiniLinux

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

 

首先,会看到grub选择界面

wKiom1W_YazgqAXkAAD62VcBRmM265.jpg

 

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

wKiom1W-CYmzpPRcAAJ5JOlbGLU845.jpg

 

总结

本章借助系统自带的内核、initrd等现有资源,添加了必要的配置脚本文件,制作出一个最简易、可以正常启动的linux。这种方法虽然是一个最简单、快速的方法,但是这个系统有太多不足之处。虽然可以正常启动,但是除了bash没有其他命令,甚至关机和重启这么基本的功能都没有。今后章节将会逐步对这个Mini Linux进行完善,一点一点添加应该有的功能,最终做成一个功能完备的linux,制作一个真正意义上可以使用的定制Linux。

 

附录

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

wKioL1W-C36CQaDQAAIT2zr5Tvo694.jpg

 

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

wKiom1W-CYmxcUkpAAKUnJWyr38889.jpg

wKioL1W-C36QfQ1_AACz08vog5g123.jpg


 

展开阅读全文

没有更多推荐了,返回首页