Linux는 서버, 데스크탑, 임베디드 장치 등 다양한 분야에서 널리 사용되는 오픈 소스, 휴대용, 사용자 정의 가능한 운영 체제입니다. 리눅스의 핵심은 하드웨어 자원을 관리하고 기본적인 서비스를 제공하는 커널이다. 그러나 커널은 독립적인 개체가 아니며 다양한 데이터와 프로그램을 저장하고 액세스하려면 파일 시스템이 필요합니다. 파일 시스템은 파일의 이름, 위치, 속성, 권한 및 기타 정보를 정의하고 구성하는 방법입니다. Linux에는 ext4, xfs, btrfs 등과 같은 다양한 유형의 파일 시스템이 있으며 각각 고유한 특성과 장점을 가지고 있습니다. 그러나 모든 파일 시스템 중에는 리눅스 시스템의 기초이자 핵심인 특별한 파일 시스템이 있는데, 바로 루트 파일 시스템(rootfs)이다. 그렇다면 루트 파일 시스템은 무엇입니까? 그것은 무엇을 합니까? 어떻게 생성되고 관리되나요? 이 기사에서는 다음 측면의 질문에 답할 것입니다.
파일 시스템은 디스크(광 디스크, 플로피 디스크, 플래시 디스크 및 기타 저장 장치 포함) 또는 파티션에 포함된 디렉터리 구조입니다. 파일 시스템에 들어가려는 경우 해당 디스크 장치에는 하나 이상의 파일 시스템이 포함될 수 있습니다. , 가장 먼저 해야 할 일은 파일 시스템을 마운트하는 것입니다. 파일 시스템을 마운트하려면 마운트 지점을 지정해야 합니다.
참고: 애플리케이션 개발을 위해 개발 보드를 구매할 때 제조업체에서 기성 루트 파일 시스템과 BootLoader를 제공합니다. 필요한 경우 처음부터 새로운 루트 파일 시스템을 만들지 않고도 명령을 변경할 수 있습니다. 그러나 여기서의 생산 프로세스를 통해 Linux 파일 시스템에 대한 더 깊은 이해를 얻을 수 있습니다.
* Linux에서는 rootfs가 필수적입니다. PC는 주로 램디스크를 구현하고 HD(하드디스크, 하드디스크)에 루트 파일 시스템을 직접 마운트합니다. 임베디드 시스템은 일반적으로 HD에서 부팅하지 않고 플래시에서 부팅하는 가장 간단한 방법은 RAM의 RAMDisk에 로드하는 것입니다. 하나는 플래시에서 직접 Cramfs를 읽는 것이고, 더 복잡한 것은 플래시에서 파티션을 나누고 JFFS2와 같은 파일 시스템을 구축하는 것입니다.
* RAMDisk는 준비된 rootfs를 압축하여 플래시에 씁니다. 시작하는 동안 부트로더는 이를 RAM에 로드하고 압축을 푼 다음 /에 마운트합니다. 이 방법은 조작이 간단하지만 RAM의 파일 시스템이 압축되지 않아 많은 임베디드 시스템에서 부족한 리소스인 RAM이 필요합니다.
ramdisk는 메모리 공간을 사용하여 하드 디스크 파티션을 시뮬레이션합니다. Ramdisk는 일반적으로 디스크 파일 시스템 압축을 사용하며 플래시에 저장됩니다. 시스템 초기화 중에 압축이 풀려 루트 파일 시스템으로 마운트됩니다. ramdisk 중 하나는 포맷하고 로드할 수 있으며 이미 Linux 커널 2.0/2.2에서 지원된다는 점입니다. 다른 하나는 2.4 커널에서만 지원되며 ramfs를 통해 구현될 수 없다는 것입니다. 그러나 사용하기 쉽고 필요한 공간에 따라 크기가 증가하거나 감소합니다. 현재 Linux에서 일반적으로 사용되는 램디스크 기술입니다.
* initrd는 RAMDisk의 형식입니다. 커널 2.4 이전에는 image-initrd였습니다. 커널 2.5에서는 Linux 시작 프로세스를 크게 단순화하고 Linux의 기본 철학인 단순하고 멍청하게 유지하세요(KISS)를 준수했습니다. 그러나 새로운 형식인 cpio-initrd는 임베디드 Linux에서 주로 사용되지 않습니다.
* Cramfs는 Linus가 작성한 매우 간단한 파일 시스템으로 압축률이 뛰어나며 RAM에 로드하지 않고도 Flash에서 직접 실행할 수 있어 RAM을 절약할 수 있습니다. 그러나 Cramfs는 읽기 전용이므로 런타임에 수정해야 하는 디렉터리(예: /etc, /var, /tmp)에는 불편합니다. 따라서 이러한 디렉터리는 일반적으로 ramfs와 같은 쓰기 가능한 fs로 만들어집니다.
* SquashFS는 Cramfs의 향상된 기능입니다. Cramfs의 일부 한계를 극복하고 플래시 및 RAM 사용 측면에서도 장점이 있습니다. 그러나 개발자에 따르면 성능면에서는 Cramfs만큼 좋지 않을 수 있습니다. 이는 임베디드 시스템에 채택되기 전에 더 많은 테스트가 필요한 새로운 접근 방식이기도 합니다.
RAMDisk를 만드는 방법은 다음과 같습니다.
(1) PC의 Linux 운영체제 환경에서 블록디바이스로 가상화할 수 있는 파일을 생성한다. 파일명은 init.img라고 가정한다.
bs*count는 블록 장치 크기(단위: 바이트)입니다. init.img 파일을 생성한 후 파일 형식도 지정해야 합니다.
으아악(2) 새 폴더 ram을 만들고 init.img를 ram 디렉토리에 첨부합니다.
$ mkdir ram $ mount init.img ram/ -o loop
这时,读写ram目录,等效于读写init.img文件。用户可以将根文系统所需的文件写入到ram目录中。往ram目录写完文件以后,还需要使用umount ram命令卸载init.img,才能将已写入的文件保存到init.img中。
(3)添加完毕,需要umount ram
CramFS(Compressed Rom File System)是Linux Torvalds在Transmeta任职时,所参与开发的文件系统。它是针对Linux内核2.4之后的版本所设计的一种新型只读文件系统,采用了zlib 压缩,压缩比一般可以达到1:2,但仍可以作到高效的随机读取,Linux系统中,通常把不需要经常修改的目录压缩存放,并在系统引导的时候再将压缩文件 解开。因为Cramfs不会影响系统的读取文件的速度,而且是一个高度压缩的文件系统。因此非常广泛应用于嵌入式系统中。
在嵌入式的 环境之下,内存和外存资源都需要节约使用。如果使用RAMDISK方式来使用文件系统,那么在系统运行之后,首先要把Flash上的映像文件解压缩到内存 中,构造起RAMDISK环境,才可以开始运行程序。但是它也有很致命的弱点。在正常情况下,同样的代码不仅在Flash中占据了空间(以压缩后的形式存 在),而且还在内存中占用了更大的空间(以解压缩之后的形式存在),这违背了嵌入式环境下尽量节省资源的要求。
使用CramFS文件 系统就是一种解决这个问题的方式。CramFS是一个压缩格式的文件系统,它并不需要一次性地将文件系统中的所有内容都解压缩到内存之中,而只是在系统需 要访问某个位置的数据的时候,马上计算出该数据在CramFS中的位置,将它实时地解压缩到内存之中,然后通过对内存的访问来获取文件系统中需要读取的数 据。CramFS中的解压缩以及解压缩之后的内存中数据存放位置都是由CramFS文件系统本身进行维护的,用户并不需要了解具体的实现过程,因此这种方 式增强了透明度,对开发人员来说,既方便,又节省了存储空间。
但是Cramfs也有其缺点:延迟、小于16MB、不支持写,只支持PAGE_CREATE_SIZE=4096的内核。
制作的命令:(root文件夹中存放着文件系统)
#mkcramfs root cramfs.img
制作yaffs文件系统: mkyaffsimage myroots myroots.img 制作squashfs: mksquashfs $(FS_DIR) $(FS_NAME) -noappend -be -lzma -no-fragments –noI
建立目标板空根目录文件夹及根目录下的文件夹:
[root@190 friendly-arm]# mkdir myroots [root@190 friendly-arm]#pwd /friendly-arm/myroots [root@190 friendly-arm]#cd myroots [root@190 myroots]# mkdir bin sbin usr lib dev mnt opt root etc home proc tmp var [root@190 myroots]# mkdir etc/init.d
进入etc/init.d目录下,建立一个脚本文件,并命名为rcS,用gedit打开,添加如下内容:
#! /bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin: runlevel=S prevlevel=N umask 022 export PATH runlevel prevlevel # # Trap CTRL-C &c only in this shell so we can interrupt subprocesses. # trap ":" INT QUIT TSTP
创建 dev 中的节点
如果使用“linux 2.6.xx”的内核,应该事先创建节点“console”、“null”。否则在系统启动时内容会提示以下错误:
Warning: unable to open an initial console. Kernel panic - not syncing: Attempted to kill init!
创建节点的命令如下:
# mknod dev/console c 5 1 # mknod dev/null c 1 3 移植Busybox:
进入到压缩文件存放的目录下,并解压。然后进入解压后的busybox目录文件夹,随后配置busybox 。
[root@190 busybox-1.2.0]# make menuconfig
由于每个版本的配置选项组织有所不同。不管怎样,我们注意以下选项就行了:
1) Support for devfs 2) Build BusyBox as a static binary ( no shared libs ) //将busybox编译成静态链接 3) Do you want to build busybox with a Cross Compile? (/usr/local/arm/3.3.2/bin/arm-linux-) Cross Compile prefix //指定交叉编译器 4) init 5) Support reading an inittab file //支持init读取/etc/inittab 配置文件 6) (X) ash选中ash //建立的rcS脚本才能执行 7)ash 8)cp cat ls mkdir mv //可执行命令工具的选择,自己看着办吧,需要用到的就选上 9) mount 10) umount 11) Support loopback mounts 12) Support for the old /etc/mtab file 13) insmod 14) Support version 2.2.x to 2.4.x Linux kernels 15) Support version 2.6.x Linux kernels 16) vi 17)don’t use user
以上内容必须选上,其他可按默认值;如果要支持其他功能,如网络支持等,可按需选择,英语不是很烂的话,这些都没有问题。
配置好之后,保存退出。然后对其编译和安装到刚才建立的根文件系统目录下:
[root@190 busybox-1.2.0] make TARGET_ARCH=arm CROSS=arm-linux- \ PREFIX=/friendly-arm/myroots/ all install
安装好之后,将相应的二进制文件拷贝到根文件系统相应的目录下:
拷贝一些管理员控制程序到/sbin目录下,最重要的就是要包含一个init命令;
拷贝应用程序运行时所需要的库到/lib,库文件可以从PC机上的交叉编译工具安装目录下拷贝,如libc-2.2.2.so、libcryt-2.2.2.so、libm-2.2.2.so、libutil-2.2.2.so等,为部分相应库建立快捷方式,提供一些应用程序按快 捷方式名称调用。值得注意的是C库要采用C库的版本glibc, glibc位于/lib/libc.so.6
위의 분석을 통해 루트 파일 시스템은 Linux 시스템의 중요한 부분임을 알 수 있습니다. 여기에는 Linux 시스템의 시작 및 작동에 필요한 주요 파일과 디렉터리가 포함되어 있습니다. 루트 파일 시스템은 일반적으로 /(루트) 디렉터리에 마운트되며 다른 파일 시스템에 대한 마운트 지점을 포함할 수 있습니다. 루트 파일 시스템은 다양한 유형의 파일 시스템 형식을 사용할 수 있으며 다양한 도구를 통해 생성 및 관리될 수 있습니다. 예를 들어, mkfs 명령을 사용하여 파티션이나 장치를 루트 파일 시스템으로 포맷할 수 있고, mount 명령을 사용하여 루트 파일 시스템을 마운트하거나 마운트 해제할 수 있으며, df 명령을 사용하여 루트의 사용법을 볼 수 있습니다. 파일 시스템 등 한마디로 루트 파일 시스템은 리눅스 시스템에 안정적이고 유연한 기반을 제공하는 리눅스 시스템의 비밀이다.
위 내용은 Linux 루트 파일 시스템의 비밀의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!