您的位置 首页 测评

怎么自己着手做一个迷你型Linux操作系统

本文教你如何自己动手做一个迷你型Linux操作系统

体系发动

  因为咱们要考虑从 Flash 盘进行发动,所以咱们挑选用 LILO 作为咱们的 Boot Loader,而不选用 GRUB。这是考虑到 GRUB 有较强的对硬盘和文件体系的辨认才能,而 Flash 盘究竟不是规范的硬盘,并且咱们选用的文件体系 GRUB 又不必定知道,搞不好的话 GRUB 反会画蛇添足。而 LILO 就简略的多了,它在硬盘开端的 MBR 写入一个小程序,这个小程序不经过文件体系,直接从硬盘扇区号,读出 Kernel Image 装入内存。这样,稳妥系数就大大添加。并且也给了咱们自在选用文件体系的地步。那么,咱们要怎么装置 LILO 呢?

  首要,咱们要找一块一般的 800M 左右的 IDE 硬盘,连在方针机器的 IDE 线上。这样在咱们的方针机器上,IDE1 上挂的是 Flash 盘,IDE2 上挂的是一块作业硬盘。咱们用规范的过程在 IDE2 的规范硬盘上装上一个 Debian GNU/Linux 体系。当然,假如读者朋友们手头没有 Debian,也能够装 Red Hat 体系。装好作业体系之后,要首要做一些削减作业,把不必要的 Service 和 X Window 等等东西都删掉。这样做的意图是增进体系发动速度,因为咱们在后边的作业中,必定要不断的从头发动机器,所以发动速度对咱们的作业功率是很要害的。

  装好作业体系之后,在 Falsh 盘上做一个 Ext2 文件体系,这个用 mke2fs 这个指令就能够完结。因为 Flash 盘是接在 IDE1 上的,所以在 Linux 里边,它的身份是 /dev/hda。本文作者在操作的时分,把整个 Flash 盘划分了一个整个的分区,所以,调用 mke2fs 的时分,处理的是 /dev/hda1。读者朋友们应该能够直接在 /dev/hda 上做一个 Ext2 文件体系,而不必事前分区。

  在 Flash 盘上做好了文件体系之后,就能够把一个编译好的内核映像文件 vmlinuz 复制到 Flash 盘上了。留意,必需求先把这个 vmlinuz 映像文件复制到 Flash 盘上,然后才能在 Flash 盘上装置 LILO。否则的话,LILO 到时分可是会 LILILILI 打结巴的,因为它会找不到 Kernel Image 在 Flash 盘上的方位的,那样的话 Flash 盘也就发动不起来了。还有,假如读者朋友们在 Flash 盘上用的是一个紧缩的文件体系的话,到时分 LILO 也会出问题,它尽管能正确的找到 Kernel Image 在硬盘上的开端方位,可是它却没有办法处理被文件体系从头紧缩过的这个 Kernel Image,不知道该怎么把它展开到内存中去。

  把 Kernel Image 复制曩昔往后,咱们就能够着手修改一份 lilo.conf 文件,这份文件能够就放在作业体系上就行了。可是留意在 lilo.conf 中索引的文件名的途径可要写对。这些途径名都是在作业体系上看上去的途径名。比方,假如 Flash 盘 Mount 在 /mnt 目录下面,那么,在 lilo.conf 中,vmlinuz 的途径名便是 /mnt/vmlinuz。留意这一点千万不要搞错。否则的话,假如一不小心把作业体系的 LILO 给损坏掉了,那就费事了。修改好了 lilo.conf,然后再运转 lilo 指令,留意,要告知它用这个新的 lilo.conf 文件,而不要用 /etc/lilo.conf。

  装置好 LILO 之后,咱们能够当即从头发动,测验一下。首要在 BIOS 里边,设置成从 IDE1 开端发动,假如咱们看到 LILO 的提示符,按回车后还能看到 Kernel 输出的音讯,这就算是 LILO 的装置成功了。记住这个操作的办法,往后每次咱们更新 Flash 盘上的 Kernel Image,都记住要更新 LILO。也便是说,要从头运转一遍 lilo 指令。

  编译内核

  实验成功 LILO 的装置往后,咱们开端考虑编译一个新的内核。当然,要编译新的内核,咱们首要要进入咱们的作业体系。这儿有两个办法进入作业体系,一是在 BIOS 里边设置从 IDE2 发动,当然,这就要求最初装置作业体系的时分,要把 LILO 装置在 /dev/hdb 上;另一个办法是仍是从 IDE1 发动,不改动 BIOS 的设置,可是在看到 LILO 的提示符的时分,要键入 linux root=/dev/hdb1,最前面的 linux 是在 lilo.conf 里边界说的一个 entry,咱们只选用这个 entry 所指定的 Kernel Image,可是用 /dev/hdb1 作为 root 文件体系。两个办法或许有的时分一个比另一个好,更便利一些。这就要看详细的状况了。不过,它们的设置并不是相互冲突的。

  在编译内核的时分,因为咱们的内核是只需一台机器运用的,所以咱们应该对它的状况一目了然;别的一方面,为了减低不必要的杂乱性,咱们决议不必 kernel module 的支撑,而把一切需求的东西直接编译到内核的里边。这样编译出来的内核,在一台一般的 586 主板上,把一切必要的功用都加进去,一般也不到 800K 字节。所以,这个办法是可行的。并且减低了 init scripts 的杂乱程度。从运转方面来考虑,因为需求的 kernel 代码反正是要装载到内存中的,所以并不会引起内存的糟蹋。

  在咱们的方针平台上,咱们期望运用 USB 存储设备。还有一点要留意的,便是对 Frame buffer 的支撑。这首要是为了支撑 XFree86。一般说来,假如咱们的显卡是 XFree86 直接支撑的,那当然最好,也就不需求 frame buffer 的内核支撑。可是假如 XFree86 不支撑咱们的显卡,咱们能够考虑用 VESA 形式。可是 XFree86 的 VESA 卡支撑运转起来不太美丽,还有安全方面的问题,有时在发动和退出 X Window 的时分会呈现花屏。所以咱们能够选用 kernel 的 vesa 形式的 frame buffer,然后用 xfree86 的 linux frame buffer 的驱动程序。这样一般就看不到花屏的现象了,并且安全方面也没有任何问题。

  devfs 也是咱们感兴趣的论题。假如 kernel 不运用 devfs,那么体系上的 root 文件体系就要有 /dev 目录下面的一切内容。这些内容能够用 /dev/MAKEDEV 脚本来树立,也能够用 mknod 手艺一个一个来建。这个办法有其本身的优点。可是它的缺陷是费事,并且和 kernel 的状况又并不共同。相反的,假如运用了 devfs,咱们就再也不必忧虑 /dev 目录下面的任何事情了。/dev 目录下面的项目会有 kernel 的代码自己担任。实际运用起来的作用,对内存的耗费并不显着。所以咱们挑选 devfs。
busybox

  有了 LILO 和 kernel image 之后,接下来,咱们要组织 root 文件体系。因为 flash 盘的空间只需 16M 字节,能够说,这是对咱们最大的应战。这儿首要要向咱们介绍小型嵌入式 Linux 体系组织 root 文件体系时的一个常用的利器:BusyBox。

  Busybox 是 Debian GNU/Linux 的大名鼎鼎的 Bruce Perens 首要开发,运用在 Debian 的装置程序中。后来又有许多 Debian developers 贡献力量,这其间尤推 busybox 现在的维护者 Erik Andersen,他患有癌症,可是却是一名优异的自在软件开发者。

  Busybox 编译出一个单个的独立履行程序,就叫做 busybox。可是它能够依据装备,履行 ash shell 的功用,以及几十个各种小应用程序的功用。这其间包含有一个迷你的 vi 修改器,体系不可或缺的 /sbin/init 程序,以及其他比方 sed, ifconfig, halt, reboot, mkdir, mount, ln, ls, echo, cat … 等等这些都是一个正常的体系上必不可少的,可是假如咱们把这些程序的原件拿过来的话,它们的体积加在一起,让人吃不消。可是 busybox 有悉数的这么多功用,巨细也不过 100K 左右。并且,用户还能够依据自己的需求,决议究竟要在 busybox 中编译进哪几个应用程序的功用。这样的话,busybox 的体积就能够进一步缩小了。

  运用 busybox 也很简略。只需建一个符号链接,比方 ln -s /bin/busybox /bin/ls,那么,履行 /bin/ls 的时分,busybox 就会履行 ls 的功用,也会依照 ls 的方法处理指令行参数。又比方 ln -s /bin/busybox /sbin/init,这样咱们就有了体系运转不可或缺的 /sbin/init 程序了。当然,这儿的条件是,你在 busybox 中编译进去了这两个程序的功用。

  这儿边要提出留意的一点是,busybox 的 init 程序所知道的 /etc/inittab 的格局十分简略,并且和惯例的 inittab 文件的格局不一样。所以读者朋友们在为这个 busybox 的 init 写 inittab 的时分,要留意一下不同的语法。至于细节,就不在咱们这儿多说了,请咱们参阅 Busybox 的用户手册。

  从发动到进入 shell

  busybox 装置好往后,咱们就能够考虑从头发动,一直到进入 shell 提示符了。这之前,咱们要预备一下 /etc 目录下的几个重要的文件,并且要把 busybox 用到的 library 也复制过来。

  用 ldd 指令,后边跟要剖析的二进制程序的途径名,就能够知道一个二进制程序,或许是一个 library 文件之间的相互依靠联系,比方 busybox 就依靠于 libc.so 和 ld-linux.so ,咱们有了这些常识,就可把着手把一切需求的 library 复制到 flash 盘上。因为咱们的 flash 盘说大不大,说小倒也不小,有 16M 字节之多。咱们直接就用 Glibc 的文件也没有太多问题。假如读者朋友们有特别的需求,觉得 Glibc 太巨大了的话,能够考虑用 uClibc,这是一个十分细巧的 libc 库,功用当然没有 Glibc 全,可是满足一个嵌入式体系运用了。本文就不再介绍 uClibc 了。

  库程序复制过来往后,咱们就能够考虑体系发动的过程了。发动的时分,先是 lilo,接下来便是 kernel,kernel 初始化之后,就调用 /sbin/init,然后由 init 解说 /etc/inittab 运转各式各样的东西。inittab 会辅导 init 去调用一个最重要的体系初始化程序 /etc/init.d/rcS,咱们将要在 rcS 中完结各个文件体系的 mount,此外,还有在 rcS 中调用 dhcp 程序,把网络架起来。rcS 履行完了往后,init 就会在一个 console 上,依照 inittab 的指示开一个 shell,或许是开 getty login,这样用户就会看到提示输入用户名的提示符。咱们这儿为了简略起见,先直接进入 shell,然后比及调试成功往后,再改成直接进入 X Window。

  关于 inittab 的语法,咱们上面现已说到过了,期望读者朋友们去查威望的 busybox 的用户手册。这儿,咱们先要讲一下文件体系的构成状况。

  组织文件体系

  咱们现已看到,咱们的 root 文件体系为了防止费事,用的是规范的 ext2 文件体系。因为咱们的硬盘空间很小,只需不到 16M,并且咱们还要在上面放上 X Window,所以,假如咱们悉数用 ext2 的话,Flash 盘的有限空间会很快耗尽。咱们仅有的挑选是选用一个恰当的紧缩文件体系。考虑到 /usr 目录下面的内容在体系运转的时分,是不需求被改写的。咱们决议挑选只读的紧缩文件体系 cramfs 来包容 /usr 目录下面的悉数内容。

  cramfs 是 Linus Torvalds 自己开发的一个适用于嵌入式体系的小文件体系。因为它是只读的,所以,尽管它采取了 zlib 做紧缩,可是它仍是能够做到高效的随机读取。已然 cramfs 不会影响体系读取文件的速度,又是一个高度紧缩的文件体系,关于咱们,它便是一个适当不错的挑选了。

  咱们首要把 /usr 目录下的悉数内容制成一个 cramfs 的 image 文件。这能够用 mkcramfs 指令完结。得到了这个 usr.img 文件之后,咱们还要考虑怎样才能在体系运转的时分,把这个 image 文件 mount 上来,成为一个可用的文件体系。因为这个 image 文件不是一个一般意义上的 block 设备,咱们有必要选用 loopback 设备来完结这一使命。详细说来,便是在前面说到的 /etc/init.d/rcS 脚本的前面部分,加上一行 mount 指令: mount -o loop -t cramfs /usr.img /usr

  这样,就能够经由 loopback 设备,把 usr.img 这个 cramfs 的 image 文件 mount 到 /usr 目录上去了。哦,对了,因为要用到 loopback 设备,读者朋友们在编译内核的时分,别忘了参加内核对这个设备的支撑。关于体系往后的运转来说,这个 mount 的作用是通明的。cramfs 的紧缩功率一般都能到达将近 50%,而咱们的体系上绝大部分的内容是坐落 /usr 目录下面,这样一来,本来或许要用到 18M 的 Flash 盘,现在或许只需求 11M 就能够了。一个 14M 的 /usr 目录,给紧缩成了只是 7M。

  上面考虑了紧缩问题,下面还要考虑到,Flash 盘究竟不像一般硬盘,屡次的擦写究竟不太好,所以咱们考虑,在需求屡次擦写的当地,运用内存来做。这个使命,咱们考虑用 tmpfs 来完结。至于 tmpfs 和经典的 ramdisk 的比较,咱们这儿就不多说了。一般说来,tmpfs 愈加灵敏一些,tmpfs 的巨细不像 ramdisk,能够顺着用户的需求增加或许缩小。咱们挑选把 /tmp、/var 等几个目录做成 tmpfs。这只需求咱们在 /etc/fstab 里边加上两行相似下面的文字就能够了: none /var tmpfs default 0 0

  然后别忘了在 /etc/init.d/rcS 里边接近最初的当地,加上 mount -a。这样,就能够把 /etc/fstab 里边指定的一切的文件体系都 mount 上来了。

  X Window

  进行到这儿,读者朋友们或许会认为,X Window 的装置或许会很杂乱。其实否则,因为咱们上面的架子搭好了,X Window 的装置十分简略,只需求把几个要害的程序复制过来就能够了。一般说来,只需求 /usr/X11R6 目录下面的 bin 和 lib 两个目录。然后,依据用户各自的需求,还能够做大幅的削减。比方,假如你的局域网上有一个敞开的 xfs 字体服务器的话,你能够把一切本地的字体都删掉,而运用远端的字体服务器。假如只需求运转有限的程序,别忘了把没有用的 library 都删掉。此外,还能够把剩余的 X Window 的 driver 都删掉,只保存本机的显示卡所需求的 driver 就能够了。当然,这一关免不了要做屡次测验。

  其它技巧

  假如你的作业体系式在别的一台机器上,经过局域网和本机互联的话,ssh 是一个不错的东西。此外,ssh 中带的 scp 用起来和一般的 cp 复制程序差不多,十分便利。用 ssh 和 scp 来同享文件,长途实验,你就能够不需求在办公室里跑来跑去的了。

  假如你需求一个 MS Windows 上运转的 X Server 和 xfs 字体服务器,能够考虑包含在 Red Hat 的 Cygwin 东西箱中的 XFree86 体系。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/192389.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部