導航:首頁 > 操作系統 > linux文件系統的實現

linux文件系統的實現

發布時間:2023-02-24 16:16:42

㈠ 如何在linux上實現文件系統的自動檢查和修復

我在本教程中將介紹如何藉助fsck工具,實現文件系統的自動檢查。 系統一啟動,就觸發文件系統自動檢查機制 如果你希望系統一啟動,就自動觸發fsck,那麼有一些方法可以設置在啟動過程中實現無人值守的fschk,這些方法具體取決於特定的Linux發行版。 在Debian、Ubuntu或Linux Mint上,編輯/etc/default/rcS,如下所示。 $ sudo vi /etc/default/rcS # 啟動過程中,自動修復出現不一致性的文件系統 FSCKFIX=yes 在CentOS上,使用下列內容,編輯/etc/sysconfig/autofsck(要是它沒有,就創建)。 $ sudo vi /etc/sysconfig/autofsck AUTOFSCK_DEF_CHECK=yes 強制定期檢查文件系統 如果文件系統很龐大,你可以強制定期檢查文件系統,而不是每次系統啟動時檢查文件系統。為了實現這個操作,先要藉助tune2fs命令,找到文件系統配置。下面這個命令行顯示了文件系統相關參數的當前值。請注意:/dev/sda1是文件系統超級塊所在的分區。 $ sudo tune2fs -l /dev/sda1 從tune2fs的輸出結果中,我們不僅可以看到文件系統的狀態(干凈與否),還可以看到與文件系統檢查有關的一些參數。"Maximum mount count"(最大掛載次數)這個參數是指文件系統檢查被觸發後的掛載次數。"Check interval"(檢查時間間隔)這個參數顯示了兩次文件系統檢查之間的最長時間。在大多數Linux發行版上,這些參數並不是默認情況下被設置的,這意味著並不進行任何定期的文件系統檢查。 如果想強制每隔30次掛載就檢查文件系統,請運行下面這個命令。 $ sudo tune2fs -c 30 /dev/sda1 如果想強制每隔3個月就檢查文件系統,請使用下面這個命令。 $ sudo tune2fs -i 3m /dev/sda1 現在確認剛添加上去的文件系統檢查條件已正確設置。 $ sudo tune2fs -l /dev/sda1 . . . Last mount time: n/a Last write time: Fri Mar 14 22:29:24 2014 Mount count: 20 Maximum mount count: 30 Last checked: Mon Mar 3 20:55:08 2014 Check interval: 7776000 (3 months) Next check after: Sun Jun 1 21:55:08 2014 強制下一次系統重啟時,進行一次性的文件系統檢查 如果你想在下一次系統重啟時觸發一次性的文件系統檢查,可以使用這個命令。 $ sudo touch /forcefsck 一旦你在類似上面的頂層目錄(/)中創建了一個名為forcefsck的空文件,它就會在你下一次重啟時,強制進行文件系統檢查。系統成功啟動後,/forcefsck則會自動被清除。

㈡ 如何在Linux上實現文件系統的自動檢查和修復

我在本教程中將介紹如何藉助fsck工具,實現文件系統的自動檢查。

系統一啟動,就觸發文件系統自動檢查機制

如果你希望系統一啟動,就自動觸發fsck,那麼有一些方法可以設置在啟動過程中實現無人值守的fschk,這些方法具體取決於特定的Linux發行版。

在Debian、Ubuntu或Linux Mint上,編輯/etc/default/rcS,如下所示。

$ sudo vi /etc/default/rcS
# 啟動過程中,自動修復出現不一致性的文件系統

FSCKFIX=yes
在CentOS上,使用下列內容,編輯/etc/sysconfig/autofsck(要是它沒有,就創建)。

$ sudo vi /etc/sysconfig/autofsck
AUTOFSCK_DEF_CHECK=yes
強制定期檢查文件系統

如果文件系統很龐大,你可以強制定期檢查文件系統,而不是每次系統啟動時檢查文件系統。為了實現這個操作,先要藉助tune2fs命令,找到文件系統配置。下面這個命令行顯示了文件系統相關參數的當前值。請注意:/dev/sda1是文件系統超級塊所在的分區。

$ sudo tune2fs -l /dev/sda1

從tune2fs的輸出結果中,我們不僅可以看到文件系統的狀態(干凈與否),還可以看到與文件系統檢查有關的一些參數。"Maximum mount count"(最大掛載次數)這個參數是指文件系統檢查被觸發後的掛載次數。"Check interval"(檢查時間間隔)這個參數顯示了兩次文件系統檢查之間的最長時間。在大多數Linux發行版上,這些參數並不是默認情況下被設置的,這意味著並不進行任何定期的文件系統檢查。

如果想強制每隔30次掛載就檢查文件系統,請運行下面這個命令。

$ sudo tune2fs -c 30 /dev/sda1
如果想強制每隔3個月就檢查文件系統,請使用下面這個命令。

$ sudo tune2fs -i 3m /dev/sda1
現在確認剛添加上去的文件系統檢查條件已正確設置。

$ sudo tune2fs -l /dev/sda1
. . .
Last mount time: n/a
Last write time: Fri Mar 14 22:29:24 2014
Mount count: 20
Maximum mount count: 30
Last checked: Mon Mar 3 20:55:08 2014
Check interval: (3 months)
Next check after: Sun Jun 1 21:55:08 2014
強制下一次系統重啟時,進行一次性的文件系統檢查

如果你想在下一次系統重啟時觸發一次性的文件系統檢查,可以使用這個命令。

$ sudo touch /forcefsck
一旦你在類似上面的頂層目錄(/)中創建了一個名為forcefsck的空文件,它就會在你下一次重啟時,強制進行文件系統檢查。系統成功啟動後,/forcefsck則會自動被清除。

㈢ linux支持的文件系統有哪些

比如Btrfs、JFS、ReiserFS、ext、ext2、ext3、ext4、ISO9660、XFS、Minx、MSDOS、UMSDOS、VFAT、NTFS、HPFS、NFS、SMB、SysV、PROC等。

Linux操作系統使用虛擬文件系統(VFS)向上和用戶進程文件訪問系統調用介面,向下和具體不同文件系統的實現介面。VFS屏蔽了具體文件的實現細節,向上提供統一的操作介面。通過VFS可以實現任意的文件系統,這些文件系統通過文件訪問系統調用都可以訪問。所以Linux系統核心可以支持十多種文件系統類型。

(3)linux文件系統的實現擴展閱讀:

EXT是延伸文件系統(英語:Extended file system,縮寫為 ext或 ext1),也譯為擴展文件系統,一種文件系統,於1992年4月發表,是為linux核心所做的第一個文件系統。採用Unix文件系統(UFS)的元數據結構,以克服MINIX文件系統性能不佳的問題。它是在linux上,第一個利用虛擬文件系統實現出的文件系統,在linux核心0.96c版中首次加入支持,最大可支持2GB的文件系統

EXT3是第三代擴展文件系統(英語:Third extended filesystem,縮寫為ext3),是一個日誌文件系統,常用於Linux操作系統。它是很多Linux發行版的默認文件系統。Stephen Tweedie在1999年2月的內核郵件列表中,最早顯示了他使用擴展的ext2,該文件系統從2.4.15版本的內核開始,合並到內核主線中。

㈣ Linux 文件系統管理

3.1Linux 文件系統類型

不同的操作系統使用不同類型的文件系統,為了與其他的操作系統兼容,以相互交換數據,

通常,每種操作系統都支持多種類型的文件系統。

Linux 中保存數據的磁碟分區通常採用EXT2/EXT3 文件系統,而實現虛擬存儲的swap 分區

採用swap 文件系統,同時Linux 內核支持十多種不同的文件系統。

1. EXT2 和EXT3 文件系統

EXT(Extended File System,擴展文件系統)是專為Linux 設計的文件系統。在Linux 發展

早起,起到重要中用,但在穩定性、速度和兼容性方面存在缺陷。

EXT2 是為解決EXT 系統存在的缺陷而設計的可擴展、高性能的文件系統。

EXT3 是EXT2 的增強版本,在EXT2 的基礎上,增加了文件系統的日誌管理功能。

EXT3 文件系統具有的特點:

(1) 高效性:當系統因為異常斷電或系統崩潰,重新啟動時不需要檢查文件系統的一致

性,只需要根據文件系統的日誌,快速檢測並恢復文件系統到正常狀態。

(2) 數據的完整性:可以保持數據域文件系統狀態的高度一致性,避免意外關機對文件

系統造成的破壞。

(3) 數據的存取速度更快:EXT3 文件系統的日誌功能對磁碟驅動器的讀/寫進行優化,

使讀/寫系統的速度更快。

(4) 數據易於轉換

2. swap 文件系統

用於Linux 的交換分區。在Linux 中,使用整個交換分區來提供虛擬內存。

3. VFAT 文件系統

VFAT 是Linux 對DOS、Windows 系統下的FAT 文件系統的統稱。

4. NFS 文件系統

NFS 即網路文件系統,用在UNIX 或Linux 系統間通過網路進行文件共享。

5. SMB 文件系統

SMB 是Samba 的縮寫,是另一種網路文件系統,用於在Windows 和Linux 系統之間共享文

件和列印機。

6. ISO9660 文件系統

CD-ROM使用的標准文件系統。

此外,Linux 支持的文件系統還有minix、msdos、ncpfs、hpfs、umsdos 等。

3.2 Linux 的目錄和文件

1.Linux 系統的目錄結構

Linux 文件系統由文件和目錄組成,文件是專門用來存儲數據的對象,目錄是一種用來組織

文件和其他目錄的容器。Linux 和DOS、Windows 系統一樣,使用樹形目錄結構來組織和管

理文件。

1. / 文件系統的入口,最高一級目錄;

2. /bin 基礎系統所需要的命令位於此目錄,是最小系統所需要的命令,如:ls, cp, mkdir等。

這個目錄中的文件都是可執行的,一般的用戶都可以使用。

3. /boot 包含Linux內核及系統引導程序所需要的文件,比如vmlinuz initrd.img文件都位於這個目錄中。在一般情況下,GRUB或LILO系統引導管理器也位於這個目錄;

4. /dev 設備驅動程序文件存儲目錄,比如音效卡、磁碟等,是Linux文件系統的一個閃亮的特性-所有對象都是文件或目錄。仔細觀察這個目錄你會發現hda1, hda2等,它們代表系統主硬碟的不同分區。

5. /etc 存放系統程序或者一般工具的配置文件。

如安裝了apache2之後,配置文件在/etc/apache2/目錄下。

/etc/init.d這個目錄是用來存放系統或伺服器以System V模式啟動的腳本,這在以System V模式啟動或初始化的系統中常見。

6. /home 普通用戶默認存放目錄Linux是多用戶環境,所以每一個用戶都有一個只有自己可以訪問的目錄(當然管理員也可以訪問)。它們以/home/username的方式存在。這個目錄也保存一些應用對於這個用戶的配置,比如IRC, X等。

7. /lib 庫文件存放目錄這里包含了系統程序所需要的所有共享庫文件,類似於Windows的共享庫DLL文件。

8. /var 這個目錄的內容是經常變動,因為存儲的文件,如資料庫,數據文件大小是在不斷的增大。

/var/log這是用來存放系統日誌的目錄。

/var/www目錄是定義Apache伺服器站點存放目錄;/var/lib用來存放一些庫文件,比如MySQL的,以及MySQL資料庫的的存放地;

/var/log系統日誌存放,分析日誌要看這個目錄的東西;

/var/spool列印機、郵件、代理伺服器等假離線目錄;

9. /lost+found 在ext2或ext3文件系統中,當系統意外崩潰或機器意外關機,而產生一些文件碎片放在這里。當系統啟動的過程中fsck工具會檢查這里,並修復已經損壞的文件系統。 有時系統發生問題,有很多的文件被移到這個目錄中,可能會用手工的方式來修復,或移到文件到原來的位置上。

Linux應該正確的關機。但有時你的系統也可能崩潰掉或突然斷電使系統意外關機。那麼啟動的時候fsck將會進行長時間的文件系統檢查。Fsck會檢測並試圖恢復所發現的'不正確的文件。被恢復的文件會放置在這個目錄中。所恢復的文件也許並不完整或並不合理,但畢竟提供了一些恢復數據的機會。

10. /media 即插即用型存儲設備的掛載點自動在這個目錄下創建,比如USB盤系統自動掛載後,會在這個目錄下產生一個目錄 ;CDROM/DVD自動掛載後,也會在這個目錄中創建一個目錄,類似cdrom的目錄。這個只有在最新的發行套件上才有. 10. /mnt /mnt這個目錄一般是用於存放掛載儲存設備的掛載目錄的,比如有cdrom等目錄。有時我們可以把讓系統開機自動掛載文件系統,把掛載點放在這里也是可以的。比如光碟機可以掛載到/mnt/cdrom。

11. /opt 表示的是可選擇的意思,有些軟體包也會被安裝在這里,也就是自定義軟體包,比如在Fedora Core 5.0中,OpenOffice就是安裝在這里。有些我們自己編譯的軟體包,就可以安裝在這個目錄中;通過源碼包安裝的軟體,可以通過./configure --prefix=/opt/,將軟體安裝到opt目錄。

這個目錄包含所有默認系統安裝之外的軟體和添加的包。

12. /proc 操作系統運行時,進程(正在運行中的程序)信息及內核信息(比如cpu、硬碟分區、內存信息等)存放在這里。/proc目錄是偽裝的文件系統proc的掛載目錄,proc並不是真正的文件系統。

這是系統中極為特殊的一個目錄,實際上任何分區上都不存在這個目錄。它實際是個實時的、駐留在內存中的文件系統。

13. /root Linux超級許可權用戶root的家目錄;

14. /sbin 大多是涉及系統管理的命令的存放,是超級許可權用戶root的可執行命令存放地,普通用戶無許可權執行這個目錄下的命令;

這個目錄和

/usr/sbin;/usr/X11R6/sbin或/usr/local/sbin目錄是相似的; 我們記住就行了,凡是目錄sbin中包含的都是root許可權才能執行的。

15. /tmp 臨時文件目錄,有時用戶運行程序的時候,會產生臨時文件。/tmp就用來存放臨時文件的。/var/tmp目錄和這個目錄相似。

許多程序在這里建立lock文件和存儲臨時數據。有些系統會在啟動或關機時清空此目錄。

16. /usr 這個是系統存放程序的目錄,比如命令、幫助文件等。

這個目錄下有很多的文件和目錄。

當我們安裝一個Linux發行版官方提供的軟體包時,大多安裝在這里。

如果有涉及伺服器配置文件的,會把配置文件安裝在/etc目錄中。

㈤ 如何製作 linux 文件系統

一、什麼是文件系統 (Filesystem)
文件系統是包括在一個磁碟(包括光碟、軟盤、閃盤及其它存儲設備)或分區的目錄結構;一個可應用的磁碟設備可以包含一個或多個文件系統;如果您想進入一個文件系統,首先您要做的是掛載(mount)文件系統;為了掛載(mount)文件系統,您必須指定一個掛載點。

二、主要嵌入式採用的文件系統
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.這也是一種新方法,在嵌入式系統採用之前,需要經過更多的測試

三、建一個包含所有文件的目錄
1、建一個目錄rootfs 用來裝文件系統
2、mkdir bin dev etc lib proc sbin tmp usr var
3、ln -fs bin/busybox linuxrc(使用busybox)
4、到系統 /dev 把所有的device打一個包,拷貝到 dev下面(最省事的做法);或者使用mknod來自己建所需要的device,我自己用的如下:
crw-rw-rw- 1 root root 5, 1 2006-02-24 13:12 console crw-rw-rw- 1 root root 5, 64 2006-02-24 13:12 cua0 crw-rw-rw- 1 root root 63, 0 2006-02-24 13:12 dk0 crw-rw-rw- 1 root root 63, 1 2006-02-24 13:12 dk1 drwxr-xr-x 2 root root 4096 2006-02-24 13:12 flash brw-rw-rw- 1 root root 3, 0 2006-02-24 13:12 hda crw-rw-rw- 1 root root 36, 10 2006-02-24 13:12 ipsec crw-rw-rw- 1 root root 241, 0 2006-02-24 13:12 ixNpe crw-rw-rw- 1 root root 1, 2 2006-02-24 13:12 kmem crw-rw-rw- 1 root root 126, 0 2006-02-24 13:12 ledman lrwxrwxrwx 1 root root 16 2007-09-19 14:08 log -> /tmp/var/log/log crw-rw-rw- 1 root root 1, 1 2006-02-24 13:12 mem crw-rw-rw- 1 root root 90, 0 2006-02-24 13:12 mtd0 brw-rw-rw- 1 root root 31, 0 2006-02-24 13:12 mtdblock0 brw-rw-rw- 1 root root 31, 1 2006-02-24 13:12 mtdblock1 brw-rw-rw- 1 root root 31, 2 2006-02-24 13:12 mtdblock2 brw-rw-rw- 1 root root 31, 3 2006-02-24 13:12 mtdblock3 brw-rw-rw- 1 root root 31, 4 2006-02-24 13:12 mtdblock4 brw-rw-rw- 1 root root 31, 5 2006-02-24 13:12 mtdblock5 brw-rw-rw- 1 root root 31, 6 2006-02-24 13:12 mtdblock6 crw-rw-rw- 1 root root 90, 1 2006-02-24 13:12 mtdr0 crw-rw-rw- 1 root root 1, 3 2006-02-24 13:12 null crw-rw-rw- 1 root root 108, 0 2006-02-24 13:12 ppp crw-r——r—— 1 root root 5, 2 2006-03-29 15:56 ptmx drwxr-xr-x 2 root root 4096 2006-03-29 15:56 pts crw-rw-rw- 1 root root 2, 0 2006-02-24 13:12 ptyp0 brw-rw-rw- 1 root root 1, 0 2006-02-24 13:12 ram0 crw-rw-rw- 1 root root 1, 8 2006-02-24 13:12 random crw-rw-rw- 1 root root 5, 0 2006-02-24 13:12 tty crw-rw-rw- 1 root root 4, 0 2006-02-24 13:12 tty0 crw-rw-rw- 1 root root 3, 0 2006-02-24 13:12 ttyp0 crw-rw-rw- 1 root root 4, 64 2006-02-24 13:12 ttyS0 crw-rw-rw- 1 root root 1, 9 2006-02-24 13:12 urandom crw-rw-rw- 1 root root 1, 5 2006-02-24 13:12 zero舉例: mknod console c 5 1 這樣 crw-rw-rw- 1 root root 5, 1 2006-02-24 13:12 console
5、將編譯好的busybox拷貝到/bin下面,除了busybox外,所有其他的命令都是他的link
ash chgrp clear dd echo fgrep gzip ip ls modprobe mv ping pwd sed stty tar true zcat busybox chmod cp df egrep grep hostname kill mkdir more netstat ping2file rm sh sync tftp umount cat chown date dmesg false gunzip ifconfig ln mknod mount pidof ps rmdir sleep sysinfo touch uname
所有的命令你可以在busybox下面用make menuconfig來增減
6、同樣/sbin下面也是busybox的link
halt ifconfig init insmod klogd losetup lsmod mkswap modprobe reboot rmmod route swapoff swapon
[NextPage]
7、同樣/usr/bin下面也是busybox的link
basename dirname env free id logger reset tail tr tty uptime which xargs
awk cut expr head killall mkfifo sort test traceroute uniq wc whoami yes
上面幾乎是最全的link,各個看官可以酌情刪減,不過link也不佔什麼空間!
8、同樣/usr/sbin下面放著所有編譯完的可執行文件,具體就不多說了
9、非常重要之/lib,務必重視
找到你編譯環境的target目錄,把需要的lib文件先用strip壓縮(非target目錄下的,而已編譯環境提供的strip),先把最基本的libc, ld等等,必須同樣做跟target/lib裡面一樣的link.
然後根據特定的應用加相應的lib,不要把不用的加進去,lib比較占空間。

10、在/etc下面加上需要的配置文件,最最重要的是rcS
#!/bin/sh export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/sbin/scripts UTC=yes mount -n -t proc proc /proc mount -n -t ramfs ramfs /tmp mount -n -t devpts devpts /dev/pts # build var directories /bin/mkdir -m 0777 /tmp/var /bin/mkdir -m 0777 /var/lock /bin/mkdir -m 0777 /var/log /bin/mkdir -m 0777 /var/run /bin/mkdir -m 0777 /var/tmp #/bin/mkdir -m 0777 /tmp/etc #/bin/cp -a /usr/etc//etc #/bin/cp -a /usr/dev//dev/ # loads the NPE ethernet moles into the kernel. insmod /lib/moles/2.6.13.2/intel/ixp400.ko # Firmware code for NPE Engine. cat /etc/IxNpeMicrocode.dat > /dev/ixNpe insmod /lib/moles/2.6.13.2/intel/ixp400_eth.ko netdev_max_backlog=500 insmod /lib/moles/led.ko insmod /lib/moles/push_button.ko下面的具體應用沒有再舉例加上了,這個是系統init必須的。
其他的情況類似如此了,下面裡面給了一個lunksys的GPL項目的target.

四、生成一個ramdisk
#!/bin/sh MODULE_NAME=ramdisk RAMPATH=`pwd` TMPPATH=${RAMPATH}/tmp SOURCE=${RAMPATH}/……/target if [ ! -d ${TMPPATH} ] then mkdir ${TMPPATH} fi if [ `whoami` != 'root' ] then { echo "You should run the shell as root, Please rerun as a root." echo "Aborting." exit 1 } fi # Clear in tmp path rm -rf ${TMPPATH}/tmpmnt rm -rf ${TMPPATH}/ramrootfs mkdir ${TMPPATH}/tmpmnt # Clear the old ramdisk rm -f ${RAMPATH}/$MODULE_NAME # Make a temp file which size is suitable dd if=/dev/zero of=${TMPPATH}/ramrootfs bs=1k count=6144 # Create a ext2 filesystem mke2fs -F -m 0 -i 2000 ${TMPPATH}/ramrootfs # Mount it to tmpmnt/ mount -o loop -t ext2 ${TMPPATH}/ramrootfs ${TMPPATH}/tmpmnt # Copy everything from kernel to this. cd ${TMPPATH}/tmpmnt echo ${SOURCE} cp -av ${SOURCE}/. cd ${TMPPATH} # Unmount it the ext2 filesystem umount ${TMPPATH}/tmpmnt cat ${TMPPATH}/ramrootfs | gzip -9 > /${RAMPATH}/ramdisk echo Copying ramdisk image to ${RAMPATH} sync這里給出一個自動生成腳本!

五、生成一個cramfs
找到cramfs的toolchain./mkcramfs -r $(FS1_DIR) $(FS_NAME)。1
六、生成一個mksquashfs
找到squashfs的toolchain./mksquashfs $(FS_DIR) $(FS_NAME) -noappend -be -lzma -no-fragments -noI
做文件系統最困難和最可能出問題的地方是在/lib庫和/dev方面,請大家多注意這兩方面。

㈥ linux 文件系統 是什麼意思

文件系統是操作系統用於明確存儲設備(常見的是磁碟,也有基於NANDFlash的固態硬碟)或分區上的文件的方法和數據結構;
即在存儲設備上組織文件的方法。
操作系統中負責管理和存儲文件信息的軟體機構稱為文件管理系統,簡稱文件系統。
文件系統由三部分組成:文件系統的介面,對對象操縱和管理的軟體集合,對象及屬性。
從系統角度來看,文件系統是對文件存儲設備的空間進行組織和分配,負責文件存儲並對存入的文件進行保護和檢索的系統。

㈦ 如何在 Linux下實現一個文件系統

linux系統下也有開發C的很多開發工具的,一般工程可用make文件但最簡單的直接用命令行編譯就可以了gcc -o 你的執行文件名 main.c func1.c func2.c fun3.c就可以直接用你的4個C源文件生成你要的執行文件了

㈧ 300來行代碼帶你實現一個能跑的最小Linux文件系統

Linux作為一個類UNIX系統,其文件系統保留了原始UNIX文件系統的表象形式,它看起來是這個樣子:

它其實是一棵目錄樹(沒有畫全):

然而,雖然所有的UNIX系統以及類UNIX系統的文件系統看起來一樣,但是它們的實現卻是不盡相同。

作為普通用戶,了解文件系統的基本操作就夠了;作為應用開發人員,了解文件系統的POSIX介面足矣,但是作為一個對操作系統有著濃厚興趣的愛好者而言,自己可能就是一個新的文件系統的潛在實現者,所以必須一窺究竟,看看如此外觀的文件系統到底是如何實現的。

網上已經有了很多關於UNIX/Linux文件系統實現的資源,但是無一例外,都太復雜了,除了整體的源碼分析外,幾乎就是針對某個特定文件系統的詳解了,如此復雜的這些對於初涉該領域的滿腔熱情者無疑是一盆冷水,很多人因此望而卻步。

幾乎所有的關於Linux文件系統實現的資源都在用不同的語言解釋上面的這些問題,這很容易陷入細節的泥潭。

本文以Linux內核為例,用一種稍微不同的方式去描述文件系統的實現。嗯,我會分3個部分來介紹Linux內核的文件系統:

本文中,我會通過一個實實在在的文件系統實現的例子,試圖闡述 實現一個文件系統,哪些是必須的,哪些不是必須的。 這是一個任務驅動的過程,從簡單的例子開始。

讀過本文之後,相信會對Linux文件系統的實現有一個總體上的宏觀把握,然後再去反復推敲上述的細節問題,重讀網上的那些經典資源,相信會事半功倍。

當然,在給出最簡單的tinyfs實現之前,還是會有一個總體的介紹。

如果我們把本文最初描述的那個在幾乎所有UNIX/類UNIX系統中長的一模一樣的文件系統表面刨開,在Linux內核中,文初的那棵樹其實它長下面的樣子(其實在大多數類UNIX系統中,它們長得都差不多):

【這張圖基於我一張手繪圖修改而成】

我們看到,Linux系統的文件目錄樹就是靠上圖中的這一系列的鏈表穿針引線給串在一起的,就像縫制一件衣服一樣,最終的成衣就是我們看到的Linux系統目錄樹,而縫制這件成衣的線以及指導走線的規則便是VFS本身了。

現在只要記住兩個重要鏈表:

然後讀完本文之後再去結合代碼深入分析它們是如何串起整個文件系統的。

VFS之所有可以將機制大相徑庭的完全不同的文件系統對外統一成一個樣子,完全就是依靠了它的統一的對POSIX文件調用的介面,該介面的結構看上去是下面的樣子:

注意上圖最下面的那個橢圓,如果要實現一個文件系統,這個橢圓里的東西是關鍵,它完成了穿針引線的大部分工作。

現在讓我們縱向地看一下一個完整的文件系統實現都包括什麼,我指的是從POSIX系統調用開始,一直到數據落盤。Linux內核關於文件系統IO,完整的視圖如下所示:

注意VFS提供的三類介面:

一個文件系統如果能實現上面三類介面,那它就是個完整的文件系統了。

我們恰好可以從設計並實現一個最基本的這樣的文件系統開始。一個基本的文件系統,其著重點在於上圖中紅色的部分,而其它部分則不是必不可少的,但是卻是讓該文件系統變得優秀(而不僅僅是可用)所必須的。

為什麼要實現這么一個文件系統,難道沒人已經做了這個工作嗎?做這個工作的意義何在?

原因如下:

然而確實,我沒有找到簡單的 最小文件系統 實現,也許你會說Linux內核自帶的ramfs難道不就是一個現成的嗎?的確算一個,但它有兩個問題導致你無法領略實現一個文件系統的全過程,注意,我說的可是全過程:

為了 追求完整, 如果你把如何組織一塊內核作為ramfs的底層介質這部分代碼全部看完,如果你把libfs.c里的庫實現全部看完,我想ramfs也就不算一個 足夠簡單 的文件系統實例了。

看到了么?要想代碼簡單,你就不得不使用libfs.c里的現成的常式,這將損失你實現一個文件系統的完整性體驗,反之,要想完整實現一個文件系統,你可能不得不自己寫大量的代碼,這卻並不簡單。

如何既完備,又足夠簡單呢?

對於我這種編程水平渣渣的內核愛好者而言,如何在堵車的一個多小時內完成一個可以編譯通過的文件系統(我承認完全能跑是我回到家後又調試了一個多小時才完成的...),這對於我而言,是一個挑戰,但我要試一試,沒想到就成功了。所以才有了今天的分享。

我從最底層的介質結構的設計開始。

我並沒有真實的硬體介質,也並不打算編寫專門的 格式化程序 去格式化一塊內存區域,所以我直接用大數組定義一塊內存,它便是我的模擬介質了,我的tinyfs的文件格式如下:

這個文件系統的格式非常的Low:

之所以這么Low是因為它只是一個開始, 當這個文件系統實現並且能跑之後,你會發現它因為Low而帶來的不足和一些代價,而彌補這些不足正好是優化的動機,帶著你逐步實現一個更加不Low的文件系統,在實現的過程中,你會窺見並掌握Linux內核文件系統的全貌和細節。 完美的學習過程,OK!

下面是代碼:

review代碼後,你可能已經發現了幾個問題:

嗯,其實這些問題目前而言還都不是問題,它們並不阻礙這個文件系統的真實性,它用起來是那麼的真實。

沒有任何規范規定一個文件系統存儲格式必須有什麼或者必須沒有什麼,文件系統格式只是一個 看上去還可以的信息持久化記錄格式 ,只要下次能根據某些信息將文件讀取出來,任何格式都是OK的。

之所以很多人會認為一個文件系統的格式必須要符合某種規范,完全是因為人們看的最多的那些文件系統ext3,ext4,ntfs等恰好是那樣做的罷了。不過事實證明,那樣做確實是很好的。在可用的玩具完成之後,就要考慮 性能,健壯性,可擴展性 等這些工程因素了。而ext3/4,ntfs,xfs則充分考慮了這些。

逐漸的,權威變成了規范,至少成了一種範式或者模式,這是計算機領域常有的事,見怪不怪。

我們來使用下這個文件系統:

OK,掛載成功。

這里又有疑問了,為什麼是none掛載,而不是一個塊設備,比如/dev/sda1之類的。

這是因為我根本沒有將介質(其實是一塊連續的內存)抽象成塊設備,如果引入塊設備抽象,勢必要導出device層操作介面,這樣做並不困難,但卻太麻煩,且塊設備抽象和文件系統的實現核心無關。本文不是講塊設備的,加之班車上的堵車時間有限,故不做抽象。

好了,現在讓我們來折騰下/mnt目錄,該目錄就是我的tinyfs的掛載目錄了,在其下讀寫文件,就是在tinyfs的內存介質上讀寫文件:

除了最後一個刪除目錄的操作,其它的都OK,這也是預期之中,畢竟刪除目錄是TODO嘛。

一共300來行的代碼(省去了很多異常判斷和處理,真實情況下,這些要佔據80%的代碼量),非常容易讀懂,你會發現這個文件系統實現是如此之low,然而卻能看起來像真的一樣。

這意味著完成和完美真的是兩回事!

很多最終看起來很大型的東西,都是都這種剛剛完成可以用開始的。

很明顯,這個代碼沒有使用塊層來和底層介質通信,而是直接操作了底層介質,也就是那塊連續的內存。因為我用內存模擬介質,尚且OK,如果底層真的有一個類似磁碟那樣的慢速介質,每次操作直接讀寫block將是不可接受的。但如果你想獲得性能上的提升,就必須使用塊層的緩存機制,以及pagecache機制。

所以,方向很明確,我們有了一個todolist:

這些todo完成,意味著對Linux內核文件系統實現原理的徹底掌握,從一個簡單的剛剛可用的tinyfs開始(這花不了多少時間),到整理出一份todolist,到完成這些todo,這便是一個任務驅動的學習過程。

回過頭來看Linux文件系統IO的縱向視圖:

這次注意藍色部分,我們的TODO就是要補充這部分的實現。

好了,換一個視角看VFS。

我們把Linux內核內存中的VFS看作是磁碟等慢速介質中特定文件系統的緩存,這是一個典型的 分級存儲結構, 就好像CPU cache和內存的關系一樣。

在這個視角下,如何完成上圖藍色框框中的部分,可參考的現成範式就太多了。但無論如何都要解決的是:

Linux內核已經給了我們一個現成的答案:

當然,如果你覺得這些不夠好,你也可以設計你自己的。總之,這是一塊非常獨立的工作,正如我圖中所示,這部分工作的目標是,在文件系統剛好可以工作後, 讓事情變得更加完美有趣!

㈨ Linux文件系統特點

Linux之所以能在嵌人式系統領域取得如此輝煌的成績,與其自身的優良特性是分不開的。與其他操作系統相比,Linux具有以下一系列顯著的特點。

1.模塊化程度高

Linux的內核設計非常精巧,分成進程調度、內存管理、進程間通信、虛擬文件系統和網路介面五大部分;其獨特的模塊機制可根據用戶的需要,實時地將某些模塊插入或從內核中移走,使得Linux系統內核可以裁剪得非常小巧,很適合於嵌入式系統的需要。

2.源碼公開

由於Linux系統的開發從一開始就與GNU項目緊密地結合起來,所以它的大多數組成部分都直接來自GNU項目。任何人、任何組織只要遵守GPL條款,就可以自由使用Linux 源代碼,為用戶提供了最大限度的自由度。這一點也正投嵌入式系統所好,因為嵌入式系統應用千差萬別,設計者往往需要針對具體的應用對源碼進行修改和優化,所以是否能獲得源代碼 對於嵌入式系統的開發是至關重要的。加之Linux的軟體資源十分豐富,每種通用程序在Linux上幾乎都可以找到,並且數量還在不斷增加。這一切就使設計者在其基礎之上進行二次開發變得非常容易。另外,由於Linux源代碼公開,也使用戶不用擔心有「後閘」等安全隱患。

同時,源碼開放給各教育機構提供極大的方便,從而也促進了Linux的學習、推廣和應用。

3.廣泛的硬體支持

Linux能支持x86、ARM、MIPS、ALPHA和PowerPC等多種體系結構的微處理器。目前已成功地移植到數十種硬體平台,幾乎能運行在所有流行的處理器上。

由於世界范圍內有眾多開發者在為Linux的擴充貢獻力量,所以Linux有著異常豐富的驅動程序資源,支持各種主流硬體設各和最新的硬體技術,甚至可在沒有存儲管理單元MMU 的處理器上運行,這些都進一步促進了Linux在嵌入式系統中的應用。

4.安全性及可靠性好

內核高效穩定。Linux內核的高效和穩定已在各個領域內得到了大量事實的驗證。

Linux中大量網路管理、網路服務等方面的功能,可使用戶很方便地建立高效穩定的防火牆、路由器、工作站、伺服器等。為提高安全性,它還提供了大量的網路管理軟體、網路分析軟體和網路安全軟體等。

5.具有優秀的開發工具

開發嵌入式系統的關鍵是需要有一套完善的開發和調試工具。傳統的嵌入式開發調試工具是在線模擬器(In Circuit Emulator,ICE),它通過取代目標板的微處理器,給目標程序提供一個完整的模擬環境,從而使開發者能非常清楚地了解到程序在目標板上的工作狀態,便於監視和調試程序。在線模擬器的價格非常高,而且只適合做非常底層的調試。如果使用的是嵌人式Linux,一旦軟硬體能支持正常的串口功能,即使不用在線模擬器,也可以很好地進行開發和調試工作,從而節省了一筆不小的開發費用。嵌入式Linux為開發者提供了一套完整的工具鏈(Tool Chain),能夠很方便地實現從操作系統到應用軟體各個級別的調試。

6.有很好的網路支持利文件系統支持

Linux從誕生之日起就與Internet密不可分,支持各種標準的Internet網路協議,並且很容易移植到嵌入式系統當中。目前,Linux幾乎支持所有主流的網路硬體、網路協議和文件系統,因此它是NFS的一個很好的平台。

另一方面,由於Linux有很好的文件系統支持(例如,它支持Ext2、FAT32、romfs等文件系統),是數據各份、同步和復制的良好平台,這些都為開發嵌入式系統應用打下了堅實的基礎。

7.與UNIX完全兼容

目前,在Linux中所包含的工具和實用程序,可以完成UNIX的所有主要功能。

但由於Linux不是為實時而設計的,因而這就成了Linux在實時系統中應用的最大遺憾。不過,目前有眾多的自由軟體愛好者正在為此進行不懈的努力,也取得了諸多成果

閱讀全文

與linux文件系統的實現相關的資料

熱點內容
煙台編程積木教育環境好不好 瀏覽:214
python優秀代碼 瀏覽:620
androidtop命令 瀏覽:455
你平時怎麼排解壓力 瀏覽:68
表格中的文件夾怎樣設置 瀏覽:476
em78單片機 瀏覽:960
splitjava空格 瀏覽:248
電腦怎麼谷歌伺服器地址 瀏覽:515
nx自定義工具啟動宏命令 瀏覽:101
程序員怎麼解決無法訪問互聯網 瀏覽:303
java訪問本地文件 瀏覽:747
瓦斯琪伺服器怎麼用 瀏覽:22
安卓主題用什麼app 瀏覽:747
修改伺服器pci地址空間 瀏覽:321
程序員將來去哪裡 瀏覽:966
虛幻5創建c無法編譯 瀏覽:189
javaweb項目設計 瀏覽:407
國家反詐app緊急聯系人怎麼填 瀏覽:191
單片機旋轉led 瀏覽:340
杜洋單片機官網 瀏覽:467