ホームページ >システムチュートリアル >Linux >Linux ルート ファイル システムの秘密
Linux は、サーバー、デスクトップ、組み込みデバイスなどのさまざまな分野で広く使用されている、オープンソースでポータブルなカスタマイズ可能なオペレーティング システムです。 Linux の中核はカーネルであり、ハードウェア リソースの管理と基本サービスの提供を担当します。ただし、カーネルは独立したエンティティではなく、さまざまなデータやプログラムを保存しアクセスするためにファイル システムを必要とします。ファイル システムは、ファイルを整理および管理する方法であり、ファイルの名前、場所、属性、権限、その他の情報を定義します。 Linux には、ext4、xfs、btrfs など、さまざまな種類のファイル システムがあり、それぞれに独自の特徴と利点があります。ただし、すべてのファイル システムの中に、Linux システムの基盤および中核となる特別なファイル システムがあり、それがルート ファイル システム (rootfs) です。では、ルート ファイル システムとは何でしょうか?それは何をするためのものか?どのように作成され、管理されているのでしょうか?この記事では、次の側面から質問に答えます:
ファイル システムは、ディスク (光ディスク、フロッピー ディスク、フラッシュ ディスク、その他のストレージ デバイスを含む) またはパーティションに含まれるディレクトリ構造です。該当するディスク デバイスには 1 つ以上のファイル システムを含めることができます。ファイル システムをマウントするには、最初にファイル システムをマウントする必要があります。ファイル システムをマウントするには、マウント ポイントを指定する必要があります。
注: 私たちのアプリケーション開発では、開発ボードを購入すると、メーカーから既製のルート ファイル システムとブートローダーが提供されます。必要に応じて、新しいルート ファイルを最初から作成せずにコマンドを変更できます。ただし、ここでの作成プロセスにより、Linux ファイル システムについてより深く理解できるようになります。
* Linux では rootfs は必須です。 PC は主に RAM ディスクを実装し、ルート ファイル システムを HD (ハードディスク、ハード ディスク) に直接マウントします。組み込みシステムは通常、HD からではなくフラッシュから起動します。最も単純な方法は、rootfs を RAM の RAMDisk にロードすることです。少し複雑です。 1 つはフラッシュから Cramfs を直接読み取る方法で、より複雑な方法はフラッシュ上にパーティションを作成して JFFS2 などのファイル システムを構築する方法です。
* RAMDisk は、準備された rootfs を圧縮してフラッシュに書き込みます。起動時に、ブートローダーはそれを RAM にロードし、解凍して、/ にマウントします。この方法は操作が簡単ですが、RAM 内のファイル システムは圧縮されていないため、多くの組み込みシステムでは希少なリソースである RAM が必要です。
ramdisk はメモリ スペースを使用してハードディスク パーティションをシミュレートします。Ramdisk は通常、ディスク ファイル システム圧縮を使用し、フラッシュに保存されます。システムの初期化中に、SDRAM に解凍され、ルート ファイル システムにマウントされます。Linux システムでは、ramdisk には1 つはフォーマットとロードが可能で、Linux カーネル 2.0/2.2 ですでにサポートされていますが、欠点はサイズが固定であることです。もう 1 つは 2.4 カーネルでのみサポートされ、ramfs を通じて実装されます。フォーマットすることはできませんが、使いやすく、必要な容量に応じてサイズが増減するため、現在 Linux で一般的に使用されている RAM ディスク技術です。
* initrd は RAMDisk のフォーマットです。カーネル 2.4 より前は、image-initrd でした。カーネル 2.5 では cpio-initrd が導入されました。これにより、Linux の起動プロセスが大幅に簡素化され、Linux の基本哲学「シンプルに、愚かにせよ」に準拠しました ( KISS) ただし、cpio-initrd は新しい形式であるため、十分にテストされておらず、Image-initrd は主に組み込み Linux で使用されています。
* Cramfs は Linus によって書かれた非常にシンプルなファイル システムで、圧縮率が高く、RAM にロードせずにフラッシュから直接実行することもできるため、RAM を節約できます。ただし、Cramfs は読み取り専用なので、実行時に変更が必要なディレクトリ (/etc、/var、/tmp など) には不便なので、これらのディレクトリは ramfs などの書き込み可能な fs にするのが一般的です。
* SquashFS は Cramfs の拡張機能です。 Cramfs のいくつかの制限を克服し、フラッシュと RAM の使用に関しても利点があります。ただし、開発者によると、パフォーマンスの点では Cramfs ほど優れていない可能性があります。これは新しいアプローチでもあり、組み込みシステムに採用する前にさらなるテストが必要になります。
RAMDiskの作成方法は次のとおりです。
(1) PC の Linux OS 環境で、ブロックデバイスに仮想化できるファイルを生成します (ファイル名は 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 システムの秘密であり、Linux システムに安定した柔軟な基盤を提供します。
以上がLinux ルート ファイル システムの秘密の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。