rootfs
根目录&&根文件系统
根目录:倒立的目录树,在 Linux 中,所有的目录都属于根目录
根文件系统:挂载在根目录下面的文件系统
什么是根文件系统
根文件系统是 Kernel 启动后第一个加载的文件系统
根文件系统的作用
Kernel 启动后,总得先挂载一个文件系统,这样其它文件系统才能被挂载和使用。
所以,根文件系统,为其它文件系统提供挂载点,是一个载体。挂载点就是一个个目录。
根文件系统包含哪些内容
- 基本的目录结构
- 启动程序:init=/linuxrc
- 配置文件
为什么要这样设计
- 扩展性好,VFS 设计,
- Linux 一切皆文件,为了让 Linux 完整地启动,进入一个可以让用户操作的环境
文件系统需要那些东西
- bootloader 使用命令行参数,告诉内核,根文件系统在什么地方;什么样的格式
- 告诉 Kernel 第一个启动的应用程序
- 基本目录
- 配置文件
怎样构建文件系统
从零开始
一、创建基本目录和启动程序 linuxrc
$ mkdir mini_rootfs
$ cd mini_rootfs
$ mkdir bin dev etc lib proc usr var
$ ls
bin dev etc lib proc usr var
交叉编译一个 ARM 板可用的 busybox,这里为了简单直接从已有的 ARM 板系统中拷了一个
$ ln -sf bin/busybox linuxrc
二、搭建 NFS 服务器
三、ARM 板设置内核启动参数
setenv bootargs 'root=/dev/nfs nfsroot=192.168.31.228:/home/liyongjun/tmp/mini_rootfs ip=192.168.31.6 init=/linuxrc console=ttySAC0,115200'
saveenv
reset
四、重启报错
/init: line 103: can't open /r/dev/console: no such file
Kernel panic - not syncing: Attempted to kill init!
解决
sudo mknod console c 5 1
五、重启报错
switch_root: bad init /linuxrc: No such file or directory
Kernel panic - not syncing: Attempted to kill init!
解决
scp root@192.168.31.5:/lib/libcrypt.so.1 ./lib
scp root@192.168.31.5:/lib/libc.so.6 ./lib
scp root@192.168.31.5:/lib/libm.so.6 ./lib
scp root@192.168.31.5:/lib/ld-linux.so.3 ./lib
六、重启可进入系统,但报错且没有sh
can't run '/etc/init.d/rcS': No such file or directory
can't open /dev/tty3: No such file or directory
Please press Enter to activate this console.
can't open /dev/tty2: No such file or directory
can't open /dev/tty4: No such file or directory
can't open /dev/tty4: No such file or directory
can't open /dev/tty2: No such file or directory
can't open /dev/tty3: No such file or directory
can't open /dev/tty3: No such file or directory
can't open /dev/tty4: No such file or directory
can't open /dev/tty2: No such file or directory
解决
$ ln -sf busybox sh
$ ln -sf busybox ls
$ ln -sf busybox cat
$ touch etc/init.d/rcS
$ chmod +x rcS
$ cd ../dev/
$ touch tty2 tty3 tty4
七、重启进入系统,有 sh
成功
八、完善
$ ln -sf busybox rm
$ ln -sf busybox ifconfig
$ ln -sf busybox ping
$ ln -sf busybox route