Linux之初識檔案系統及初步管理
一、什麼是檔案系統
計算機的檔案系統是一種儲存和組織計算機資料的方法,它使得對其訪問和查詢變得容易,檔案系統使用檔案和樹形目錄的抽象邏輯概念代替了硬碟和光碟等物理裝置使用資料塊的概念,使用者使用檔案系統來儲存資料不必關心資料實際儲存在硬碟(或者光碟)的地址為多少的資料塊上,只需要記住這個檔案的所屬目錄和檔名。在寫入新資料之前,使用者不必關心硬碟上的那個塊地址沒有被使用,硬碟上的儲存空間管理(分配和釋放)功能由檔案系統自動完成,使用者只需要記住資料被寫入到了哪個檔案中。
二、檔案系統的組成元素
檔名:在檔案系統中,檔名是用於定位儲存位置。
元資料(Metadata):其它檔案儲存資訊常常伴隨著檔案自身儲存在檔案系統中。檔案長度可能是分配給這個檔案的區塊數,也可能是這個檔案實際的位元組數。檔案最後修改時間也許記錄在檔案的時間戳中。有的檔案系統還儲存檔案的建立時間,最後訪問時間及屬性修改時間。(不過大多數早期的檔案系統不記錄檔案的時間資訊)其它資訊還包括檔案裝置型別(如:區塊數,字符集,套介面,子目錄等等),檔案所有者的ID,組ID,還有訪問許可權(如:只讀,可執行等等)。
資料(Data):實際存放的內容
安全訪問:針對基本檔案系統操作的安全訪問可以通過訪問控制列表或capabilities實現。研究表明訪問控制列表難以保證安全,這也就是研發中的檔案系統傾向於使用capabilities的原因。然而目前多數商業性的檔案系統仍然使用訪問控制列表。
三、檔案系統的分類
a.磁碟檔案系統:磁碟檔案系統是一種設計用來利用資料儲存裝置來儲存計算機檔案的檔案系統,最常用的資料儲存裝置是磁碟驅動器,可以直接或者間接地連線到計算機上。例如:FAT、exFAT、NTFS、HFS、HFS+、ext2、ext3、ext4、ODS-5、btrfs。有些檔案系統是程序檔案系統(也有譯作日誌檔案系統)或者追蹤檔案系統。
b.快閃記憶體檔案系統:快閃記憶體檔案系統是一種設計用來在快閃記憶體上儲存檔案的檔案系統。
c.資料庫檔案系統:檔案管理方面的一個新概念是一種基於資料庫的檔案系統的概念。不再(或者不僅僅)使用分層結構管理,檔案按照他們的特徵進行區分,如檔案型別、專題、作者或者亞資料進行區分。於是檔案檢索就可以按照SQL風格甚至自然語言風格進行。
d.網路檔案系統:網路檔案系統(NFS,Network File System)是一種將遠端主機上的分割槽(目錄)經網路掛載到本地系統的一種機制。
說明:隨著Linux的不斷髮展,它所支援的檔案格式系統也在迅速擴充,Linux系統核心可以支援十多種檔案系統型別:Btrfs、JFS、ReiserFS、ext、ext2、ext3、ext4、XFS、ISO 9660、XFS、Minx、MSDOS、UMSDOS、VFAT、NTFS、HPFS、NFS、SMB、SysV、PROC等。 注意:部分Linux發行版預設不支援NTFS檔案系統,解決方法是安裝ntfs-3g或ufsd等NTFS驅動程式。部分Linux發行版對NTFS的支援度並不高。
四、檔案系統結構:
/boot:引導檔案存放目錄,核心檔案(vmlinuz)、引導載入器 (bootloader, grub)都存放於此目錄
/bin:供所有使用者使用的基本命令;不能關聯至獨立分割槽, OS啟動即會用到的程式
/sbin:管理類的基本命令;不能關聯至獨立分割槽, OS啟動即 會用到的程式
/lib:啟動時程式依賴的基本共享庫檔案以及核心模組檔案 (/lib/modules)
/lib64:專用於x86_64系統上的輔助共享庫檔案存放位置
/etc:配置檔案目錄
/home/USERNAME:普通使用者家目錄
/root:管理員的家目錄
/media:行動式移動裝置掛載點
/mnt:臨時檔案系統掛載點
/dev:裝置檔案及特殊檔案儲存位置
b: block device,隨機訪問
c: character device,線性訪問
/opt:第三方應用程式的安裝位置
/srv:系統上執行的服務用到的資料
/tmp:臨時檔案儲存位置
/usr:Unix Software Resource universal shared, read-only data
bin: 保證系統擁有完整功能而提供的應用程式
sbin:
lib: 32位使用
lib64:只存在64位系統
include: C程式的標頭檔案(header files)
share:結構化獨立的資料,例如doc, man等
local:第三方應用程式的安裝位置
bin, sbin, lib, lib64, etc, share
/var: variable data files cache: 應用程式快取資料目錄 lib: 應用程式狀態資訊資料 local:專用於為/usr/local下的應用程式儲存可變資料; lock: 鎖檔案 log: 日誌目錄及檔案 opt: 專用於為/opt下的應用程式儲存可變資料; run: 執行中的程序相關資料;通常用於儲存程序pid檔案 spool: 應用程式資料池 tmp: 儲存系統兩次重啟之間產生的臨時資料
/proc: 用於輸出核心與程序資訊相關的虛擬檔案系統
/sys:用於輸出當前系統上硬體裝置相關資訊虛擬檔案系統
/selinux: security enhanced Linux, selinux相關的安全策 略等資訊的儲存位置
五、Linux上的應用程式的組成部分
二進位制程式: /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin
庫檔案: /lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib, /usr/local/lib64
配置檔案: /etc, /etc/DIRECTORY, /usr/local/etc
幫助檔案: /usr/share/man, /usr/share/doc, /usr/local/share/man, /usr/local/share/doc
六、Linux下的檔案型別及檔案命名規則
檔案型別:
其實在Linux系統中主要就是兩種檔案,一種是常規檔案(regular file),另一種就是目錄(directory)。開始可能覺得很奇怪,目錄怎麼會是檔案呢?其實目錄只是儲存了該目錄下的檔案或子目錄的名稱和對應i-node(包含了基本上關於對應檔案所有資訊的結構)的編號的一個特殊檔案而已。當然,除了上述的兩種檔案型別,還有:塊裝置檔案(Block special device),字元裝置檔案(character special device),FIFO(管道),Socket(套接字),Symbolic link(符號連結)這幾種檔案型別。具體的在這裡就不展開了。如在上圖中第一位為‘-’,則表示該檔案為常規檔案,其他型別的檔案通過該位顯示的字元應該也很容易判斷出來。
-:普通檔案
d: 目錄檔案
b: 塊裝置
c: 字元裝置
l: 符號連結檔案
p: 管道檔案pipe
s: 套接字檔案socket
藍色-->目錄 綠色-->可執行檔案 紅色-->壓縮文 件 淺藍色-->連結檔案 灰色-->其他檔案
檔案命名規則:
包括路徑在內檔名稱最長4095個位元組,用/分隔的路徑不能超過255個位元組。除了斜槓和NUL,所有字元都有效.但使用特殊字元的目錄名和檔案不推薦使用,有些字元需要用引號來引用它們。標準Linux檔案系統(如ext4),檔名稱大小寫敏感。例如: MAIL, Mail, mail, mAiL
檔案許可權:
下面我們就來看看後9位字元代表的意思。說是9位,其實我們把它們分成3組,每組代表的意思是差不多的。我們都知道Linux系統是一個多使用者的系統,所以對於一個檔案而言,可能有除建立者以外的其他人想要對檔案進行操作。這時我們就有必要對檔案的操作許可權進行設定了。這三組字元從左到右針對的物件依次是檔案的建立者(user),檔案建立者的同組成員(group),除以上二者以外的其他使用者(others)。而每組的3個字元,從左到右依次顯示為 rwx 其中r代表讀的許可權,w代表寫的許可權,x代表可執行的許可權。如下圖所示,我想讀一個名字叫new的檔案,但是它的所有許可權都被遮蔽了。當我輸入命令: more new的時候,shell就會提示許可權不足。對於其他操作也可類推獲得。但是在Linux中有一個神一般存在的使用者,就是傳說中的root或者叫超級使用者(superuser)。它有對系統的一切許可權,可以對任意檔案進行操作,所以之前提到的那些限制對它是沒有效果的。
連結數:
再往右顯示的數字1代表的是,該檔案有1個連結。其中連結又分硬連結(hard link)和符號連結(symbolic link)兩種型別。此處顯示的應為硬連結數。其中硬連結是直接執行檔案對應的inode的,而符號連結則沒有,它只是包含了所連結檔案的位置資訊,類似於windows中的快捷方式。需要注意的是,很多時候,你所謂的刪除一個檔案,只是刪除了該檔案的一個連結。想要真正刪除一個檔案的內容,必須滿足兩個條件:1.檔案的連結數為0。2.沒有程序開啟該檔案。
UID和GID:
前面已經說過了,一個檔案肯定是由一個使用者建立的。那麼自然在檔案資訊中需要儲存,該檔案的建立者,也就是user-ID簡稱UID,同時還有該建立者所在組的ID,group-ID,簡稱GID。所以接下來顯示的monster monster就分別對應了檔案建立者monster和monster所在的組。
檔案大小:
然後顯示的就是對應檔案的大小了,例子中的檔案大小顯示的是0,單位是位元組。需要注意的是:如果檔案的型別是字元連結,那麼它的大小就是它所執行的檔案的檔名的字元數。
檔案時間:
接下來顯示的就是檔案時間了。對於一個檔案,一般儲存了3個時間:1.st_mtime,上一次檔案修改的時間(modification time),2.st_atime,上一次檔案開啟的時間(access time)3.st_ctime,上一次檔案狀態改變的時間(changed status time)。其中最令人困惑的肯定是st_mtime和st_ctime,檔案修改了,那狀態不就改變了麼?狀態改變,那肯定就是檔案修改了啊?其實不是這樣的,第一個st_mtime指的是檔案內容的修改,而st_ctime的狀態指的是檔案對應的inode中儲存的 資訊的改變,例如各種許可權啊,UID,GID等等。所以說是完全不一樣的。
檔名:
顯示在最後的自然就是檔名,對於檔名想說的是,它並不儲存在檔案對應的inode當中,而是儲存在對應的目錄檔案中。這就引發了一個非常有意思的現象,就是我們想要刪除一個檔案的時候,我們並不需要該檔案的任何許可權,而是需要該檔案所在目錄的寫許可權和執行許可權。因為我們刪除一個檔案就是要將減少該檔案對應inode的連結數,並將檔名從對應的目錄檔案中去掉。
檔案系統的建立
linux mkfs
指令:mkfs
使用許可權 : 超級使用者
使用方式 : mkfs [-V] [-t fstype] [fs-options] filesys [blocks] [-L Lable]
說明 : 建立 linux 檔案系統在特定的 partition 上
引數 :
device : 預備檢查的硬碟 partition,例如:/dev/sda1
-V : 詳細顯示模式
-t : 給定檔案系統的型式,Linux 的預設值為 ext2
-c : 在製做檔案系統前,檢查該partition 是否有壞軌
-l bad_blocks_file : 將有壞軌的block資料加到 bad_blocks_file 裡面
block : 給定 block 的大小
-L:建立lable
補充說明:
mkfs本身並不執行建立檔案系統的工作,而是去呼叫相關的程式來執行。例如,若在"-t" 引數中指定ext2,則
mkfs會呼叫mke2fs來建立檔案系統.使用時如省略指定【塊數】引數,mkfs會自動設定 適當的塊數.
例子 :
在 /dev/hda5 上建一個 msdos 的檔案系統,同時檢查是否有壞軌存在,並且將過程詳細列出來 :
mkfs -V -t msdos -c /dev/hda5
mfks -t ext3 /dev/sda6 //將sda6分割槽格式化為ext3格式
mkfs -t ext2 /dev/sda7 //將sda7分割槽格式化為ext2格式
擴充套件知識:mkfs的使用示例
[[email protected] beinan]# mkfs -t 檔案系統 儲存裝置
注:
這裡的檔案系統是要指定的,比如 ext3 ;reiserfs ;ext2 ;fat32 ;msdos 等... ...
裝置比如是一個硬碟的分割槽,軟盤,光碟機等.. ... 在格式化分割槽之前,您得懂得如何檢視硬碟分割槽情況,並有針對性的格式化;比如用 fdisk -l 來檢視; 請參考:《Linux 檢視磁碟分割槽、檔案系統、使用情況的命令和相關工具介紹》 比如我想格式化一個移動U盤中的一個分割槽;全景應該是:
[[email protected] beinan]# fdisk -l
Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 765 6144831 7 HPFS/NTFS
/dev/hda2 766 2805 16386300 c W95 FAT32 (LBA)
/dev/hda3 2806 9729 55617030 5 Extended
/dev/hda5 2806 3825 8193118+ 83 Linux
/dev/hda6 3826 5100 10241406 83 Linux
/dev/hda7 5101 5198 787153+ 82 Linux swap / Solaris
/dev/hda8 5199 6657 11719386 83 Linux
/dev/hda9 6658 7751 8787523+ 83 Linux
/dev/hda10 7752 9729 15888253+ 83 Linux
Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 25 201568+ 83 Linux
/dev/sda2 26 125 806400 5 Extended
/dev/sda5 26 50 201568+ 83 Linux
/dev/sda6 51 76 200781 83 Linux
我們可以看到有sda這個裝置,所以可以用 fdisk -l /dev/sda專門來顯示他的分割槽情況;比如我想格式化 /dev/sda6 分割槽為 ext3檔案系統,則為:
[[email protected] beinan]# mkfs -t ext3 /dev/sda6
mke2fs 1.37 (21-Mar-2005)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
50200 inodes, 200780 blocks
10039 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
25 block groups
8192 blocks per group, 8192 fragments per group
2008 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: 注:在這裡直接回車;
done
This filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
這樣就格式化好了,sda6現在就是ext3檔案系統了;我們就可以用mount 載入這個分割槽,然後使用這個檔案系統;
[[email protected] beinan]# mkdir /mnt/sda6
[[email protected] beinan]# chmod 777 /mnt/sda6
[[email protected] beinan]# mount /dev/sda6 /mnt/sda6
當然您也可以把分割槽格式化成其它的檔案系統;比如我們把 /dev/sda6格式化為ext3 、ext2、reiserfs、fat32、msdos 檔案系統,命令格式如下;
[[email protected] beinan]# mkfs -t ext3 /dev/sda6
[[email protected] beinan]# mkfs -t ext2 /dev/sda6
[[email protected] beinan]# mkfs -t reiserfs /dev/sda6
[[email protected] beinan]# mkfs -t fat32 /dev/sda6
[[email protected] beinan]# mkfs -t msdos /dev/sda6
... ...
2)mkfs.ext3 mkfs.reiserfs mkfs.ext2 mkfs.msdos mkfs.vfat mke2fs 的介紹;
我們先說了一個mkfs 工具後,我們再來介紹 mkfs.ext3 mkfs.reiserfs mkfs.ext2 mkdosfs mkfs.msdos mkfs.vfat ,其實mkfs 在執行的命令的時候,也是呼叫的這個工具,這也是我先把mkfs介紹的主要原因; 通過檔名,我們就知道這些工具是支援什麼檔案系統;這些命令為我們提供了更多的方便;
[[email protected] beinan]# mkfs.ext3 /dev/sda6 注:把該裝置格式化成ext3檔案系統
[[email protected] beinan]# mke2fs -j /dev/sda6 注:把該裝置格式化成ext3檔案系統
[[email protected] beinan]# mkfs.ext2 /dev/sda6 注:把該裝置格式化成ext2檔案系統
[email protected] beinan]# mke2fs /dev/sda6 注:把該裝置格式化成ext2檔案系統
[[email protected] beinan]# mkfs.reiserfs /dev/sda6 注:把該裝置格式化成reiserfs檔案系統
[[email protected] beinan]# mkfs.vfat /dev/sda6 注:把該裝置格式化成fat32檔案系統
[[email protected] beinan]# mkfs.msdos /dev/sda6 注:把該裝置格式化成fat16檔案系統,msdos檔案系統就是fat16;
[[email protected] beinan]# mkdosfs /dev/sda6 注:把該裝置格式化成fat16檔案系統,同mkfs.msdos
... ...
2)mkswap 把一個分割槽格式化成為swap交換區;
[[email protected] beinan]# mkswap /dev/sda6 注:建立此分割槽為swap 交換分割槽
[[email protected] beinan]# swapon /dev/sda6 注:載入交換分割槽;
[[email protected] beinan]# swapoff /dev/sda6 注:關閉交換分割槽;
我們檢視系統已經載入的swap交換分割槽;
[[email protected] beinan]# swapon /dev/sda6 注:載入交換分割槽;
[[email protected] beinan]# swapon -s
Filename Type Size Used Priority
/dev/hda7 partition 787144 0 -1
/dev/sda6 partition 225144 0 -3
<code>
為什麼我的系統有兩個交換分割槽?因為我用移動U盤做的實驗,主要是為寫教程之用;sda6是我在U盤上建的swap分割槽;
如果讓swap開機就載入,應該改 /etc/fstab檔案,加類似如下一行;
<code>
/dev/sda6 swap swap defaults 0 0 注:把此行中的/dev/hda7 改為您的交換分割槽就行;
或者把命令列直接寫入 /etc/rc.d/rc.local中也行;
swapon /dev/sda6
如果您的硬碟不能再分割槽,您可以建立一個swap檔案
[[email protected] beinan]# dd if=/dev/zero of=/tmp/swap bs=1024 count=524288 注:建立一個大小為512M 的swap 檔案,在/tmp目錄中;您可以根據自己的需要的大小來建立swap 檔案;
讀入了 524288+0 個塊
輸出了 524288+0 個塊
[[email protected] beinan]# mkswap /tmp/swap 注:把/tmp/swap 檔案,建立成swap 交換區
Setting up swapspace version 1, size = 536866 kB
no label, UUID=d9d8645d-92cb-4d33-b36e-075bb0a2e278
[[email protected] beinan]# swapon /tmp/swap 注:掛載swap
[[email protected] beinan]# swapon -s
Filename Type Size Used Priority
/dev/hda7 partition 787144 888 -1
/tmp/swap file 524280 0 -2
注意:其實我們在安裝系統的時候,就已經劃分了交換分割槽;檢視/etc/fstab,應該swap的行;如果您在安裝系統時沒有新增swap,可以通過這種辦法來新增
在/dev/hda5
上建一個msdos的檔案系統,同時檢查是否有壞軌存在,並且將過程詳細列出來:
mkfs -V -t msdos -c /dev/hda5
mkfs -t ext3 /dev/sda6 //將sda6分割槽格式化為ext3格式
mkfs -t ext2 /dev/sda7 //將sda7分割槽格式化為ext2格式
格式化
mke2fs 選項 分割槽名(檔案系統名) make ext2 file system(命令預設格式化為ext2)
-b 指定block的大小{1024k|2048k|4096k}
-c 檢測磁碟壞塊
-j 加入日誌功能,即格式化成ext3
-L 分割槽標籤lable指定
-i byte/inode byte-per-inode 多少位元組分配一個節點
-n 指明節點的個數
-m 指明管理空間 預設為5%
分割槽屬性修改 tunable ext2 file system 調節ext2檔案系統(在不重新格式化的情況下對分割槽屬性進行修改)
tune2fs 選項 分割槽名(檔案系統名)
-j 加入日誌功能
-L 重新加捲標
-l 檢視super block中資訊
-i 指定自檢週期(0或-1關閉)可以按時間和掛載次數所謂度量標準
-m 調整管理空間
-c 指定掛載N此後自檢
-o 設定分割槽預設掛載選項
手動發起自檢
fsck 選項 分割槽名(檔案系統名)
-t 手動發起自檢
-a 遇到錯誤時自動修復
fuser命令
檢視當前正在佔用檔案系統、服務的程序
-v 詳細顯示
-m 所有使用檔案系統的程序
-k 殺死程序、踢出使用者
blkid 檔案系統的UUID
/dev/mapper/vol0-home: UUID="c24712e8-e628-4812-b39a-fc61a00fbc26" TYPE="ext3"
/dev/mapper/vol0-root: UUID="4fc1b7c4-8342-4ad6-9ee1-8ad5a4c3893d" TYPE="ext3"
/dev/sda3: LABEL="SWAP-sda3" TYPE="swap"
/dev/sda1: LABEL="/boot" UUID="65a27343-1a4a-4b7a-b60d-5d8366bea062" TYPE="ext3"
mount 檔案系統的掛載資訊
/dev/mapper/vol0-root on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/mapper/vol0-home on /home type ext3 (rw)
df –lh磁碟使用率、掛載資訊
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vol0-root
29G 2.4G 25G 9% /
/dev/mapper/vol0-home
1.9G 37M 1.8G 2% /home
/dev/sda1 99M 21M 74M 22% /boot
tmpfs 252M 0 252M 0% /dev/shm
/dev/sda5 9.2G 150M 8.6G 2% /mnt/sda5
df –ilh磁碟inode使用率、掛載資訊
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vol0-root
7.4M 101K 7.3M 2% /
/dev/mapper/vol0-home
496K 342 496K 1% /home
/dev/sda1 26K 36 26K 1% /boot
tmpfs 63K 1 63K 1% /dev/shm
/dev/sda5 1.2M 11 1.2M 1% /mnt/sda5
free –m 檢視記憶體快取虛擬記憶體使用情況
total used free shared buffers cached
Mem: 503 228 274 0 39 105
-/+ buffers/cache: 83 419
Swap: 509 0 509
dumpe2fs 顯示檔案系統塊組資訊
虛擬記憶體
通過fdisk建立swap屬性的檔案系統(t選項 選擇id=81的swap)
使用mkswap命令進行格式化
swapon 掛載虛擬記憶體
-a掛載所有虛擬記憶體
swapoff解除安裝虛擬記憶體
另附一篇很詳細的檔案系統管理的文章
https://blog.csdn.net/freeking101/article/details/78223455?locationNum=3&fps=1