zoukankan      html  css  js  c++  java
  • 根文件系统制作1

    主要参考<嵌入式文件系统制作和移植-0.3.doc>和
     
    一,根文件系统树的制作
    1,根文件系统树制作
    mkdir rootfs
    mkdir-p {apps,bin,data,dev,info,proc,root,sbin,sys,tmp,var,etc/{,init.d,dropbear},mnt/{,usb,sdc,nfs,dev},usr/{,bin,sbin,lib,share},lib/{,modules/{,3.0.0}}}
    2,构建根文件系统的/dev目录(静态构建与动态构建)
        必须创建的设备文件有
        mknod -m666 dev/null c 1 3
         mknod -m666 dev/console c 5 1
    3,手工构建/etc目录
    inittab文件详解
    注意添加init.d/* , inittab的可执行权限 chmod +x
    4,拷贝交叉编译器的动态库到lib/
        动态库文件 (.so、.so.[0-9]*)
        动态链接库加载器ld-2.3.6.so、ld-linux.so.2
    cd /home/su/rootfs/bin
    arm-linux-readelf busybox | grep shared
    一般而言,系统库用到两个:动态链接器ld-linux.so和c函数库Glibc,
    Glibc包括:

    ld-linux:动态链接库,必需

    libc: 标准c函数库,必需 

    libm: 数学库,一般需要 

    libdl: 用于动态装载共享库,较少用到 

    libcrypt: 加密附加库,需要认证的程序用到,较少用 

    libpthread: POSIX线程库,一般需要 

    如果需要某个函数库,我们可以将这些库和对应的符号链接拷到目标根文件系统的/lib目录下

     
    5,文件系统中安装busybox-1.20.2.tar.bz2
    make menuconfig 

    BusyboxSettings  --->BuildOptions  --->

                    [*] BuildBusyBox as a static binary (no shared libs)

                    [ ] Force NOMMU build (NEW)

                    [ ] Build with Large File Support (foraccessing files > 2 GB)

                    (目录树的绝对路径

                    ()  Additional CFLAGS (NEW)

     
     
    二,initramfs文件系统制作
    (掉电丢失,编译进内核)
    1,内核配置菜单
        General setup-->选择 Initial RAM filesystem and RAM disk...... 项并指定目录树的路径
         device Drivers-->Block devices-->关闭 RAM block device support 项 
    2,在目录树下
    ln -s init bin/busybox
     
    三,ramdisk文件系统制作
    (在内存中进行操作,可以对里面的文件进行添加,修改,删除等等操作,若不是写入块设备则掉电丢失)
    1,打开内核配置菜单
        General setup-->选择 Initial RAM filesystem and RAM disk...... 项
        File systems-->选上<*> Second extended fs support。以提供内核对ext2文件系统的支持
        Device Drivers-->Block devices-->选择 RAM block device support 项 

        (16384) Default RAM disk size (kbytes)
    注:ramdisk大小的设置根据你bootargs传的参数而定,不是唯一的,看你自己想把ramdisk文件系统做的多大了。(16M)

    2,添加内核对nfs的支持:在内核中为256M的nandflash进行分区,修改文件arch/arm/plat-s3c24xx/common-smdk.c中的static struct mtd_partition smdk_default_nand_part[]

    3,制作映像文件
    dd if=/dev/zero of=ramdisk bs=1M count=16(生成ramdisk) 
    mke2fs -F -v -m0 ramdisk

        注:因为ramdisk只是一个块设备,只有将其格式化为特定的文件系统后才能使用,我们将其格式化ext2格式

    mkdir mnt
    sudo mount -o loop ramdisk mnt/
    rm -rf mnt/*
    sudo cp -af rootfs/* mnt/
    sudo umount ramdisk
    du -h ramdisk

    gzip ramdisk

    du -h ramdisk.gz

    说明:一般用于经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中。
     
    四,cramfs文件系统
    (只读,不能再其根目录下创建文件,若不是写在块设备上,掉电丢失)
    1,打开内核配置菜单
    File systems  --->Miscellaneous filesystems  ---><*> Compressed ROM file system support (cramfs) 
    2,制作映像文件
    mkcramfs rootfs rootfs.cramfs 
     
    五,jffs2文件系统
    1,打开内核配置菜单

     File systems  --->Miscellaneous filesystems  --->
               <*> Journalling Flash File System v2 (JFFS2) support
               (0)   JFFS2 debugging verbosity (0 = quiet, 2 = noisy)
               [*]   JFFS2 write-buffering support
               [ ]   JFFS2 summary support (EXPERIMENTAL) 
               [ ]   JFFS2 XATTR support (EXPERIMENTAL) 
               [ ]   Advanced compression options for JFFS2 

    2,制作mkfs.jffs2和mkfs.ubifs

     mkdir mtd-utiles

    cd mtd-utiles/

    sh build.sh

    cd mtd-utils-1.4.9(在mtd-utils-1.4.9中)

    sudo cp mkfs.jffs2 /usr/local/bin/

    mkfs
    mkfs.jffs2 -V
    3,制作jffs2文件系统(20M)

    sudo mkfs.jffs2 -n -s 2048 -e 128KiB -d rootfs -o rootfs.jffs2 --pad=0x1400000

    各参数的意义:

    (1)-r :指定根文件系统目录.
    (2)-o : 指定输出的根文件系统名.
    (3)-s : 指定flash每一页的大小;
    (4)-e : 指定flash的檫除块的大小,預設是64KB.

    (5)-d: 指定根目录树的路径

    4,mtd-utils

    六,ubifs文件系统制作

    1,打开配置菜单

    Device Drivers  ---> <*> Memory Technology Device (MTD) support  ---> <*>   Enable UBI - Unsorted block images  --->             

                      (4096) UBI wear-leveling threshold (NEW)                                  

                      (1)   Percentage of reserved eraseblocks for bad eraseblocks handling (NEW)

                      < >   MTD devices emulation driver (gluebi) (NEW)                         

                      [ ]   UBI debugging (NEW)                    

    File systems  --->[*] Miscellaneous filesystems  --->

                <*>   UBIFS file system support         

                 [*]     Extended attributes support     

                 [*]     Advanced compression options    

                 [*]       LZO compression support (NEW) 

                 [*]       ZLIB compression support (NEW)

                 [ ]     Enable debugging support (NEW) 
    File systems  --->Miscellaneous filesystems  ---> <> Journalling Flash File System v2 (JFFS2) support(关闭)
     
    2,制作根文件系统
    sudo cp mtd-utiles/mtd-utils-1.4.9/mkfs.ubifs/mkfs.ubifs /usr/local/bin
    sudo cp mtd-utiles/mtd-utils-1.4.9/ubi-utils/ubinize /usr/local/bin/
     
    sh build_ubifs.sh(build_ubifs.sh修改了rootfs_dir路径)
    mv ubifs-s3c2440.rootfs rootfs.ubifs
    cp rootfs.ubifs /tftp/
     
     
    七,NFS文件系统制作
    1,打开内核配置菜单

    Networking  --->Networking options  --->[*]   IP: kernel level autoconfiguration  

    File systems  --->Network File Systems  --->

            <*> NFS file system support  [*] Root file system on NFS  

    2,服务器上NFS设置:
    vim /etc/exports    //添加共享文件
    service rpcbind status命令和service nfs status命令查看相关服务的运行状态
    sudo service rpcbind restart
    sudo service nfs restart
    showmount –e        //查看服务器上共享的服务(显示可以被client挂载的共享文件夹)
    showmount -a   //显示服务器上已经与客户端连接上的目录信息
    showmount -e NFS服务器IP     //客户端使用showmount命令查询NFS的共享状态
    3,linux内核源码添加dm9000驱动

    uboot环境变量的设置

    bootargs_initramfs=console=ttyS0,115200 mem=64M init=/linuxrc rw loglevel=7'

     (注:initramfs编译进linux内核中所以不需要指定root 和initrd)

    bootargs_ramdisk=console=ttyS0,115200 mem=64M initrd=0x30800000,16M root=/dev/ram0 rw loglevel=7

    bootargs_cramfs=noinitrd root=/dev/mtdblock3 rootfstype=cramfs init=/linuxrc console=ttyS0,115200

    bootargs_jffs2=noinitrd root=/dev/mtdblock4 rootfstype=jffs2 init=/linuxrc console=ttyS0,115200

    bootargs_ubifs=console=ttyS0,115200 mem=64M ubi.mtd=6 root=ubi0:rootfs rootwait rootfstype=ubifs rw

     

    bootcmd_ramdisk=nand read 30008000 100000 400000;nand read 30800000 500000 500000;bootm 30008000

    (注:ramdisk 是加载到内存的3080000地址上运行的)

    bootcmd_initramdisk=nand read 30008000 100000 800000;bootm 30008000

    bootcmd_rootfs=nand read 30008000 100000 400000;bootm 30008000

    将内核映像和文件系统映像下载并烧入nandflash

    bkr=tftp 30008000 linuxrom-s3c2440.bin;nand erase 100000 800000;nand write 30008000 100000 800000

    bramdiskfs=tftp 30008000 ramdisk.gz;nand erase 500000 a00000;nand write 30008000 500000 500000

    bcramfs=tftp 30800000 rootfs.cramfs;nand erase f00000 600000;nand write 30800000 f00000 600000

    bjffs2=tftp 30008000 rootfs.jffs2;nand erase 1e00000 1400000;nand write.jffs2 30008000 1e00000 1400000

    bubifs=tftp 30008000 rootfs.ubifs;nand erase 6e00000 900000;nand write 30008000 6e00000 900000
     

    内核分区信息

    0x000000000000-0x000000100000 : "mtdblock0 u-boot 1MB"

    0x000000100000-0x000000500000 : "mtdblock1 kernel 4MB"

    0x000000500000-0x000000f00000 : "mtdblock2 ramdisk 10MB"

    0x000000f00000-0x000001e00000 : "mtdblock3 cramfs 15MB"

    0x000001e00000-0x000004600000 : "mtdblock4 jffs2 40MB"

    0x000004600000-0x000006e00000 : "mtdblock5 yaffs2 40MB"

    0x000006e00000-0x000009600000 : "mtdblock6 ubifs 40MB"

    0x000009600000-0x000009700000 : "mtdblock7 info 1MB"

    0x000009700000-0x00000bf00000 : "mtdblock8 apps 40MB"

    0x00000bf00000-0x00000e700000 : "mtdblock9 data 40MB"

    0x00000e700000-0x000010000000 : "mtdblock10 backup 25MB"

     

    bootargs参数传递 :http://blog.csdn.net/shlpyy/article/details/5646429

    bootargs_ramdisk=console=ttyS0,115200 mem=64M initrd=0x30800000,16M root=/dev/ram0 rw loglevel=7

    console = ttyS0       //指定了串口用串口0设备作为内核启动后首选的控制台

    115200              //波特率设置

    mem=64M           //板子内存大小为64M

    initrd=0x30800000     //指定ramdisk文件系统的在内存中的起始加载地址

    16M                 //指定ramdisk文件系统的大小,也就是这个大小,决定内核配置设置

    root=/dev/ram0        //指定文件系统挂载到哪个设备或在flash分区中的位置

    rw                  //读写权限

    loglevel=7            //七级打印

    init=/linuxrc   //指定了Linux内核启动完毕后调用的第一个、也是唯一的一个用户态进程

    注:linuxrc是一个程序,执行流程为设置信号处理函数. 初始化控制台,解析inittab文件.

    rootfstype=jffs2  

    错误记录

    1,内核打印信息显示

    rcS: applet not found

    rcS脚本写错了:# !/bin/sh  (#和!之间多加了一个空格)

    导致rcS脚本不能执行,dm9000不能启动,要手动执行S01_network脚本才能启动dm9000

    从ramdisk根文件系统启动Linux成功http://www.arm9home.net/read.php?tid-5610.html

    使用initramfs制作根文件系统启动linuxhttp://blog.sina.com.cn/s/blog_5e87dc120100pgfi.html
     
    fl2440 内核启动打印的信息 site:blog.csdn.net/
     
     
    yaffs2和最小文件系统
  • 相关阅读:
    数据分析之异常值分析-箱线图
    PHP学习路线图(转)
    学习简易爬虫设计(转)
    学习扫码登录的例子
    2017年PHP程序员未来路在何方(转)
    一个PHP开发APP接口的视频教程
    PHP实现Restful风格的API(转)
    大型网站技术架构-入门梳理(转)
    PHP面试总结(转)
    大型网站系统架构的演化(转)
  • 原文地址:https://www.cnblogs.com/zhoutian220/p/3948075.html
Copyright © 2011-2022 走看看