根文件系统制作1

时间:2022-07-25 09:05:37
主要参考<嵌入式文件系统制作和移植-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制作根文件系统启动linux http://blog.sina.com.cn/s/blog_5e87dc120100pgfi.html
 
fl2440 内核启动打印的信息 site:blog.csdn.net/
 
 
yaffs2和最小文件系统