zoukankan      html  css  js  c++  java
  • Yocto开发笔记之《根文件系统裁剪》(QQ交流群:519230208)

    开了一个交流群,欢迎爱好者和开发者一起交流,转载请注明出处。

    QQ群:519230208,为避免广告骚扰,申请时请注明 “开发者” 字样

    ========================================================

    占盘大户一目了然

    # du -sh                                   // 查看当前目录大小

    root@imx6ulevk:/# du -sh // 总共原始大小
    616M
    root@imx6ulevk:/opt# du -sh 170M . root@imx6ulevk:/usr# du -sh 337M . root@imx6ulevk:/boot# ls vmlinux-3.14.38-6UL_ga+ge4944a5 zImage zImage-3.14.38-6UL_ga+ge4944a5 root@imx6ulevk:/boot# du -sh 21M . root@imx6ulevk:/var# ls backups cache lib local lock log run spool tmp volatile root@imx6ulevk:/var# du -sh 23M . root@imx6ulevk:/unit_tests# du -sh 44M .

    我编译的是 fsl-image-gui,用以下方式找到bb文件

    find -name "*fsl-image-gui*.bb"
    ./sources/meta-fsl-bsp-release/imx/meta-sdk/recipes-fsl/images/fsl-image-gui.bb
    

    打开bb文件,找到一下内容,并尝试删减

    IMAGE_INSTALL += " 
        ${X11_IMAGE_INSTALL} 
        ${X11_IMAGE_INSTALL_GRAPHICS} 
        ${DFB_IMAGE_INSTALL} 
        ${WAYLAND_IMAGE_INSTALL} 
        ${MM_IMAGE_INSTALL} 
        packagegroup-fsl-tools-bluetooth 
        packagegroup-fsl-tools-gpu 
        packagegroup-fsl-tools-gpu-external 
        packagegroup-fsl-tools-testapps 
        packagegroup-fsl-tools-benchmark 
        "
    export IMAGE_BASENAME = "fsl-image-gui"
    
    
    Change to ========>>
    
    IMAGE_INSTALL += " 
        packagegroup-fsl-tools-bluetooth 
        "
    export IMAGE_BASENAME = "fsl-image-gui"

    少了200M多

    -rw-r--r-- 1 xuerui xuerui 844M 12月 30 12:27 fsl-image-gui-imx6ulevk-20151230030257.rootfs.sdcard
    -rw-r--r-- 1 xuerui xuerui 624M  1月 25 15:55 fsl-image-gui-imx6ulevk-20160125075030.rootfs.sdcard

    以下内容来源于百度文库,没注明出处,侵权请告知

    一、编译内核
    得到bzImage
    二、定制文件系统
    1、创建ramdisk虚拟空间,用来放置文件系统
    命令 # mke2fs –m 0 –I 2000 /dev/ram0
    注释:mke2fs将会自动判断设备容量的大小并相应的配置自身,-m 0参数防止它给root保留空间,这样会腾出更多有用的空间。
    2、挂载刚才创建的虚拟盘,我这里挂载在/mnt/floppy目录下
    命令 # mount –t ext2 /dev/ram0 /mnt/floppy
    3、创建文件系统必须目录
    命令 # cd /mnt/floppy
    # mkdir dev proc etc bin sbin lib mnt usr
    4、确定/dev目录下我们需要的设备文件
    方案一、把现有/dev目录中所有设备文件拷贝过来,然后删除不必要的设备文件(不推荐使用)
    命令:# cp –dpR /dev /mnt/floppy/dev
    注释:该命令会拷贝整个设备目录但不拷贝文件内容,同时dpR开关保证连接文件仍然不变,不会拷贝连接指向原来文件,而且属性不变。如果没有SCSI设备,删除所有以sd开头的设备文件,如果不使用串口设备,删除所有以cua开头的文件,然后保留一些必要的设备文件。
    方案二、只拷贝必要的设备文件:
    console —— 控制台设备
    tty* —— 由控制台管理的虚拟终端
    ram —— 虚拟内存盘设备(以后我们的系统将运行在虚拟盘中)
    null —— 空设备,非常有用的字符设备文件,送入这个设备的所有东西将被忽略。如果将任何程序的输出结果重定向到/dev/null,则看不到任何输出信息,因此脚本中常用它来消除本该显示在屏幕上的其他信息
    zero —— 零设备,只会得到空的内容,有时为了提高压缩率,需要对某空间全零填充时需要使用该设备
    inintrd —— 特殊的字符设备,被用来从用户空间向系统内核发送切换运行级别的信息,属于一个虚拟字符设备。 
    fd 0 —— 软盘设备
    hd 0 —— 硬盘设备(该项不是必须,如果您想挂载硬盘,请选择该项)
    命令:# cp –dpR /dev/console /mnt/floppy/dev
    # cp –dpR /dev/tty* /mnt/floppy/dev
    # cp –dpR /dev/ram /mnt/floppy/dev
    注释:如果要使用多个虚拟盘,可以相应的将ram1,ram2,……等拷贝过来
    # cp –dpR /dev/null /mnt/floppy/dev
    # cp –dpR /dev/zero /mnt/floppy/dev
    # cp –dpR /dev/initrd /mnt/floppy/dev
    6、 确定/etc目录中所需要的系统配置文件
    a) rc.d/* —— 系统启动所需要的脚本
    b) fstab —— 列出要登陆的文件系统,
    c) inittab —— 包含启动过程参数
    先直接拷贝系统/etc目录下的以上配置文件
    命令 # cp –R /dev/rc.d/* /mnt/floppy/dev/
    # cp /dev/fstab /mnt/floppy/dev/
    # cp /dev/inittab /mnt/floppy/dev/
    然后修改启动配置脚本,用vi或者kwrite等文本编辑工具打开/dev/rc.d/rc文件
    # cd /mnt/floppy/dev/rc.d/
    # vi rc
    修改rc文件为以下内容:
    #!/bin/sh
    bin/mount -av 
    /bin/host name fallso
    修改fstab文件内容为以下内容:
    /dev/ram0 / ext2 defaults
    /dev/fd0 / ext2 defaults
    /proc /prco proc defaults
    修改inittab文件内容:
    id:2:initdefault:
    si::sysinit:/etc/rc
    1:2345:respawn:/sbin/getty 9600 tty1
    2:23:respawn:/sbin/getty 9600 tty2
    7、 确定/bin是和/sbin目录包含的命令文件
    a) ls ——文件目录陈列,相当于dos的dir
    b) mv —— 
    c) cat —— 
    d) init —— 
    e) mingetty ——
    f) login —— 登陆命令
    g) mount —— 挂载设备命令
    h) umount —— 卸载设备命令
    命令:# cp /bin/ls /mnt/floppy/bin
    # cp /bin/cat /mnt/floppy/bin
    # cp /bin/mv /mnt/floppy/bin
    # cp /bin/login /mnt/floppy/bin
    # cp /bin/mount /mnt/floppy/bin
    # cp /bin/umount /mnt/floppy/bin
    # cp /sbin/init /mnt/floppy/bin
    # cp /sbin/mingetty /mnt/floppy/bin
    8、 确定/lib目录下所需要的共享函数库,如果缺少必要的函数库,系统会自动停止启动或出现一些错误信息提示。
    a) 列出所有程序需要使用的libc库
    命令:# cd /bin
    # ls –l /lib/libc* 
    -rwxr-xr-x 1 root root 4016683 Apr 16 18:48 libc-2.1.1.so* 
    lrwxrwxrwx 1 root root 13 Apr 10 12:25 libc.so.6 -> libc-2.1.1.so*
    拷贝箭头右边所指文件
    如 cp –dpR /lib/libc-2.1.so* /mnt/floppy/lib
    b)察看每一个程序所使用的函数库
    命令:# ldd /sbin/mke2fs
    libext2fs.so.2 => /lib/libext2fs.so.2 (0x40014000) 
    libcom_err.so.2 => /lib/libcom_err.so.2 (0x40026000) 
    libuuid.so.1 => /lib/libuuid.so.1 (0x40028000) 
    libc.so.6 => /lib/libc.so.6 (0x4002c000) 
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    拷贝箭头右边的函数库
    如cp –dpR/lib/ld-linux.so.2 /mnt/floppy/lib
    9、 关于其他目录,以下目录在软盘版linux中完全可以为空
    a) /proc是一个虚拟的文件系统,用来传输资料给核心程序的目录,可以观察这些特殊的文件在内存中运行的信息;
    b) /usr目录下包含系统运行的所有程序,用户经常用到的一些数据和一些配置数据,该文件系统为只读,以减少系统瘫痪的危险性
    c) /mnt 挂载其他设备的临时目录
    10、卸载虚拟盘,拷贝、压缩文件系统
    命令:# umount /mnt/floppy
    # dd if=/dev/ram0 bs=1k |gzip –v9>roofs.gz
    注释:压缩后在/root下得到一个压缩的根文件系统,检查它是否超过了1.44M,如果超过还得从头再来。
    
    三、 引导程序
    裁剪后所得内核大小为850KB,压缩后文件系统大小为1.2M,二者之和大于1.44M,显然超过了软盘容量,所以本软盘版linux采用两张软盘,第一张盘放置内核及启动引导程序,第二张盘放置压缩的文件系统。系统启动过程如下:
    由于linux内核无法自己引导,故在系统启动时需要引导器来加载系统内核。通常的我们使用LILO,即the LInux LOader。
    微机加电后,基于x86 CPU构架的特性,CPU将去检测执行地址为FFFF0处存储的跳转指令,跳转到较低的地址。接着BIOS就会做一系列的检查操作。这一过程即POST(Power On Self Test)。最后BIOS结束自检,接着读取第一个启动设备的启动信息。一般的是从硬盘启动,但本系统基于软盘,因此,BIOS将从软盘的启动扇区读取系统启动信息,这里即为LILO的引导部分内容,并将控制权交给LILO。
    LILO接管系统后将完成信息的显示、操作系统的选择(对多系统共存而言,在这里直接运行软盘上的Linux)、内核启动参数的传递,然后加载/etc/lilo.conf中对应的内核映像文件,最后将控制权交给加载到系统中的内核映像。
    当软盘上的Linux的内核被LILO加载到内存后,开始掌握控制权。由于Linux的内核是压缩存储的,所以首先进行的是自解压操作。然后内核将开始检测系统硬件,并配置相应的驱动程序,同时在系统控制台上输出相应结果信息。接下来内核将挂载并检测根文件系统。若挂载成功,内核将在系统后台启动系统的第一个进程init进程。至此,内核加载过程结束。
    接下来由init进程根据/etc/inittab中的信息完成Linux系统的初始化操作。本系统裁剪掉了许多不必要的服务,故而只进行下列初始化操作。
    init停止在console,按inittab指示打开一个shell或者开getty+login这样用户就可以看到输入用户名的提示符,至此进入系统操作,完成整个系统引导过程。
    创建软盘版linux引导程序的步骤如下:
    1、 在第一张软盘上标记:系统引导及内核,然后插入软驱,执行命令
    a) # mke2fs –N 24 –m 0 /dev/fd0
    注释:将软盘格式化为具有24个信息节点、ext2类型的文件系统
    b) # mount –o dev /dev/fd0 /mnt
    注释:挂载软盘到/mnt目录
    c) # mkdir /mnt/boot
    注释:创建启动盘的boot目录
    d) # mkdri /mnt/dev
    注释:创建启动盘的dev目录
    e) # cp –R /dev/null /mnt/dev
    注释:拷贝空设备到软盘
    f) # cp –R /dev/fd0 /mnt/dev
    注释:拷贝软盘设备到目标系统的/dev目录下
    g) # cp /boot/boot.b /mnt/boot
    注释:拷贝启动映像文件到目标系统/dev目录下
    h) # cp /boot/bzImage /mnt/boot
    注释:拷贝内核到目标系统的/boot目录下
    i) # rdev –r /mnt/bzImage 49152li
    2、 创建修改lilo.conf文件
    a) # cp /etc/lilo.conf /mnt
    b) 打开lilo.conf,修改为以下内容:
    boot=/dev/fd0
    install=/boot/boot.b
    map=/boot/map
    read-write
    backup=/dev/null
    compact
    image=/bzImage
    label=Linux
    root=/dev/fd0
    3、 将引导装入程序复制到软盘
    命令:# lilo –v C lilo.conf –r /mnt
    4、 卸载第一张软盘
    命令:# umount /mnt
    5、 将第二张软盘标记为:文件系统。插入软驱,拷贝压缩后的文件系统
    a) # mke2fs –i8192 –m 0 /dev/fd0
    注释:-i8192表示每8192位创建一个信息节点
    b) # mount /dev/fd0 /mnt
    注释:挂载软盘到/mnt目录
    c) # cp /root/rootfs.gz /mnt
    注释:拷贝文件系统到软盘
    d) # umount /mnt
    注释:卸载软盘
    6、 重新启动电脑,进入bios设置“first boot device”为“boot from floppy disk”。测试软盘版linux系统是否能够运行。
    将1号软盘插入软驱,重新启动电脑,看到屏幕上出现“lilo loading linux”,然后是一大堆的系统硬件初始化信息,引导内核后,最后看到以下提示VFS:Insert root floppy disk to be loaded into RAM disk an press ENTER
    [见图一]
    插入第二张软盘:装载文件系统
    [见图二]
    不知何故,我在插入第二张软盘后,看到如下提示:
    RAMDISK:Ext2 filesystem found at block0
    RAMDISK:Loading 1440 block[1disk]into ram disk done
    VFS Mounted root(ext2 filesystem)
    Freeing unused kernel memory:84K freed
    Warining:unable to open an initial console
    Kernel panic:No init found .Try passing init=option to kernel
    7、 将软盘插在其他机器的软驱中,测试软盘版linux系统是否具有移植性。
    
    
    
    呼~。。今天忙了一天,光裁剪根文件系统了。
    一个1G多的文件系统,被我剪剪剪 ,成了30M了,但是还是嫌大,最理想是10M以内。
    但是我真觉得没法再剪了。
    
    
    
    bin/的东西,比较重要,只删了些不常见的命令、
    lib/有很多gcc的库,也得小心删减,一裁了不该裁的,系统就起不来了。。
    usr/东西特别多
    usr/bin/,usr/lib/,可以删掉绝大部分,留下几个用到的就可以了
    usr/share/里好多东西,删删删,使劲删,基本都删光了。
    root/modules/里,很多需要加载的.ko模块,也可以删,只剩下core,sys,os的几个.ko。
    var/里面也可以删很多东西,留下一个var/log/dmesg和var/run/utmp。
    dev/里的东西也可以删,只要留下console和ttySA0就可以了。
    etc/也可以删一些不重要的脚本。
    
    
    
    就这样,只剩下了一个恐龙骨架~
  • 相关阅读:
    java web项目打包.war格式
    version 1.4.2-04 of the jvm is not suitable for thi
    Sugarcrm Email Integration
    sharepoint 2010 masterpage中必须的Content PlaceHolder
    微信开放平台
    Plan for caching and performance in SharePoint Server 2013
    使用自定义任务审批字段创建 SharePoint 顺序工作流
    Technical diagrams for SharePoint 2013
    To get TaskID's Integer ID value from the GUID in SharePoint workflow
    how to get sharepoint lookup value
  • 原文地址:https://www.cnblogs.com/alanfang/p/5131671.html
Copyright © 2011-2022 走看看