当前位置:   article > 正文

如何构造linux根文件系统_nsenter.c:(.text.nsenter_main+0x184): undefined re

nsenter.c:(.text.nsenter_main+0x184): undefined reference to `setns

1. 什么是linux根文件系统?

这个概念其实我也花了很久才明白,一开始一直分不清根文件系统与yaffs文件系统、ex2文件系统、jffs2文件系统的区别,下面就讲讲这个linux根文件系统到底是何方神圣。我们拿windows下的定义来类比吧,因为大部分人对windows操作系统还是比较熟悉的。

文件系统就是把闪存中地址与数据的关系按照一定的规则组织起来,对用户提供一个比较方便的操作接口。可以想想,如果没有文件系统,你想要在你的PC的D盘里找一个视频文件,那就需要你自己去对D盘进行寻址,再取出对应地址的数据,这样是不是很麻烦呢?而文件系统的出现就让用户对闪存的操作变得简单。PC上硬盘的文件系统一般是NTFS类型的。而对于linux系统,需要根据系统使用的闪存类型来决定使用什么类型的文件系统。常见的linux文件系统有:fat16、fat32、ntfs、ext2、ext3、jffs2、yaffs等。这个文件系统的区别是在存储文件时遵循的规则是不一样的。

                

那么既然linux文件系统的类型有很多,那根文件系统又是啥呢?首先可以确认的是根文件系统一定是有文件系统类型的,而且文件类型也就是fat16、fat32、ntfs、ext2、ext3、jffs2、yaffs这些。那根文件系统与普通的文件系统有什么区别呢?区别就在于

根文件系统是linux内核启动后第一个挂载的文件系统,是其他文件系统的根源。根文件系统主要包含内核启动后运行的第一个程序(init)、给用户提供操作界面的shell程序以及应用程序所依赖的库等内容。要想挂载其他文件系统,就必须得再根文件系统成功挂载后才可以。根文件系统核心就在一个“根”上面。

既然理解了什么是根文件系统,那就容易理解yaffs类型的根文件系统、jffs2型的文件系统,也就是把根文件系统的必需模块按照yaffs、jffs2类型来存储而已。

2. 如何构造根文件系统?

所谓制作根文件系统,就是创建各种目录,并在里面创建各种文件。比如在/bin、/sbin目录下存放可执行程序,在/etc中存放配置文件等。

现在构造根文件系统的方法比较多,有基于busybox的,有基于buildroot的。这里针对基于busybox来讲吧。busybox是一个遵循GPL V2协议的开源项目。busybox将许多UNIX命令集合进一个很小的可执行程序中。知道为什么你可以在linux的命令行中执行 ls 就可以显示文件吗?这个 ls命令就是由busybox实现的。所有有现成的工具一定要学会使用,不然你自己从头写一个 ls的程序,太浪费时间了。

  • 下载、解压busybox

busybox的下载地址为:https://busybox.net/

目前最新的busybox版本是busybox-1.32.1,后面的操作都是基于busybox-1.32.1来进行的。

解压busybox

tar xjvf busybox-1.32.1.tar.bz2
  • 配置busybox

在busybox的文件夹中有个INSTALL文件,里面介绍了如何配置和编译busybox,建议可以去看看。

利用"make menuconfig"命令即可进入配置界面。对于没有特殊要求的根文件系统,一般只需要修改以下几个部分:

1)Cross compile prefix中指定交叉编译工具链

2) 编译选项中选择为静态编译,静态编译出来的文件系统会比动态编译出来的文件系统更大,这事因为静态编译直接将busybox需要的库文件直接编译进文件系统了,在拷贝根文件系统时就无需关心动态库了。而动态编译还需要将gloibc的库复制到根文件系统的/lib目录下。

  • 编译和安装busybox

直接执行“make”命令就可以编译busybox了,但这时编译会报错,报错内容是

  1. util-linux/lib.a(nsenter.o): In function `nsenter_main':
  2. nsenter.c:(.text.nsenter_main+0x184): undefined reference to `setns'
  3. coreutils/lib.a(sync.o): In function `sync_common':
  4. sync.c:(.text.sync_common+0x34): undefined reference to `syncfs'

这个问题目前只能通过在配置中将此文件忽略来避免,就是在“make menuconfig”时,将这两项取消掉。再进行make。

  1. Symbol: NSENTER [=y] │
  2. │ Prompt: nsenter (6.5 kb) │
  3. │ Defined at util-linux/Config.in:699
  4. Location: │
  5. │ -> Linux System Utilities │
  6. │ Selects: PLATFORM_LINUX
  1. Symbol: SYNC [=y] │
  2. │ Prompt: sync (3.8 kb) │
  3. │ Defined at coreutils/Config.in:652
  4. Location: │
  5. │ -> Coreutils

再执行“make install”命令来安装busybox。那么busybox会安装到哪里去呢?其实在“make menuconfig”中可以指定安装的路径,但如果没指定的话,就会安装到/_install目录下。

可以看到在_install目录下,已经有很多可执行文件了,剩下的就需要我们在这个目录下再创建一些目录和文件了。

1)创建etc/inittab文件

仿照busybox的exampiles/inittab文件,在/_install文件夹中创建inittab文件,内容如下:

  1. #this is run first except when booting in single-user mode.
  2. ::sysinit:/etc/init.d/rcS
  3. # /bin/sh invocations on selected ttys
  4. # start an "askfirst" shell on the console (whatever that may be)
  5. ::askfirst:-/bin/sh
  6. # stuff to do when restarting the init process
  7. ::restart:/sbin/init
  8. # stuff to do before rebooting
  9. ::ctrlaltdel:/sbin/reboot

2)创建etc/init.d/rcS文件

  1. #!/bin/sh
  2. echo "Starting rcS..."
  3. echo "++ Mounting filesystem"
  4. mount -t proc none /proc
  5. mount -t sysfs none /sys
  6. mount -t tmpfs none /tmp
  7. echo "++ Setting up mdev"
  8. echo /sbin/mdev > /proc/sys/kernel/hotplug
  9. mdev -s
  10. mkdir -p /dev/pts
  11. mkdir -p /dev/i2c
  12. mount -t devpts devpts /dev/pts
  13. echo "rcS Complete"

最后要改变它的属性:chmod +x etc/init.d/rcS。

3) 创建etc/fstab文件

  1. LABEL=/ / tmpfs defaults 0 0
  2. none /dev/pts devpts gid=5,mode=620 0 0
  3. none /proc proc defaults 0 0
  4. none /sys sysfs defaults 0 0
  5. none /tmp tmpfs defaults 0 0

4)创建一些空目录,比如proc、mnt、tmp等等。到此其根文件系统的必需文件就弄完了,接下来就需要将和_install目录中的内容格式化某种文件类型,就可以了。

所谓制作文件系统映像文件,就是将一个目录下的所有内容按照一定的格式存放到一个文件中,这文件可以直接烧写到存储设备上去,当系统启动后挂载这个设备,就可以看到与原来目录一样的内容。

制作不同类型的文件系统映像文件需要使不同的工具。

3. 制作ramdisk根文件系统

ramdisk文件系统就是ext2格式的文件系统,制作ramdisk文件系统就是将根文件按照ext2规则来存储。

  1. $ dd if=/dev/zero of=ramdisk.image bs=1024 count=16384
  2. $ mke2fs -F ramdisk.image -L "ramdisk" -b 1024 -m 0
  3. $ tune2fs ramdisk.image -i 0
  4. $ chmod 777 ramdisk.image

挂载ramdisk

新建一个rootfs目录, 并将ramdisk.image挂载到rootfs目录:

  1. $ mkdir rootfs
  2. $ chmod u+rwx ramdisk.image
  3. $ sudo mount -o loop ramdisk.image rootfs

将制作好的根文件系统全部拷贝到rootfs目录下:

$ cp -af root/* rootfs/*

打包ramdisk

卸载rootfs, 并打包ramdisk.image:

  1. $ sudo umount rootfs
  2. $ gzip ramdisk.image
  3. $ mkimage -A arm -T ramdisk -C gzip -d ramdisk.image.gz uramdisk.image.gz

将生成的uramdisk.image.gz下载到嵌入式设备上,启动后就可以看到根文件系统了。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/173673
推荐阅读
相关标签
  

闽ICP备14008679号