版權聲明:本文為部落客原創文章,轉載請注明出處。 https://blog.csdn.net/gongxifacai_believe/article/details/84108113
1、格式化
低級格式化:分區之前進行,劃分磁道、形成簇,硬體制造商出廠之前做;
進階格式化:分區之後對分區進行,建立檔案系統。
2、中繼資料區和資料區
檔案系統分為中繼資料區和資料區。
中繼資料區存放檔案中繼資料(inode (index node)),中繼資料指檔案的大小、權限、屬主屬組、時間戳、資料塊指針,而不包含檔案名,檔案名在目錄上存放,inode存放inode編号和資料塊指針,資料區的目錄存放檔案名和inode編号的對應關系。檔案名存放在上級目錄中。
删除檔案的操作即是将此檔案inode指向的所有data block标記為未使用狀态,将此檔案的inode标記為未使用,以及修改data block和inode位圖。
複制檔案的操作即是建立檔案。而移動檔案的操作,在同一檔案系統中,改變的僅是其路徑映射,inode還是那個值,在不同檔案系統中,複制資料至目标檔案,并删除原檔案。
符号連結檔案:存儲資料塊指針的空間當中存儲的是真實檔案的通路路徑,不占據磁盤的資料區域,是一種特殊檔案類型。
裝置檔案:存儲資料指針的空間當中存儲的是裝置号(major, minor),不占據磁盤的資料區域,是一種特殊檔案類型。
位圖索引(bitmap index):每一位對應一個資料塊或者一個inode,在塊組級别實作,資料塊位圖索引位為1代表該資料塊已占用,為0代表該資料塊未占用,inode位圖索引位為1代表該inode已占用,為0代表該inode未占用。
超級塊:定義一共有多少個塊組,每個塊組從哪個編号開始,哪個編号結束。
3、超級塊
超級塊(superblock)的作用是存儲檔案系統的大小,有多少是空的,已經填滿的占多少,以及它們各自的總數等等。要使用一個分區來進行資料通路,第一個要通路的就是超級塊,如果超級塊損壞了,磁盤就不可用了。
超級塊占用第1号實體塊,是檔案系統的控制塊,超級塊包括:檔案系統的大小、空閑塊數目、空閑塊索引表、空閑i節點數目、空閑i節點索引表、封鎖标記等。超級塊是系統為檔案配置設定存儲空間、回收存儲空間的依據。
是以為了防止超級塊資料損壞,就需要對超級塊資料進行備份,以便于損壞時可以恢複。
4、檔案系統
Linux的核心級檔案系統:ext2(無日志功能),ext3(CentOS 5預設檔案系統),ext4(CentOS 6預設檔案系統),xfs(CentOS 7預設檔案系統,為企業級64位檔案系統,單個檔案大小沒有上限)reiserfs(反删除性能好,檔案删掉找回比較容易),btrfs(實驗階段,沒有生産可用)。
核心級檔案系統的組成部分:
(1)檔案系統驅動:由核心提供;
(2)檔案系統管理工具:由使用者空間的應用程式提供。
CD光牒檔案系統:iso9660。
網絡檔案系統:nfs,cifs(smbfs)。
叢集檔案系統:gfs2,ocfs2。
核心級分布式檔案系統:ceph。
使用者空間的分布式檔案系統:mogilefs,moosefs,glusterfs。
Windows的檔案系統:vfat(fat32),ntfs。
僞檔案系統:proc,sysfs,tmpfs,hugepagefs。
Unix的檔案系統:UFS, FFS(快速檔案系統), JFS(日志檔案系統)。
交換分區檔案系統:swap。
根據其是否支援日志功能還可分為:
日志型檔案系統:ext3,ext4,xfs;
非日志型檔案系統:ext2,vfat。
5、硬連結與符号連結
連結檔案:通路同一個檔案的不同路徑。
(1)硬連結:指向同一個inode的多個檔案路徑;
硬連結特性:
1)目錄不支援硬連結,為了避免循環連結;
2)硬連結不能跨檔案系統,不同檔案系統inode是獨立計數的;
3)建立硬連結會增加inode引用計數;ls -l結果中權限後面的數字即為inode引用計數;當inode的引用計數減少到0,表明沒有檔案名指向這個inode,系統就會回收這個inode号碼以及其所對應的block區域。
注意:硬連結檔案和原檔案大小相同。
建立硬連結:
ln src link_file
目錄檔案的連結數
建立目錄時,預設會生成兩個目錄項:".“和”…"。前者的inode号碼就是目前目錄的inode号碼,等同于目前目錄的硬連結。後者的inode号碼就是目前目錄的父目錄的inode号碼,等同于父目錄的硬連結。是以,任何一個目錄的硬連結總數,總是等于2加上它的子目錄總數(含隐藏目錄),這裡的2是父目錄對其的硬連結和目前目錄下"."的硬連結。
(2)符号連結:指向一個檔案路徑的另一個檔案路徑,權限是777,即lrwxrwxrwx。
符号連結特性:
1)符号連結與原檔案是兩個各自獨立的檔案,各有自己的inode;對原檔案建立符号連結不會增加引用計數;
2)支援對目錄建立符号連結,可以跨檔案系統;
3)删除符号連結檔案不影響原檔案,但删除原檔案,符号連結指定的路徑即不存在,此時會變成無效連結;
注意:符号連結檔案的大小是其指向的檔案的路徑字元串的位元組數,删除原檔案後,符号連結指向的檔案會閃,當建立了與原檔案相同名字的檔案,不管是不是原檔案的内容,符号連結也可以指向了。
建立符号連結:
ln -s src link_file
-v:verbose 建立硬連結和符号連結都支援-v選項,顯示過程。
如果連結的是目錄,或者原檔案與連結檔案在不同的檔案系統,使用符号連結。如果原檔案與連結檔案在同一個檔案系統,可以使用符号連結或硬連結。
6、檔案系統管理工具
建立檔案系統的工具mkfs:mkfs.ext2,mkfs.ext3,mkfs.ext4,mkfs.xfs,mkfs.vfat。
檢測及修複檔案系統的工具fsck:fsck.ext2,fsck.ext3,fsck.ext4,fsck.xfs,fsck.vfat。
檢視檔案系統屬性的工具:dumpe2fs,tune2fs。
調整檔案系統特性的工具:tune2fs。
!cat 調用最近一次的cat指令
(1)ext系列檔案系統的管理工具
mkfs.ext2,mkfs.ext3,mkfs.ext4
:可以向後相容,即可以相容較老版本;
mkfs -t ext2 = mkfs.ext2
:前面指令轉換為後面指令執行;
eg.
mkfs.ext2 /dev/sda3
:格式化會破壞原檔案系統上的所有檔案;
mke2fs
:make ext file system,ext系列檔案系統的專用管理工具;
mke2fs [OPTIONS] device
-t {ext2|ext3|ext4}:指明要建立的檔案系統類型;
mkfs.ext4 = mkfs -t ext4 = mke2fs -t ext4
ext3獨有的顯示方式:
SEC_TYPE="ext2" TYPE="ext3"
-b {1024|2048|4096}:指明檔案系統的塊大小;
-L LABEL:指明卷标;
-j:建立有日志功能的檔案系統ext3;
mke2fs -j = mke2fs -t ext3 = mkfs -t ext3 = mkfs.ext3 = mke2fs -O has_journal
-i #:bytes-per-inode,指明inode與位元組的比率;即每多少位元組建立一個inode,此位元組數不應該小于塊大小;
-N #:直接指明要給此檔案系統建立的inode的數量;
-m #:指定預留白間占整個分區空間的百分比,預設為5;
-O [^] FEATURE:以指定的特性建立目标檔案系統;不加 ^代表啟用此特性,加 ^代表關閉此特性。
(2)e2label指令:管理ext系列檔案系統的卷标,卷标的檢視與設定
檢視:
e2label device
設定:
e2label device LABEL
(3)tune2fs指令:檢視或修改ext系列檔案系統的某些屬性
注意:塊大小建立後不可修改。
tune2fs [OPTIONS] device
-l:檢視指定檔案系統的超級塊資訊;
[root@localhost ~]# tune2fs -l /dev/sda3
:檢視/dev/sda3中超級塊中的内容;
# tune2fs -l DEVICE
# dumpe2fs -h DEVICE
修改指定檔案系統的屬性:
-j:ext2 --> ext3;無損更新,資料不損壞;
-L LABEL:修改卷标;
-m #:調整預留白間百分比;
-O [^]FEATURE:開啟或關閉某種特性;不用重新格式化即可完成調整;特性前加 ^,表示關閉此種特性;
tune2fs -O ^has_journal /dev/sda3
:将ext3格式轉換為ext2格式;
tune2fs -O has_journal /dev/sda3
:将ext2格式轉換為ext3格式;
-o [^]mount_options:開啟或關閉某種預設挂載選項;
tune2fs -o acl /dev/sda3
:對分區啟用acl;
tune2fs -o ^acl /dev/sda3
:對分區禁用acl。
-U UUID:修改UUID。
(4)dumpe2fs指令:顯示ext系列檔案系統的屬性資訊
dumpe2fs [-h] device
-h 顯示超級塊資訊。
(5)用于實作檔案系統檢測的工具
因程序意外中止或系統崩潰、系統斷電等原因導緻寫入操作非正常終止時,可能會造成檔案損壞,此時,應該檢測并修複檔案系統,建議離線進行。
工具:fsck,e2fsck。
ext系列檔案系統的專用檢測工具:e2fsck
e2fsck [OPTIONS] device
-y:對所有問題自動回答為yes;
-f:即使檔案系統處于clean狀态,也要強制進行檢測;
fsck
-t fstype:指明檔案系統類型,fsck -t ext4 = fsck.ext4;
-a:無須互動而自動修複所有錯誤;
-r:互動式修複錯誤。
(6)xfs檔案系統
CentOS 6安裝xfs檔案系統:
# yum -y install xfsprogs
xfs檔案系統建立:
mkfs.xfs /dev/sda3
:建立xfs檔案系統;
mkfs.xfs -f /dev/sda3
:已有檔案系統強制覆寫;
fsck.xfs
:檢測xfs檔案系統;
(7)blkid指令
blkid [OPTION]... [DEVICE]
:檢視指定塊裝置的屬性資訊;
blkid -L LABEL:根據LABEL定位裝置,可以檢視到卷标名所對應的磁盤分區;
blkid -U UUID:根據UUID定位裝置,可以檢視到UUID所對應的磁盤分區;
[root@localhost ~]# e2label /dev/sda3 MYDATA
[root@localhost ~]# blkid -L MYDATA
/dev/sda3
複制
(8)swap檔案系統
Linux上的交換分區必須使用獨立的檔案系統,即獨立的磁盤分區,且檔案系統的System ID必須為82。
建立swap分區的特定工具:
mkswap
指令。前提:要先調整裝置分區類型為8E。
隻有類型為82swap的分區才可以用mkswap指令建立swap裝置。
mkswap [OPTIONS] device
-L LABEL:指明卷标;
-f:強制。
(9)vfat系統
Windows無法識别Linux的檔案系統。是以,儲存設備需要兩種系統之間交叉使用時,應該使用Windows和Linux同時支援的檔案系統fat32(vfat)。Windows叫fat32,Linux叫vfat。
# mkfs.vfat device
7、檔案系統的挂載
根檔案系統之外的其它檔案系統要想能夠被通路,都必須通過關聯至根檔案系統上的某個目錄來實作,此關聯操作即為挂載,此目錄即為挂載點。
挂載點:mount_point,用于作為另一個檔案系統的通路入口。
注意:1)要使用事先存在的目錄作為挂載點;2)應該使用未被或不會被其它程序使用到的目錄作為挂載點;3)挂載點下原有的檔案将會被隐藏。
mount指令:
mount DEVICE MOUNT_POINT
DEVICE:所要挂載的磁盤分區;
MOUNT_POINT:挂載點,另一個檔案系統的通路入口;
固定挂載點:/mnt,/media;
mount [-nrw] [-t vfstype] [-o options] device dir
指令選項:
-a:自動挂載所有(/etc/fstab檔案中定義的)支援自動挂載的裝置;
-r:readonly,隻讀挂載;光驅(不是刻錄機)隻能隻讀挂載;
-w:read and write, 讀寫挂載;
-n:預設情況下,裝置挂載或解除安裝的操作會同步更新至/etc/mtab檔案中,-n用于禁止此特性;
-t vfstype:指明要挂載的裝置上的檔案系統的類型,多數情況下可省略,此時mount會通過blkid來判斷要挂載的裝置的檔案系統類型;
-L LABEL:挂載時以卷标的方式指明裝置:
mount -L LABEL dir
-U UUID:挂載時以UUID的方式指明裝置:
mount -U UUID dir
,
mount UUID='uuid' dir
;
-o options:挂載選項,挂載後目錄或檔案系統應當具有什麼特性;
sync/async:同步/異步操作;異步IO是指,資料寫操作先于記憶體完成,而後再根據某種政策同步至持久裝置中;
atime/noatime:檔案或目錄在被通路時是否立即更新其通路時間戳;
diratime/nodiratime:目錄在被通路時是否更新其通路時間戳;
remount:重新挂載,通常用于不解除安裝的情況下重新指定挂載選項;
acl:在此裝置支援使用facl功能,預設不支援;
# mount -o acl device dir
# tune2fs -o acl device
ro:隻讀 -o ro = -r
rw:讀寫 -o rw = -w
dev/nodev:此裝置上是否允許建立裝置檔案;預設允許;
exec/noexec:是否允許運作此裝置上的程式檔案;
auto/noauto:是否支援自動挂載,即是否支援使用mount -a選項自動挂載,自動挂載操作需要寫入fstab檔案中,寫明挂載到何處;
user/nouser:是否允許普通使用者挂載此檔案系統;
suid/nosuid:是否允許程式檔案上的suid和sgid特殊權限生效;
relatime/norelatime:是否參考檔案的修改或改變時間來更新inode的通路時間;
defaults:預設選項為rw,suid,dev,exec,auto,nouser,async和relatime。
綁定操作:可以實作将目錄綁定至另一個目錄上,作為其臨時通路入口。
mount --bind 源目錄 目标目錄
或者
mount -B 源目錄 目标目錄
umount 源目錄或目标目錄
:解除綁定
檢視目前系統所有已挂載的裝置::mount指令的結果是顯示所有已挂載的檔案系統、僞檔案系統和cgroup檔案系統;
# mount
:目前系統上的挂載和解除安裝結果會寫入此檔案,該指令等同于
# cat /etc/mtab
。
# cat /proc/mounts
CD光牒裝置檔案:IDE:/dev/hdc,SATA:/dev/sr0;
[root@localhost ~]# ll /dev
lrwxrwxrwx. 1 root root 3 Dec 7 15:56 cdrom -> sr0
複制
sr0是虛拟機虛拟出的SATA接口,用于存放CD光牒,老版本的虛拟機可能會虛拟出hdc,是IDE接口。
符号連結檔案:/dev/cdrom,/dev/cdrw,/dev/dvd,/dev/dvdrw;
挂載并解除安裝CD光牒裝置:
mkdir /media/cdrom
mount -r /dev/cdrom /media/cdrom
umount /dev/cdrom
挂載U盤:事先識别U盤的裝置檔案;
挂載本地的回環裝置(本地的一個檔案作為裝置):多見于挂載.iso鏡像檔案
# mount -o loop /PATH/TO/SOME_LOOP_FILE MOUNT_POINT
設定除根檔案系統以外的其它檔案系統能夠開機時自動挂載:/etc/fstab檔案。開機時運作一個腳本,該腳本會找到該檔案中的裝置,一一進行挂載,然後顯示登入提示符。每行定義一個要挂載的檔案系統及相關屬性,共有6個字段:
1)要挂載的裝置:
裝置檔案;LABEL 卷标;UUID(CentOS 7目前使用的方式);僞檔案系統(如sysfs, proc, tmpfs等,給名稱即可,會自動識别在哪,怎麼挂的);
2)挂載點 :swap類型的裝置的挂載點為swap;
3)檔案系統類型;
4)挂載選項:defaults:使用預設挂載選項(mount指令中的選項);
如果要同時指明多個挂載選項,彼此間以逗号分隔(如defaults,acl,noatime,noexec)
5)轉儲頻率(備份頻率):
0:從不備份;
1:每天備份;
2:每隔一天備份;
6)自檢次序:
0:不自檢,額外建立的檔案系統都無須自動自檢;
1:首先自檢,通常隻能是根檔案系統需要首先自檢;
2:次級自檢,不同的裝置可以使用同一個自檢次序;
…
mount -a: 可重新加載/etc/fstab檔案中的所有挂載項,自動挂載定義在此檔案中的所有支援自動挂載的裝置,已挂載的不管,未挂載的現在自動挂載,挂載選項defaults為支援自動挂載。
/etc/fstab檔案LABEL方式指定挂載如下,并有挂載選項acl:
#
# /etc/fstab
# Created by anaconda on Fri Nov 11 09:39:19 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=2435469a-8504-42b3-8453-c8cb16538bf8 / ext4 defaults 1 1
UUID=49f88d8c-1545-4bb3-8e1f-6b3a315d8435 /boot ext4 defaults 1 2
UUID=67626ef9-2332-4fb2-a63a-88b4bf1488bc /home ext4 defaults 1 2
UUID=d14a0467-bb20-4466-a512-9b3e1c5b06cb /var ext4 defaults 1 2
UUID=1ad1cc93-9630-47df-9a67-00c57dd08b42 swap swap defaults 0 0
LABEL=MYDATA /mydata ext4 defaults,acl 0 0
~
複制
8、檔案系統的解除安裝
umount指令:
umount DEVICE
或者
umount MOUNT_POINT
;
注意:挂載點沒有被程序通路時方可解除安裝,正在被程序通路到的挂載點無法被解除安裝。
檢視被哪個或哪些程序所占用:
# lsof MOUNT_POINT
# fuser -v MOUNT_POINT
終止所有正在通路某挂載點的程序:
# fuser -km MOUNT_POINT
:如果bash占用該挂載點,該指令将退出目前bash。
[root@localhost ~]# mount -r /dev/cdrom /media
[root@localhost ~]# cd /media
[root@localhost media]# umount /media
umount: /media: target is busy.
(In some cases useful info about processes that use the device is found by lsof(8) or fuser(1))
[root@localhost media]# lsof /media
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 4009 root cwd DIR 11,0 2048 1856 /media
lsof 6240 root cwd DIR 11,0 2048 1856 /media
lsof 6241 root cwd DIR 11,0 2048 1856 /media
[root@localhost media]# fuser -v /media
USER PID ACCESS COMMAND
/media: root kernel mount /media
root 4009 ..c.. bash
複制
9、交換分區的啟用和禁用
建立交換分區的指令:mkswap。
啟用交換分區:swapon
swapon [OPTION] [DEVICE]
-a:激活定義在/etc/fstab檔案中的所有swap裝置;
-p PRIORITY:指定優先級(用數字來表示);
禁用交換分區:swapoff
swapoff [OPTION]... [DEVICE]
-a:禁用所有交換分區;
例:1、建立一個10G的分區,并格式化為ext4檔案系統;
(1)block大小為2048;預留白間為2%,卷标為MYDATA;
(2)挂載至/mydata目錄,要求挂載時禁止程式自動運作,且不更新檔案的通路時間戳;
(3)可開機自動挂載;
2、建立一個大小為1G的swap分區,并啟動之;
Answer:
1、mke2fs 10G
(1)mke2fs -t ext4 -b 2048 -m 2 -L MYDATA /dev/sda6
(2)mount -o noexec,noatime /dev/sda6 /mydata
(3)向/etc/fstab檔案中加入挂載條目
2、mkswap /dev/sda7 該/dev/sda7分區大小為1G
swapon /dev/sda7
複制
10、記憶體及交換分區的使用資訊檢視
(1)free
檢視目前記憶體使用狀況,包括實體記憶體和交換記憶體。
-m:以MB為機關顯示;
-g:以GB為機關顯示,不夠1GB顯示為0。
顯示結果:Mem為實體記憶體的使用情況行,Swap為交換分區的使用情況行;
-/+ buffers/cache:表示實體記憶體在不考慮緩沖和緩存占據的空間時的使用情況;
buffers:緩沖,用來緩沖寫;
cache:緩存,用來緩存讀;
11、檔案系統空間占用等資訊檢視
(1)df指令
disk free,檢視磁盤的使用狀态,主要是挂載後的磁盤。
df [OPTION]... [FILE]...
-l:僅顯示本地檔案系統的相關資訊,而不顯示網絡檔案系統;
-h:human-readable;
-i:顯示inode的使用狀态而非預設的磁盤空間使用資訊;
[root@localhost ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on 不管block是幾K,隻顯示1K block
/dev/sda2 60760940 4085244 53566168 8% /
devtmpfs 919992 0 919992 0% /dev
tmpfs 934328 144 934184 1% /dev/shm
tmpfs 934328 9128 925200 1% /run
tmpfs 934328 0 934328 0% /sys/fs/cgroup
/dev/sda3 10190100 57284 9592144 1% /home
/dev/sda1 999320 133136 797372 15% /boot
/dev/sda5 6061632 1385144 4345532 25% /var
tmpfs 186868 16 186852 1% /run/user/0
/dev/sr0 7587292 7587292 0 100% /media
[root@localhost ~]# df -l
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 60760940 4085272 53566140 8% /
devtmpfs 919992 0 919992 0% /dev
tmpfs 934328 144 934184 1% /dev/shm
tmpfs 934328 9132 925196 1% /run
tmpfs 934328 0 934328 0% /sys/fs/cgroup
/dev/sda3 10190100 57284 9592144 1% /home
/dev/sda1 999320 133136 797372 15% /boot
/dev/sda5 6061632 1385160 4345516 25% /var
tmpfs 186868 16 186852 1% /run/user/0
/dev/sr0 7587292 7587292 0 100% /media
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 58G 3.9G 52G 8% /
devtmpfs 899M 0 899M 0% /dev
tmpfs 913M 144K 913M 1% /dev/shm
tmpfs 913M 9.0M 904M 1% /run
tmpfs 913M 0 913M 0% /sys/fs/cgroup
/dev/sda3 9.8G 56M 9.2G 1% /home
/dev/sda1 976M 131M 779M 15% /boot
/dev/sda5 5.8G 1.4G 4.2G 25% /var
tmpfs 183M 16K 183M 1% /run/user/0
/dev/sr0 7.3G 7.3G 0 100% /media
[root@localhost ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda2 3866624 134506 3732118 4% /
devtmpfs 229998 391 229607 1% /dev
tmpfs 233582 7 233575 1% /dev/shm
tmpfs 233582 548 233034 1% /run
tmpfs 233582 13 233569 1% /sys/fs/cgroup
/dev/sda3 655360 387 654973 1% /home
/dev/sda1 65536 338 65198 1% /boot
/dev/sda5 393216 5399 387817 2% /var
tmpfs 233582 23 233559 1% /run/user/0
/dev/sr0 0 0 0 - /media
複制
(2)du指令
檢視某目錄空間占用情況。
du [OPTION]... [FILE]...
-s: sumary,顯示目錄下所有檔案的大小之和;
-h: human-readable
[root@localhost ~]# ls -ldh /usr
drwxr-xr-x. 13 root root 4.0K Nov 11 09:40 /usr
[root@localhost ~]# du -s /usr
3972704 /usr
[root@localhost ~]# du -sh /usr
3.8G /usr
複制
(3)dd指令:convert and copy a file
實作檔案底層複制,cp通過檔案系統複制,dd通過塊複制,複制更底層,是以效率更高。
用法:
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST
bs=#:block size, 複制單元大小,機關位元組;
count=#:複制多少個bs;
dd if=/etc/fstab of=/tmp/fstab
dd if=/etc/fstab of=/tmp/fstab.2 bs=1 count=100
複制
磁盤拷貝:
dd if=/dev/sda of=/dev/sdb
備份MBR:
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
用于清除磁盤上的分區:
dd if=/dev/zero of=/dev/sda bs=512 count=1
破壞MBR中的bootloader:MBR共512位元組,前446位元組是bootloader,64位元組是分區表:
dd if=/dev/zero of=/dev/sda bs=256 count=1
兩個特殊裝置:/dev/null:資料黑洞,/dev/zero:吐零機。
12、inode
(1)inode概述
檔案存儲在硬碟上,硬碟的最小存儲機關叫扇區,每個扇區存儲512位元組(0.5KB)。作業系統讀取硬碟的時候,不會一個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次性讀取一個塊(block)。這種由多個扇區組成的塊是檔案存儲的最小機關。塊的大小,最常見的是4KB,即連續八個扇區組成一個block。
檔案資料都存儲在塊中,我們必須找到一個地方存儲檔案的中繼資料資訊,比如檔案的建立者、檔案的建立日期、檔案的大小等等。這種存儲檔案中繼資料資訊的區域就叫做inode,中文譯名為“索引節點”。
inode包含檔案的中繼資料資訊,具體有以下内容:
檔案的位元組數;檔案擁有者的User ID;檔案的Group ID;檔案的讀、寫、執行權限;檔案的時間戳(共有3個:ctime指inode上一次變動的時間,mtime指檔案内容上一次變動的時間,atime指檔案上一次打開的時間);連結數(即有多少個檔案名指向這個inode);檔案資料block的位置。可以使用stat指令來檢視某個檔案的inode資訊。
總之,除了檔案名以外的所有檔案資訊,都存在inode之中。
inode也會消耗硬碟空間,是以硬碟格式化的時候,作業系統自動将硬碟分成兩個區域:一個是資料區,存放檔案資料;另一個是inode區(inode table),存放inode所包含的資訊。
每個inode節點的大小,一般是128位元組或256位元組。inode節點的總數在格式化時就給定,一般是每1KB或者2KB就設定一個inode。假定在一塊1GB的硬碟中,每個inode節點的大小為128位元組,每1KB就設定一個inode,那麼inode table的大小就會達到128MB,占整塊硬碟的12.8%。
檢視每個硬碟分區的inode總數和已經使用的數量,可以使用df -i指令。檢視每個inode節點的資訊可以使用:
dumpe2fs -h /dev/sda3 | grep "Inode size"
。由于每個檔案都必須有一個inode,是以有可能發生inode已經用光,但是硬碟還未存滿的情況,這時就無法在硬碟上建立新檔案。
每個inode都有一個号碼,作業系統用inode号碼來識别不同的檔案。需要說明的是,Unix/Linux系統内部不使用檔案名,而使用inode号碼來識别檔案。對于系統來說,檔案名隻是inode号碼便于識别的别稱或綽号。表面上,使用者通過檔案名打開檔案。實際上,系統内部這個過程分成3步:首先,系統找到這個檔案名對應的inode号碼;其次,通過inode号碼擷取inode資訊;最後,根據inode資訊找到檔案資料所在的block,讀出資料。
使用
ls -i
指令,可以看到檔案名對應的inode号碼:
ls -i abc.txt
。Unix/Linux系統中,目錄(directory)也是一種檔案,打開目錄,實際上就是打開目錄檔案。
目錄檔案的結構非常簡單,就是一系列目錄項的清單。每個目錄項由兩部分組成:所包含檔案的檔案名以及該檔案名對應的inode号碼。
ls指令隻列出目錄檔案中的所有檔案名:
ls /etc
。
ls -i指令列出整個目錄檔案,即檔案名和inode号碼:
ls -i /etc
。
如果要檢視檔案的詳細資訊,就必須根據inode号碼,通路inode節點,讀取資訊。
ls -l指令列出檔案的詳細資訊:
ls -l /etc
。
(2)inode的特殊作用
由于inode号碼與檔案名分離,這種機制導緻了一些Unix/Linux系統特有的現象:
- 有時,檔案名包含特殊字元,無法正常删除。這時,直接删除inode節點就能起到删除檔案的作用。
- 移動檔案或重命名檔案,隻是改變檔案名,不影響inode号碼。
- 打開一個檔案以後,系統就以inode号碼來識别這個檔案,不再考慮檔案名。是以,通常來說,系統無法從inode号碼得知檔案名。
第3點使得軟體更新變得簡單,可以在不關閉軟體的情況下進行更新,不需要重新開機。因為系統通過inode号碼識别運作中的檔案,不通過檔案名。更新的時候,新版檔案以同樣的檔案名生成一個新的inode,不會影響到運作中的檔案。等到下一次運作這個軟體的時候,檔案名就自動指向新版檔案,舊版檔案的inode則被回收。
(3)實際中的應用示例
【問題描述】
在一台配置較低的Linux伺服器(記憶體、硬碟比較小)的/data分區内建立檔案時,系統提示磁盤空間不足,用
df -h
指令檢視了一下磁盤使用情況,發現/data分區隻使用了66%,還有12G的剩餘空間,按理說不會出現這種問題。後來用
df -i
檢視了一下/data分區的索引節點(inode),發現已經用滿(IUsed=100%),導緻系統無法建立新目錄和檔案。
【查找原因】
/data/cache目錄中存在數量非常多的小位元組緩存檔案,占用的Block不多,但是占用了大量的inode。
【解決方案】
【方案一】删除/data/cache目錄中的部分檔案,釋放出/data分區的一部分inode。
【方案二】用軟連結将空閑分區/opt中的newcache目錄連結到/data/cache,使用/opt分區的inode來緩解/data分區inode不足的問題:
[root@localhost ~]# ln -s /opt/newcache /data/cache