Linux精简指南

    技术2022-05-19  17

    一、概述精简Linux系统的主要目的是将Linux系统使用固态盘等小容量flash存储设备来替代PC机上面的硬盘。解约成本、减少体积、提高速度以及延长使用寿命和稳定性。

    精简Linux的主要方法就是通过更换Linux的系统环境进行的。主要的过程是使用内存文件系统替换硬盘文件系统,使用busybox替换Linux的init进程、常用命令和shell,使用Framebuffer替换X11库。

    二、准备工作在精简之前,需要安装引导程序,用来引导我们精简之后的Linux系统,并且传递必要的参数给内核。我们使用的引导器是grub.

    通常我们的Linux系统中都带有grub,在命令下面敲入grub可以进入grub的命令行。

    我们暂时使用的存储介质是U盘。在装入grub之前,先使用fdisk进行分区。我是将整个U盘作为了主分区,并且设置为可引导分区(在linux的fdisk中,需要使用命令a进行设置)。然后我把该分区格式化为ext2格式(使用mkfs.ext2或者mke2fs命令)。我使用下面的命令进行格式化:

    mke2fs /dev/sda1

    格式化好之后,将U盘挂载到文件系统中,建立boot/grub/路径,将系统的/boot/grub/下面的stage1和stage2拷贝到boot/grub下。我将它挂载到/mnt/u,使用如下的命令进行操作:

    mount /dev/sda1 /mnt/u

    mkdir /mnt/u/boot

    mkdir /mnt/u/boot/grub

    cp /boot/grub/stage* /mnt/u/boot/grub/

    然后,使用grub修改u盘的MBR记录,我系统下只有一个硬盘,我使用下面的命令进行操作:

    grub

    root (hd1,0)

    setup(hd1)

    然后需要在grub目录下建立配置文件grub.conf,我采用如下的方式建立的:

    vi /mnt/u/boot/grub/grub.conf

    然后在文件中写入如下内容:

    default 0

    timeout 0

    title linux

    kernel /bzImage vga=0x315

    initrd /image.gz

    使用wq保存配置文件。

    三、编译内核我们使用的是2.6.16的内核,可以在www.linux.org下载,文件名是linux-2.6.16.tar.bz2。使用以下名利功能进行解压:

    tar –jxvf linux-2.6.16.tar.bz2

    解压整个文件之后,进入linux-2.6.16的源代码目录,然后对代码进行编译。

    编译过程如下:

    make menuconfig

    对内核进行配置,执行该命令的时候,要求所开的终端宽度要足够显示80个字符,以显示整个配置的图形界面,否则会出现错误。

    进入配置界面之后,在Device Driver->block devices里面选择

    RAM Disk support

    Initial RAM disk support

    两个项目。在Graphics support里面选择

    Support for frame buffer deiveces

    Console Display driver support->FrameBuffer console support

    由于对于将要选择显卡不明确,我没有更改这个里面的设置

    另外,还需要选择MultiMedia devices里面的Video for Linux选项,里面的驱动程序不用选择。

     

    注意:1.对于奔腾II芯片,需要在 Processor里面选择

        2.选择内核模块的时候,会出现两种情况。一种是*号,表示选定到真正的内核中。另外一种是“M”符号,表示内核起来以后再加载进去的模块。我们文件系统里面不添加其它的内核模块,我们都选择第一种。

    配置好之后,直接

    make bzImage

    编译之后,在arch/i386/boot/里面有一个bzImage文件,拷贝它到U盘的根目录下面。

    注意:内核的编译是从源代码开始的,由于不同的编译器版本对源代码的处理方式不同。因此,相同的代码在不同的编译器上都会可能出现不同的编译错误。我在gcc3.2和gcc4.1下编译通过。

    四、编译busybox

    首先在www.busybox.net下载busybox的源代码,我所下载的版本是1.2.0,文件名是busybox-1.2.0.tar.bz2

    使用命令:

    tar –jxvf busybox-1.2.0.tar.bz2

    解压之后,进入busybox-1.2.0的目录

    使用make menuconfig进行配置,选择需要的命令。一定要选择shell里面的ash以及init utility里面的init,其它的可以随便选择一些常用的命令。

    然后使用make,对源代码进行编译。

    编译完成之后,建立一个临时的目录,保存busybox生成的文件。我建立的是/tmp/usb

    然后使用下面命令拷贝busybox的文件到临时目录,这个目录以后就是我们的系统启动后的文件系统。

    make  PREFIX=/tmp/usb  install

    四、制作图形库接下来编译Qt的嵌入式图形库。Qt的嵌入式图形库现在叫做Qtopia-core。可以在http://www.trolltech.com/trolltech/developer/downloads/qtopia/coregpl下载到它的最新版本。我所使用的4.1.4的版本。文件名qtopia-core-opensource-src-4.1.4.tar.gz。我使用下面的命令解压缩:

    tar  –zxvf  qtopia-core-opensource-src-4.1.4.tar.gz

    进入qtopia-core目录,使用如下的配置方式

    ./configure –embedded x86

    配置好之后,使用make编译该源文件。

    注意:Qtopia-core编译大概需要4个小时(我的机器用了这么长时间,配置是512M内存,P4 1.8G的处理器),而且需要大概1.5G的空间。如果空间不足,可能会出现莫名其妙的问题。

    然后使用make install将Qtotpia-core安装到系统目录。

    安装之后,就可以使用找个库开发图形界面的应用程序。但是要在精简的Linux系统上运行,需要把Qt的库拷贝到找个系统上。

    调试库通常比较大,所以,我们主要拷贝非调试的库,同时还拷贝系统其它的库到/tmp/usb/lib目录。

    拷贝的时候,cp命令要增加-a命令以拷贝符号链接。

    比如我拷贝libQtGui的时候,我使用下面的命令:

    cp /usr/local/Trolltech/Qtopia-core-4.1.4/lib/libQtGui.so* /tmp/usb/lib –a

    上面截图中的库的分布路径主要在/lib /usr/lib以及Qt的lib目录下面,如果找不到,可以使用locate命令进行查找.

    locate libz.so

    拷贝完成库之后,还需要把Qt的字体也拷贝过来。Qt的字体在/usr/local/Trolltech/QtopiaCore-4.1.4/lib/fonts里面。主要需要拷贝里面的fontdir文件。找个文件记录了每种字体所在的路径。可以拷贝一些必要的字体到/tmp/usb里面,路径跟本机路径相同。比如我就拷贝到

    /tmp/usb/usr/local/Trolltech/QtopiaCore-4.1.4/lib/fonts里面

    需要拷贝的字体由你的fontdir里面决定。你可以在找个文件中删除你没有拷贝的那些字体。

    五、制作文件系统   到现在为止,我们已经准备好了需要的文件了。最后我们要开始制作我们的文件系统。

    刚刚已经拷贝了必要的库已经busybox到响应的目录了。现在我们还需要增加一些系统启动需要的文件。

       首先建立/tmp/usb//etc目录,在找个目录下面建立文件initab,在文件中写入以下内容:

    ::sysinit:/etc/rc.S

    ::askfirst:/bin/ash

    其中,sysinit表示后面找个程序在系统初始化的时候执行,后面的askfirst表示系统初始化完毕后启动的程序。这个程序如果执行结束,那么系统会再次启动它。

    然后建立rc.S文件,写入以下内容:

    #!/bin/ash

    /bin/mount -t proc /proc /proc

    export PATH=/bin/:/sbin/:/usr/sbin/

    最后,我们需要建立设备文件。首先建立一个/tmp/usb/dev目录。在下面执行一下命令以建立设备文件。

    >mknod console c 5 1

     

    mknod fb0 c 29 0

    mknod hda b 3 0

    mknod hda1 b 3 1

    mknod loop0 b 7 0

    mknod null c 1 3

    mknod ram0 b 1 0

    mknod tty c 5 0

    mknod tty0 c 4 0

    ln –s fb0 fb

    建立好这些文件之后,文件系统就可以了。我们还可以把我们的程序拷贝到找个文件系统当中,然后修改rc.S文件,使得它自动运行。也可以进去之后,使用busybox提供的shell来执行。

    最后一步,就是把找个文件系统做成一个内存文件系统的影像。

    首先,新建一个空的文件,大小为16M,我使用下面的命令:

    dd if=/dev/zero of=/tmp/image bs=1024 count=16384

    然后,把找个空文件映射到一个设备文件上面,使用下面的命令进行:

    losetup /dev/loop0 /tmp/image

    把这个影像格式化为ext2格式:

    mke2fs /dev/loop0

    格式化好之后,把它挂载到我们主机的文件系统上面来,我把它挂载到/mnt/img:

    mount /dev/loop0 /mnt/img

    然后把我们建立好的文件系统从/tmp/usb拷贝过来

    cp  /tmp/usb/*  /mnt/img/  -ar

    拷贝完成之后,我们的images文件就是包含了这些文件的文件映像了。

    把它从系统中卸载出来

    umount /dev/loop0

    把loop0跟imag脱离关系

    losetup –d /dev/loop0

    sync

    现在,我们的文件映像做好了。再把它压缩一下:

    dd if=image |gzip -9 >image.gz

    image.gz就是我们的压缩的内存文件影像了。把它拷贝到U盘的根目录下面。

    设置系统引导从USB启动(USB-HDD),系统就会启动到busybox提供的shell下面。


    最新回复(0)