文章目录
什么是文件系统如何制作根文件系统文件制作busybox拷贝工具链 lib目录所需要文件拷贝工具链 usr/lib目录所需要文件制作/etc目录,创建 /etc/init.d/rcS, /etc/fstab, /etc/inittab, /etc/passwd, /etc/shadow/etc/init.d/rcS/etc/fstab/etc/inittab/etc/passwd, /etc/shadow/etc/profile/etc/group/etc/hostname/etc/hosts
添加登录密码设置用户密码:
文件系统制作Squashfs制作方式gzip & lzo & xz 压缩
Jffs2制作方式
Ubi文件系统
什么是文件系统
Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中
如何制作根文件系统文件
编译busybox拷贝工具链 lib目录所需要文件拷贝工具链 usr/lib目录所需要文件制作/etc目录,创建 /etc/init.d/rcS, /etc/fstab, /etc/inittab, /etc/passwd, /etc/shadow建立其他tmp, applicant,proc文件夹
制作busybox
下载busybox 官网:https://busybox.net/ 以君正提供Busybox为例子 make isvp_uclibc_mini_defconfig make -j make install 将_install拷贝出来,用来制作根文件系统
拷贝工具链 lib目录所需要文件
将toolchain/gcc_472/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/lib 拷贝到 要制作的文件系统目录lib中 cp -rf /junzheng/toolchain/gcc_472/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/uclibc/lib/.so ./ cp -rf /junzheng/toolchain/gcc_472/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/lib/.so ./
拷贝工具链 usr/lib目录所需要文件
将/junzheng/toolchain/gcc_472/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/usr/lib/ 目录下的文件拷贝到文件系统中/usr/lib下 cp -rf /junzheng/toolchain/gcc_472/mips-gcc472-glibc216-64bit/mips-linux-gnu/libc/usr/lib/.so ./
制作/etc目录,创建 /etc/init.d/rcS, /etc/fstab, /etc/inittab, /etc/passwd, /etc/shadow
/etc/init.d/rcS
在制作的根文件系统中 mkdir etc/init.d cd etc/init.d touch rcS 输入如下内容
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
第 1 行,表示这是一个 shell 脚本。 第 3 行, PATH 环境变量保存着可执行文件可能存在的目录,这样我们在执行一些命令或者可执行文件的时候就不会提示找不到文件这样的错误。 第 4 行, LD_LIBRARY_PATH 环境变量保存着库文件所在的目录。 第 5 行,使用 export 来导出上面这些环境变量,相当于声明一些“全局变量”。 第 7 行,使用 mount 命令来挂载所有的文件系统,这些文件系统由文件/etc/fstab 来指定,所以我们一会还要创建/etc/fstab 文件。 第 8 和 9 行,创建目录/dev/pts,然后将 devpts 挂载到/dev/pts 目录中。 第 11 和 12 行,使用 mdev 来管理热插拔设备,通过这两行, Linux 内核就可以在/dev 目录下自动创建设备节点。关于 mdev 的详细内容可以参考 busybox 中的 docs/mdev.txt 文档
chmod 777 /etc/init.d/rcS 给rcS 赋予可执行权限
如果需要检测热拔插设备需要 内核打开: CONFIG_HOTPLUG=y 并且打开执行echo /sbin/mdev > /proc/sys/kernel/hotplug
/etc/fstab
touch /etc/fstab 输入内容如下
#
proc /proc proc defaults 0 0
devpts /dev/pts devpts defaults,gid=5,mode=620 0 0
#tmpfs /dev/shm tmpfs mode=0777 0 0
tmpfs /tmp tmpfs mode=1777 0 0
tmpfs /run tmpfs mode=0755,nosuid,nodev 0 0
sysfs /sys sysfs defaults 0 0
fstab格式如下:
[file system]:要挂载的特殊的设备,也可以是块设备,比如/dev/sda 等等。 [mount point]:挂载点。 [type]:文件系统类型,比如 ext2、 ext3、 proc、 romfs、 tmpfs 等等。 [options]:挂载选项,在 Ubuntu 中输入“man mount”命令可以查看具体的选项。一般使用 defaults,也就是默认选项, defaults 包含了 rw、 suid、 dev、 exec、 auto、 nouser 和 async。 [dump]:为 1 的话表示允许备份,为 0 不备份,一般不备份,因此设置为 0。 [pass]:磁盘检查设置,为 0 表示不检查。根目录‘/’设置为 1,其他的都不能设置为 1,其他的分区从 2 开始。一般不在 fstab 中挂载根目录,因此这里一般设置为 0。
/etc/inittab
创建/etc/inittab 文件,并在 inittab 文件中输入如下内容:
# /etc/inittab
# Startup the system
::sysinit:/sbin/swapoff -a
::sysinit:/bin/mount -t tmpfs tmpfs /dev
::sysinit:/bin/mkdir -p /dev/pts
::sysinit:/bin/mkdir -p /dev/shm
::sysinit:/bin/mount -a
::sysinit:/bin/hostname -F /etc/hostname
# now run any rc scripts
::sysinit:/etc/init.d/rcS
# Put a getty on the serial port
console::respawn:/sbin/getty -L console 115200 vt100 # GENERIC_SERIAL
# Stuff to do for the 3-finger salute
#::ctrlaltdel:/sbin/reboot
# Stuff to do before rebooting
::shutdown:/bin/umount -a -r
console::respawn:/sbin/getty -L console 115200 vt100 # GENERIC_SERIAL 使用getty做用户登录 (1)使用getty做登录程序和使用login并没有明显区别,passwd和shadow文件的设置是一模一样,两个程序都是集成到busybox里的; (2)console:指定打印输出串口; (3)vt100:终端的输出格式; (4)115200 :串口的波特率;
inittab 的详细内容可以参考 busybox 下的文件 examples/inittab。 init 程序会读取/etc/inittab这个文件, inittab 由若干条指令组成。每条指令的结构都是一样的,由以“:”分隔的 4 个段组成,格式如下:
[id]:每个指令的标识符,不能重复。但是对于 busybox 的 init 来说, 有着特殊意义。对于 busybox 而言用来指定启动进程的控制 tty,一般我们将串口或者 LCD 屏幕设置为控制 tty [runlevels]: 对 busybox 来说此项完全没用,所以空着 [action]:动作,用于指定可能用到的动作 [process]: 具体的动作,比如程序、脚本或命令等。
/etc/passwd, /etc/shadow
/etc/passwd, /etc/shadow的内容参考下面制作
/etc/profile
填充如下内容
# Set PS1
if [ "$PS1" ]; then
if [ "`id -u`" -eq 0 ]; then
export PS1='[\u@\h:\W]# '
else
export PS1='[\u@\h:\W]$ '
fi
fi
# Set terminal env
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH=/system/bin:$PATH
export LD_LIBRARY_PATH=/system/lib
# Set directoty and file default create permission
umask 022
/etc/group
填充如下内容 root❌0:
/etc/hostname
填充如下内容 你想显示的名称 比如 test
/etc/hosts
填充如下内容 127.0.0.1 localhost
添加登录密码
注意busybox需要 Uer internal password and group functions rather than system function 是被选中的状态
打开/etc/inittab文件,增加::sysinit:-/bin/login命令
针对/etc/passwd
root:x:0:0:root:/root:/bin/sh
用户名:用户登录时使用。长度应在 1 到 32 个字符之间。 密码:x 字符表示加密的密码存储在 /etc/shadow 文件中。请注意,您需要使用 passwd 命令来计算在 CLI 中输入的密码的哈希值,或者在 /etc/shadow 文件中存储/更新密码的哈希值,在这种情况下,密码哈希值存储为“x”。 用户 ID ( UID ):必须为每个用户分配一个用户 ID (UID)。UID 0(零)为 root 保留,UID 1-99 为其他预定义帐户保留。另外 UID 100-999 由系统保留用于管理和系统帐户/组。 组 ID (GID):主要组 ID(存储在 /etc/group 文件中) 用户 ID 信息:评论字段。它允许您添加有关用户的额外信息,例如用户的全名、电话号码等。该字段通过手指命令使用。 主目录:用户登录时所在目录的绝对路径。如果该目录不存在,则用户目录将变为 / Command/shell:命令或 shell 的绝对路径 (/bin/bash)。通常,这是一个外壳。请注意,它不一定是外壳。arm Linux中是/bin/sh而不是/bin/bash。
shadow文件中内容为:
root:Wdfdfqwe:17226:::::
第一段表示登录的用户名 第二段表示密文密码。
设置用户密码:
passwd root 之后输入该用户的密码,之后在shadow中就会生成密文密码,你是无法知道具体含义的,生成密文密码后,可以将shadow文件中的密文密码放入到制作根文件系统的文件夹中,然后烧录以便不用每次都设置密码
密码内容我在python的交互模式下生成:
>>> __import__("crypt").crypt("123456","$5$vaALBbZ3z6nsQE0Q$")
'$5$vaALBbZ3z6nsQE0Q$DqZoXKkiRropyxtAYL80EQXTozNcYQULDgtqUUS1aa1'
crypt 参数1为密码明码:123456 crypt 参数2为摘要算法和盐值,用$符号隔开: 1 表示摘要算法为MD5(5表示SHA-256,6表示SHA-512) vaALBbZ3z6nsQE0Q表示盐值(大家可以随便设置,最多8位)
文件系统制作
文件系统格式有三种:
SquashfsJffs2Ubi文件系统
Squashfs
SquashFS是一套基于Linux内核使用的压缩只读文件系统。该文件系统能够压缩系统内的文档,inode以及目录,文件最大支持2^64字节
制作方式
mksquashfs root-uclibc xxx.squashfs -comp xz mksquashfs 是制作文件系统的工具 root-uclibc需要压缩的文件系统 文件夹 xxx.squashfs输出的可烧录的压缩文件 -comp xz 压缩格式: gzip (默认), lzo, xz 注意其中-b缺省,默认为128KB块大小,可指定
gzip & lzo & xz 压缩
gzip & lzo & xz【可以理解为不同压缩软件比如rar, 7z等等】 三大类型压缩算法对比
Jffs2
主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。
制作方式
mkfs.jffs2 -o xxx.jffs2 -r root-uclib -e 0x10000 -s 0x1000 -n -l -x zlib --pad mkfs.jffs2:制作jffs2文件系统的工具 -o xxx.jffs2 : 输出的可烧录压缩文件 -r root-uclib: 输入的要压缩的文件夹 -e 0x10000:设定擦除块的大小为(默认: 64KB) -s 0x1000:设定擦除块的大小为(默认: 64KB) -n:指明不添加清楚标记(nand flash 有自己的校检块,存放相关的信息。) 如果挂载后会出现类似:CLEANMARKER node found at 0x0042c000 has totlen 0xc != normal 0x0 的警告,则加上-n 就会消失 -l:指定使用小端格式 -x zlib:指压缩格式 –pad:通常用 16 进制表示输出文件系统大小,不足部分用 0xff 补充
Ubi文件系统
在某种程度上,UBIFS可以被认为是JFFS2文件系统的下一代。 可以在其上运行标准文件系统,如ext2/ext3/ext4 等
制作方式: mkfs.ubifs -e 0x1f000 -c 568 -m 2048 -d config/ -o config.ubifs -v