这篇文章我觉得对于理解initrd文件系统,以及作为最基础的系统构建有一定的帮助
摘要:X86、LiveCD、LiveUSB
由于工作需要,最近花了点时间真正研究了一下如何纯手工制作一个Linux系统。虽然以前也曾用gentoo、lfs等成功制作过Linux系统,但那都是看着别人的教程一步步完成的,虽然成功了,但自己总觉得东西还是别人的,没有真正变成自己的知识。其次,像gentoo与lfs都是教你如何制作一个通用的Linux操作系统,此系统过于庞大,对于一个专用系统来说,不需要如此庞大的系统,特别是要求系统要完全运行于内存中时,更不能过于庞大。鉴于此,通过手工完全制作一个Linux系统是唯一的方法。好比在ARM、MIPS、POWERPC等平台下的嵌入式Linux一样。现在我需要做的是一个类似的,X86小型专用化的Linux。
早就想做一个这样的系统,但网上一直没有找到合适的教程,所以我也没有方向,也就没有动手做。但今天到了必需要用的时候了,我只能硬着头皮上,从零开始,自己制作。但也不是完全的没有参考,在网上找到些资料,关于用busybos做LiveCD与认识initramfs的文章都写的非常好,谢谢这些辈们的积累。在这里,我把这篇文章献给跟我面对同样问题的朋友和想对Linux操作有更深入了解的朋友。
这里我们来点知识预习,以下内容部分来自于网络。
1 认识ramfs、initramfs、ramdisk
讲到内存Linux系统,那就离不开ramfs、initramfs、ramdisk,为了选择更好的方式,我们首先来认识这三种文件系统的不同与相同之处。
1.1了解ramfs
ramfs直接利用了内核的磁盘高速缓存机制。所有的文件的读写数据都会在内存中做高速缓存(cache),当系统再次使用文件数据时,可以直接从内存中读写,以提供系统的I/O性能。高速缓存中的写入数据会在适当的时候回写到对应的文件系统设备(如磁盘等)中,这时它的状态就标识为clean,这样系统在必要时可以释放掉这些内存。ramfs没有对应文件系统设备,所以它的数据永远都不会回写回去,也就不会标识为clean,因此系统也永远不会释放ramfs所占用的内存。
1.2 了解initramfs
Initramfs是ramfs的一种,在2.6版本之后的linux内核中,都包含一个压缩过的cpio格式的打包文件。当内核启动时,会从这个打包文件中导出文件到内核的rootfs文件系统,然后内核检查rootfs中是否包含有init文件,如果有则执行它,作为PID为1的第一个进程。这个init进程负责启动系统后续的工作,包括定位、挂载“真正的”根文件系统设备(如果有的话)。如果内核没有在rootfs中找到init文件,则内核会按以前版本的方式定位、挂载根分区,然后执行/sbin/init程序完成系统的后续初始化工作。
这个压缩过的cpio格式的打包文件就是init ramfs。编译2.6版本的linux内核时,编译系统总会创建init ramfs,然后把它与编译好的内核连接在一起。内核源代码树中的usr目录就是专门用于构建内核中的init ramfs的,其中的ini tramfs_data.cpio.gz文件就是init ramfs。缺省情况下,init ramfs是空的,X86架构下的文件大小是134个字节。
1.3 了解ramdisk
RamDisk也就是内存盘的意思。所谓的RAM驱动器是在一块内存区域中创建的块设备,用于存放文件系统。ramdisk的容量是创建的时候就固定的。ramdisk需要内核的文件系统驱动程序(如ext2)来操作其上的数据。对于操作系统来讲内存的存取速度远远大于机械磁盘,所以RAM驱动器肯定要比机械的硬盘快得多。你可以把整个应用程序都安装在RamDisk的驱动器中,然后用内存的速度运行它。
2 了解Linux操作系统够成
简单地说,Linux是一套免费使用和自由传播的类Unix操作系统,这个系统是由世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。
平常我们所说的Linux系统只是指的系统的内核,用内核代表了整个Linux操作系统,严格的来说,所有能供计算机使用的Linux操作系统应该叫GNU/Linux。这是为什么呢?因为操作系统软主要分为三大块(启动引导器、内核、根文件系统),缺少任何一块都是无法正常使用的。而这每一部分所使用的软件,都是世界上无数开源爱好者们花了无数心血开发出来的。
2.1 什么是启动引导器
所谓启动引导器是指计算机加电后,完成了CMOS自检,然后运行的第一个程序。此程序是保存在磁盘等物理介质的MBR上。该程序用来引导真正的操作系统的启动。比如现在最常使用的grub、lilo、uboot、syslinux等都是启动引导器。
2.2 内核
每一个操作系统必有一个内核,平常所说的Linux严格的是指内核,现在最新版本的内核已经发展到2.6.31了,相信大家对Linux内核应该很熟悉了,不熟悉的话,可以看看相关书,在这里我就不多说了。
2.3 根文件系统
根文件系统顾名思义就是Linux操作系统的根,若要运行一个Linux操作系统,除了需要内核以外,还需要另外一个重要的部分——根文件系统。根文件系统是一个存放系统运行时必需文件(例如系统配置文件、设备文件、应用程序等)和存储数据文件的外部设备。系统引导完成后,就会启动根文件系统里存放的用户态程序(如init是内核启动完成后运行的第一个用户态程序),接着把操作权交给用户态,来满足用户的各种应用。
根文件系统可以在磁盘上,也可以在内存里运行。
3 开始手工制作Linux操作系统
我们将分以下几步来讲解此小巧的内存Linux操作系统的制作:
1)完全在内存中运行的小型Linux系统,根文件系统存放在硬盘里,运行在内存。
2)光盘启动的Linux操作系统,俗称LiveCD,根文件系统及内核存于光盘,运行在内存。
3)USB启动的Linux操作系统,根文件系统及内核存于U盘,运行在内存。
3.1 启动引导器
在这里,我们在一台已经安装好GRUB启动引导器的PC机上做实验,稍后章节我将继续讲解如何使用及安装其它引导器来引导Linux内核。如做LiveCD用isolinux来引导,做USBLinux就用syslinux和extlinux来引导(这两个引导器的区别稍后再讲)。
注:在完成后续内容前需要有GRUB的使用基础,若GRUB的基本使用都还没有熟悉的话,我建议先熟悉Linux基础知识,然后再学习手动制作Linux,最好要有成功完过LFS的经验,朋友,学习东西不要心急,万丈高楼平地起啊…万事都是先易后难。
若有一定基础,并且又对Linux手动制作不熟悉的话,请往后看,接着我将为你解开Linux系统制作的神秘面纱。
3.2 磁盘准备
预做Linux系统,最好独立一个磁盘分区用来存放制作的东西。这仅仅是个建议,比较熟悉的朋友,可以不需要这个独立分区。但新手我还是建议搞个独立分区较合适。
先使用fdisk来分一个可用的分区,大小要求不高,4GB的空间足够了。
[root@localhost ~]# fdisk –l
如上图示,我在这里采用/dev/sdb6作为我的新系统的工作区。我用的是vmware虚拟机平台,宿主机操作系统是Debian502,在该虚拟机下,我添加了两块虚拟磁盘,一块sdb专门用来做系统制作之用。
格式化分区,以下命令将sdb6分区格式成ext3文件系统:
[root@localhost ~]# mke2fs -j /dev/sdb6
挂载分区:
[root@localhost ~]# cd /mnt/
[root@localhost mnt]# mkdir sdab6
[root@localhost mnt]# mount -vt ext3 /dev/sdb6 sdb6
/dev/sdb6 on /mnt/sdb6 type ext3 (rw)
[root@localhost mnt]# cd sdab6
好了,到目前为止,前期准备工作已经完成,下面将正式进入主题。我们进入第一步:运行于磁盘的小型Linux系统。
3.3 从磁盘启动的小型内存Linux系统
在本文中我主要讲解采用ramdisk的根文件系统方式来举例讲解制作小型内存系统。
1.3.1 建立ramdisk镜像文件
命令
[root@localhost sdb6]# dd if=/dev/zero of=initrd.img bs=1M count=96
此命令用来创建大小为96M的镜像文件。
关于dd命令的用法,请查阅相关手册,Linux的dd命令提供了强大的文件、磁盘备份等功能,当然不仅限于此。
我所建立的initrd.img文件相当于一个块设备的镜像文件,我们可以对它进行格式化,建立文件系统,像操作磁盘一样操作它。
3.3.2 格式化此镜像文件
[root@localhost sdb6]# mke2fs -F initrd.img
上述命令是将在此文件中创建ext2文件系统。
准备挂载该文件系统像像
[root@localhost sdb6]# mkdir initrd boot
[root@localhost sdb6]# mount -o loop initrd.img initrd
[root@localhost sdb6]# cd initrd/
[root@localhost initrd]# ls
lost+found
我们看到,已经成功挂载了此文件系统镜像。
3.3.3 建立根文件系统目录树
Linux根文件系统目录树有一个标准,在此我就不按标准建立了,因为我要做的Linux操作系统是一个小型化的X86嵌入式Linux系统,精简了多余对目录,感兴趣的朋友可以去网上找相关Linux根文件系统的目录树标准的文档来阅读。
[root@localhost initrd]# mkdir -pv bin dev etc home mnt proc root sbin sys tmp
[root@localhost initrd]# mkdir -pv lib/modules usr/{lib,bin,sbin} var boot
[root@localhost initrd]# ls
bin dev etc home lib mnt proc root sbin sys tmp usr var boot
在此就不再讲解目录树各目录的含义了,有兴趣的朋友可以在网上查,资料很多。
3.3.4 Linux内核准备
我在这里是使用的Linux-2.6.24版本的内核,可以在http://www.kernel.org上下载此内核的源代码。
进行内核树目录:
[root@localhost ~]# cd /usr/src/linux-source-2.6.24/
先进行一下清理
[root@localhost linux-source-2.6.24]# make clean
配置内核
[root@localhost linux-source-2.6.24]# make menuconfig
按照你的需要,进行内核的配置,在此我就不多说,关于Linux配置方面的知识,可以写成一大本书罗。在此我只强调一点,磁盘支持(根文件系统运行于硬盘的时候需要此选项的支持,在内存中运行不需要)与文件系统(如ext2、ext3、jfs等)支持最好配置成编译成内核。这样在后面的步骤中才不会碰到麻烦。
注:在此需要的基础知识是对Linux内核的编译与裁剪要较熟悉,否则可能会碰到很多想不到的问题。
配置完成后,即开始编译:
[root@localhost linux-source-2.6.24]# make
2.6内核编译比较简单,只需要输入make就可以自动完成所有编译工作。
一个漫长的等待啊….机器性能强点的及配置选择少的,可能编译的会快很多,否则需要一个多小时时间来编译。休息一会儿!
好了,内核终于编译完了,复制必需的文件到我们的目标文件系统中。
[root@localhost linux-source-2.6.24]# mkdir ../modules_tmp
[root@localhost linux-source-2.6.24]# make INSTALL_MOD_PATH=/usr/src/modules_tmp/ modules_install
[root@localhost linux-source-2.6.24]# cd ../modules_tmp/
[root@localhost modules_tmp]# cd lib/modules/
我的内核小版本定的是MiniLinux-12。
复制内核模块到指定目录
[root@localhost modules]# cp -Rfva 2.6.24-MiniLinux-12 /mnt/sdb6/initrd/lib/modules/
进入到内核目录树,复制内核镜像文件到指定目录
[root@localhost linux-source-2.6.24]# cp -v arch/x86/boot/bzImage /mnt/sdb6/boot/
好了,到此为止,内核已经准备好了,接下来需要做根文件系统了。
3.3.5 根文件系统制作
因为是制作小型化的Linux系统,所以在此,我采用busybox来制作根文件系统。因为它非常的小巧。
3.3.5.1 什么是busybox
busybox号称是嵌入式Linux中的瑞士军刀——小巧、功能齐全。它把许多常用的Linux命令都集成到一个单一的可执行程序中,只用这一个可执行程序(即busybox)加上Linux内核就可以构建一个基本的Linux系统。busybox程序非常小巧,包含全部命令可执行文件大小也只有几百K。busybox是完全模块化的,可以很容易地在编译时增加、删除其中包含的命令。
由于busybox的这些特点,它广泛应用于LiveCD、应急修复盘、安装盘等系统中。我们也是以它为基础,小型X86嵌入式Linux系统。
busybox的官方最新稳定版本是1.15.2,基于我的习惯,我一般不会采用最新版本的来使用。所以我选择1.15.1版本。
从官方网站上http://www.busybox.net/可以下载busybox-1.15.1.tar.bz2文件。
3.3.5.2 编译busybox
解压软件包
[root@localhost build]# tar -xjvf ../source/busybox-1.15.1.tar.bz2
[root@localhost build]# cd busybox-1.15.1/
[root@localhost busybox-1.15.1]# make menuconfig
配置安装目录:
Busybox Settings --->
Installation Options --->
[*] Don't use /usr
选中此选项。
(./_install) BusyBox installation prefix
此选项说明安装的目录。
其它的配置安你的个人需要而定,但一定要选择init及shell的支持,其实用默认配置完全可以。
配置完成之后即开始编译:
[root@localhost busybox-1.15.1]# make
大概几分钟后就可以编译完成,我个人是比较佩服busybox的作者的,他为我们提供了一个这么好的东西,真是太好了。
编译完成之后,即可以安装了,这个安装只是一个虚拟安装,会安装在当前目录下的_install目录里,你只需要把这里面的文件复制到你需要的地方即可。
[root@localhost busybox-1.15.1]# make install
[root@localhost busybox-1.15.1]# cd _install
看看,它的东西真是少,也非常的小巧,仅占660K的空间。
复制所需要的文件
[root@localhost _install]# cp -Rfva bin/* /mnt/sdb6/initrd/bin/
[root@localhost _install]# cp -Rfva sbin/* /mnt/sdb6/initrd/sbin/
[root@localhost _install]# cd /mnt/sdb6/initrd/bin
查看busybox需要的动态链接库
[root@localhost bin]# ldd busybox
linux-gate.so.1 => (0xffffe000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7f55000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7dfa000)
/lib/ld-linux.so.2 (0xb7f82000)
通过此命令可以看到,busybox需要以上几个库libm.so.6、libc.so.6、ld-linux.so.2
复制此库文件到指定目录
[root@localhost bin]# cp -v /lib/libm.so.6 ../lib/
[root@localhost bin]# cp -v /lib/libc.so.6 ../lib/
[root@localhost bin]# cp -v /lib/ld-linux.so.2 ../lib/
[root@localhost bin]# cd ..
3.3.5.3 必要/etc目录文件配置
在根文件系统里的/etc目录是有几个文件是必不可少的:
fstab、mtab、passwd、shadow、group、hostname、inittab、passwd、profile
有些文件可以借用宿主机的
[root@localhost initrd]# cd etc
[root@localhost etc]# cp -v /etc/passwd* .
[root@localhost etc]# cp -v /etc/group* .
[root@localhost etc]# cp -v /etc/shadow* .
创建fstab文件
[root@localhost etc]# vi fstab
在此文件中写入如下内容:
proc /proc proc defaults 0 0
devfs /dev tmpfs defaults,size=512K 0 0
sysfs /sys sysfs defaults,size=1M 0 0
写入完成后,保存并退出。
创建profile文件
[root@localhost etc]# vi profile
写入以下内容:
if [ "`id -u`" -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
PATH="/usr/local/bin:/usr/bin:/bin"
fi
u=`whoami`
if [ "$PS1" ]; then
if [ "$BASH" ]; then
PS1='[$u@\h \W]\$ '
else
if [ "`id -u`" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi
export PATH
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'
umask 022
创建hostname文件
[root@localhost etc]# touch hostname
[root@localhost etc]# echo “localhost” > hostname
创建重要文件:启动脚本inittab
Linux内核的初始化完成之后,运行的用户态第一个程序就是/sbin/init,而init程序即会按照/etc/inittab的配置来依次执行。以下我会创建此文件,并对此文件进行简单讲解。
[root@localhost etc]# vi inittab
写入如下内容:
::sysinit:/etc/init.d/rcS #指定系统初始化脚本
tty1::respawn:/sbin/getty 38400 tty1 #激活终tty1登录,采用getty方式
tty2::respawn:/sbin/getty 38400 tty2 #激活终tty2登录
::ctrlaltdel:/bin/umount -a –r #按下Ctrl+Shift+Del键发生的动作
busybox的inittab文件格式说明:
要写自己的inittab,需要理解busybox的inittab文件格式。
busybox的inittab文件与通常的inittab不同,它没有runlevel的概念,语句功能上也有限制。inittab语句的标准格式是
:::
各字段的含义如下
:
id字段与通常的inittab中的含义不同,它代表的是这个语句中process执行所在的tty设备,内容就是/dev目录中tty设备的文件名。由于是运行process的tty设备的文件名,所以也不能象通常的inittab那样要求每条语句id的值唯一。
:
busybox不支持runlevel,所以此字段完全被忽略。
:
为下列这些值之一:
sysinit, respawn, askfirst, wait,once, restart, ctrlaltdel, shutdown
其含义与通常的inittab的定义相同。特别提一下askfirst,它的含义与respawn相同,只是在运行process前,会打出一句话“please press Enter to active this console”,然后等用户在终端上敲入回车键后才运行process。
:
指定要运行的process的命令行。
创建重要文件:启动脚本rcS
[root@localhost etc]# mkdir init.d/
[root@localhost etc]# cd init.d/
[root@localhost init.d]# vi rcS
写入以下几行:
#! /bin/sh
/bin/mount -a #按照/etc/fstab的配置来挂载文件系统
/sbin/mdev -s #建立设备文件,以后会讲采用udev来进行设备创建及管理
/bin/hostname -F /etc/hostname #获取主机名
文件创建完毕后别忘了对rcS加上可执行文件的权限。
[root@localhost init.d]# chmod 755 rcS
OK,到目前为止,/etc目录的主要文件配置完成。是不是很简单?
接着要创建必需的几个设备文件了。
3.3.5.4 创建必要设备文件
我们可以通过从宿主机复制几个重要设备文件。
[root@localhost etc]# cd ../dev/
[root@localhost dev]# cp -Rfva /dev/null .
[root@localhost dev]# cp -Rfva /dev/console .
[root@localhost dev]# cp -Rfva /dev/zero .
[root@localhost dev]# cp -Rfva /dev/ram{0..5} .
好了,到此为止,基本上万事具备,只欠东风了。但测试之前,还需要做一件事情,我们更换busybox里的shell程序,busybox里的shell功能太少了。在此,我们采用bash
3.3.5.5 bash的统计安装
从http://www.gnu.org/software/bash/ 这个网站上下载源码包,
http://ftp.gnu.org/gnu/bash/bash-3.2.48.tar.gz
解压编译:
[root@localhost bash-3.2.48]# ./configure --prefix=/tmp/bash
[root@localhost bash-3.2.48]# make
[root@localhost bash-3.2.48]# make install
[root@localhost bash-3.2.48]# cd /tmp/bash/bin
[root@localhost bash]# rm -rf /mnt/sdb6/initrd/bin/bash
[root@localhost bash]# cp -v bash /mnt/sdb6/initrd/bin/
[root@localhost bash]# cd /mnt/sdb6/initrd/bin/
[root@localhost bin]# ls -l bash
查看bash需要哪些动态链接库文件:
[root@localhost bin]# ldd bash
linux-gate.so.1 => (0xffffe000)
libncurses.so.5 => /lib/libncurses.so.5 (0xb7f5c000)
libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7f58000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7dfc000)
/lib/ld-linux.so.2 (0xb7f95000)
需要libncurses.so.5、libdl.so.2、libc.so.6、ld-linux.so.2文件。基本libc.so.6、ld-linux.so.2两个库文件之前已经有了,现在只需要复制libncurses.so.5、libdl.so.2两个文件即可。
[root@localhost bin]# cp -v /lib/libncurses.so.5 ../lib/
[root@localhost bin]# cp -v /lib/libdl.so.2 ../lib/
建立sh文件链接
[root@localhost bin]# rm -rf sh
[root@localhost bin]# ln -s bash sh
[root@localhost bin]# ls -l sh
lrwxrwxrwx 1 root root 4 2009-10-23 10:21 sh -> bash
[root@localhost bin]# cd ..
若发现bash很大,可以用strip来去掉无用的东西来缩小它。
[root@localhost initrd]# strip bash
好了,到目前为止,具备启动使用的工作都做好了,我们进行一下简单的测试。
[root@localhost initrd]# chroot .
如上图示,我们chroot新的文件系统了。
bash-3.2# source etc/profile
然后就变成了
出现下图,说明文件系统工作正常
OK,测试成功,现在我们可以进行启动测试了。
[root@localhost /]# exit
[root@localhost initrd]# cd ..
卸载initrd.img的挂载。
[root@localhost sdb6]# umount initrd/
生成gzip的压缩镜像。
[root@localhost sdb6]# gzip -9 initrd.img
复制根文件系统到启动目录:
[root@localhost sdb6]# cp initrd.img.gz boot/initrd.gz
现在boot目录的东西如下图所示:
好了,辛苦了这么久,激动人心的时刻到了,下面就是检验我们成功与否一步了——系统引导启动测试。
3.3.6 系统引导启动
重新启动当前的虚拟机:
[root@localhost boot]# reboot
虚拟机停到如图所示的位置后,键盘上按下“c”,进入到GRUB的交互式模式,如下图示:
输入命令:
grub> root (hd1,5)
grub> kernel /boot/bzImage root=/dev/ram0 ramdisk_size=1048576 ro
grub> initrd /boot/initrd.gz
grub> boot
太高兴了,如上图所示,系统正常启动了。相信大家跟我一样心情激动万分哦。赶紧登录进去体验一把。
OK,很正常哦。这表明我们的第一步成功了。此系统是完全运行在内存中的,内核镜像与根文件系统镜像是存在硬盘里的,系统也就是启动的时候需要读一次硬盘,其它时候完全可以不使用硬盘。达到我们的目的了,这种方式就可以联想到:只要有存放镜像文件的介质,从哪里启动该Linux系统都无所谓,刚好引出了后续章节要讲的LiveCD和U盘Linux制作方法。别急,后面会一一讲来。休息一会吧。顺便说一句,有兴趣的朋友,可以把很多应用都可以放到这个小系统里跑,如httpd、PHP、MySQL、SSH等。我所在的公司就有这种需要哦。毕竟我们不是学校实验室,辛苦做个东西是要有实际用处的。
1.3 制作U盘启动的小型内存Linux系统
前面已经完成了磁盘引导的内存Linux系统,就像造车一样,核心部件基本都完成了,只需要进行不同的改装,即可完成不同的任务。下面我就讲解如何让这个小系统从U盘上进行引导启动。
进行系统引导有很多种方式,常用的引导程序GRUB、LILO等也可以用来引导U盘系统的启动,但我个人观点,这些引导程序还是有点过大,不够小巧,并且我做过实验,我采用GRUB进行U盘系统的引导没有成功,我看网上有的朋友成功过。在此,我采用syslinux进行U盘系统的引导。
1.3.1 syslinux家族介绍
syslinux是一个轻量级的启动装载器,如果玩过Linux,一定知道lilo和grub,是的,所谓轻量级我想就是跟grub们相比而言的,尤其是grub2。
syslinux有很多变种(都是官方的)适用于各种媒质,如syslinux用于从微软的文件系统fat 16/32引导,isolinux用于从光盘引导,pexlinux用于从网络引导,extlinux用于从ext2/3文件系统引导。
从这也可以看出,syslinux对于各种设备的兼容做的很细致,据grub4dos的人说,用于兼容性方面的代码甚至超过了程序主要功能的实现代码。
考虑到我们通常使用的U盘是采用的FAT格式的文件系统,所以在此我们使用syslinux作为U盘Linux系统的引导程序。
下载syslinux到宿主机上编译安装。
插入U盘,在Linux下查看U盘的情况:
[root@localhost ~]# fdisk -l
上图是我的系统下的U盘的情况,sdc1即为我的U盘的分区。
但此分区还不是引导分区,用fdisk给此分区加上引导标志。
[root@localhost ~]# fdisk /dev/sdc
在fdisk的命令行里输入a
再输入1
则给sdc1加上的启动的标志,如下图示:
再输入w
则保存修改并退出。
[root@localhost ~]# cd /mnt/
[root@localhost mnt]# mkdir sdc1
挂载sdc1分区
[root@localhost mnt]# mount -vt vfat /dev/sdc1 sdc1
[root@localhost mnt]# cd sdc1
[root@localhost mnt]# mkdir boot
复制上一节制作好的Linux内核镜像与根文件系统镜像到sdc1上:
[root@localhost sdc1]# cp -v /mnt/sdb6/boot/* boot/
建立syslinux目录
[root@localhost sdc1]# mkdir syslinux
先做清除引导记录操作:
[root@localhost sdc1]# dd if=/dev/zero of=/dev/sdc bs=446 count=1
安装syslinux到U盘上:
[root@localhost sdc1]# syslinux -d syslinux /dev/sdc1
建立syslinux的配置文件syslinux.cfg
[root@localhost sdc1]# cd syslinux
[root@localhost syslinux]# vi syslinux.cfg
写入如下内容:
LABEL Linux
kernel /boot/bzImage
append initrd=/boot/initrd.gz ramdisk_size=1048576 root=/dev/ram0 ro
好了,到目录为止,U盘的引导应该做完了,下面我们重启测试了。
1.3 从光盘启动的小型内存Linux系统
基于前面讲的syslinux家族知识,从光盘启动我们选择isolinux来引导系统启动。
[root@localhost /]# cd /mnt/sdb6
建立ISO文件主工作目录
[root@localhost sdb6]# mkdir iso-home
[root@localhost sdb6]# cd iso-home
建立syslinux的目录
[root@localhost iso-home]# mkdir isolinux
找到一个Linux LiveCD,从那里面找到isolinux.bin文件,然后复制到isolinux目录,
[root@localhost iso-home]# cd isolinux/
建立isolinux.cfg文件,
[root@localhost isolinux]# vi isolinux.cfg
写入以下内容:
DEFAULT /boot/bzimage initrd=/boot/initrd.gz
LABLE MiniLinux-20.iso
kernel /boot/bzimage
append initrd=/boot/initrd.gz load_ramdisk=1 prompt_ramdisk=0 ramdisk_size=1671685 rw root=/dev/ram quiet
保存并退出。
[root@localhost isolinux]# cd ../../
开始制作光盘镜像文件:
mkisofs -o linuxtest.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table iso-home/
命令执行完成后,就在当前目录下生成linuxtest.iso文件,此文件即是我们制作的光盘镜像文件。
好了,用虚拟机测试一下,当然也可以刻成光盘进行测试。
2 结束语
一个小型Linux系统制作的原理基本上已经验证通过了,这仅仅是个学习,离一个可以给企业使用的完整的Linux系统还有很大距离,其中包括Linux系统初始化脚本、系统关闭脚本、服务启动脚本、设备及驱动管理等等。还有很多很多东西需要做,由于时间原因,我在此先写这么多,开始之前,我确实想写一个较完整的手工制作Linux系统步骤及Linux启动脚本和初始化等的讲解,但考虑到内容实在太多,所以暂时不写了,以后若有时间我再补上。