首頁  >  文章  >  系統教程  >  Linux根檔案系統的秘密

Linux根檔案系統的秘密

WBOY
WBOY轉載
2024-02-15 13:42:051265瀏覽

Linux是一種開源、可移植、可自訂的作業系統,它廣泛應用於各種領域,如伺服器、桌面、嵌入式裝置等。 Linux的核心是內核,它負責管理硬體資源和提供基本的服務。但是,核心並不是一個獨立的實體,它需要一個檔案系統來儲存和存取各種資料和程式。檔案系統是一種組織和管理檔案的方法,它定義了檔案的名稱、位置、屬性、權限等資訊。在Linux中,有許多不同類型的檔案系統,如ext4、xfs、btrfs等,它們各有特點和優勢。但是,在所有的檔案系統中,有一個特殊的檔案系統,它是Linux系統的基礎和核心,它就是根檔案系統(rootfs)。那麼,根檔案系統是什麼?它有什麼作用?它又是如何創建和管理的呢?本文將從以下幾個面向來解答:

Linux根檔案系統的秘密

#1.根檔案系統

#檔案系統是包含在一個磁碟(包括光碟、磁碟機、隨身碟及其它儲存裝置)或分割區的目錄結構;一個可套用的磁碟裝置可以包含一個或多個檔案系統;如果您想進入一個檔案系統,首先您要做的是掛載(mount)檔案系統;為了掛載(mount)檔案系統,您必須指定一個掛載點。

附註:對於我們應用開發來說,購買開發板的時候,廠商會提供好現成的根文件系統和BootLoader等,如果需要,我們可以改變其中的命令而無需從頭開始製作一個新的根文件系統。不過這兒的製作過程可以讓我們更深一點理解Linux的檔案系統。

2.主要的根檔案系統

#* Linux 中,rootfs 是不可或缺的。 PC 上主要實作有ramdisk 和直接掛載HD(Harddisk,硬碟)上的根檔案系統;嵌入式中一般不從HD 啟動,而是從Flash 啟動,最簡單的方法是將rootfs load 到RAM 的RAMDisk,稍微複雜的就是直接從Flash 讀取的Cramfs,更複雜的是在Flash 上分割區,並建置JFFS2 等檔案系統。

* RAMDisk 將製作好的 rootfs 壓縮後寫入 Flash,啟動的時候由 Bootloader load 到RAM,解壓縮,然後掛載到 /。這種方法操作簡單,但是在 RAM 中的檔案系統不是壓縮的,因此需要佔用許多嵌入式系統中稀有資源 RAM。

ramdisk 就是用記憶體空間來模擬出硬碟分割區,ramdisk通常使用磁碟檔案系統的壓縮存放在flash中,在系統初始化時,解壓縮到SDRAM並掛載根檔案系統, 在linux系統中,ramdisk有二種,一種就是可以格式化並載入,在linux核心2.0/2.2就已經支援,其不足之處是大小固定;另一種是2.4的核心才支援,透過,ramfs來實現,他不能被格式化,但用起來方便,其大小隨所需的空間增加或減少,是目前linux常用的ramdisk技術。

* initrd 是RAMDisk 的格式,kernel 2.4 之前都是image-initrd,Kernel 2.5 引入了cpio-initrd,大大簡化了Linux 的啟動過程,附合Linux 的基本哲學:Keep it simple, stupid(KISS) . 不過cpio-initrd 作為新的格式,還沒有經過廣泛測試,嵌入式Linux 中主要採用的還是image-initrd。

* Cramfs 是 Linus 寫的很簡單的檔案系統,有很好的壓縮綠,也可以直接從 Flash 上運行,不須 load 到 RAM 中,因此節約了 RAM。但 Cramfs 是唯讀的,對於需要執行時修改的目錄(如: /etc, /var, /tmp)多有不便,因此,一般將這些目錄做成ramfs 等可寫的 fs。

* SquashFS 是 Cramfs 的增強。突破了 Cramfs 的一些限制,在 Flash 和 RAM 的使用量方面也具有優勢。不過,根據開發者介紹,在效能上可能不如 Cramfs。這也是一種新方法,在嵌入式系統採用之前,需要經過更多的測試。

3.Ramdisk製作

#RAMDisk的製作方法如下:
(1) 在PC機的Linux作業系統環境下,產生可以虛擬成區塊裝置的文件,假設文件名稱為init.img。

$ dd if=/dev/zero of=init.img bs=4096 count=1024

其中bs*count為區塊裝置大小(單位:位元組),產生init.img檔案以後,還必須對該檔案進行格式化。

$ mke2fs –m0 –F 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

4.Cramfs制作

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

5.其他根文件系统的制作

制作yaffs文件系统: mkyaffsimage myroots myroots.img
制作squashfs: mksquashfs $(FS_DIR) $(FS_NAME) -noappend -be -lzma -no-fragments –noI

6.BusyBox编译制作

建立目标板空根目录文件夹及根目录下的文件夹:

[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中文網其他相關文章!

陳述:
本文轉載於:lxlinux.net。如有侵權,請聯絡admin@php.cn刪除