Linux磁盤及文件系統管理詳解
計算機基礎知識:
馮.諾依曼體系結構構成的計算機,必有的五大基本組成部件:
馮.諾依曼計算機體系結構圖
運算器:用於完成各種算術運算、邏輯運算和數據傳送等數據加工處理;
控制器:用於控制程序的執行,是計算機的大腦。
運算器和控制器組成計算機的中央處理器(CPU)。控制器根據存放在存儲器中的指令序列(程序)進行工作,並由一個程序計數器控制指令的執行。控制器具有判斷能力,能根據計算結果選擇不同的工作流程;
存儲器:用於記憶程序和數據,例如:內存。程序和數據以二進制代碼形式不加區別地存放在存儲器中,存放位置由地址確定;
輸入設備:用於將數據或程序輸入到計算機中,例如:鼠標、鍵盤;
輸出設備:將數據或程序的處理結果展示給用戶,例如:顯示器、打印機;
北橋芯片:主要負責控制AGP顯卡、內存與CPU之間的數據交換;
南橋芯片:主要負責軟驅、硬盤、鍵盤以及附加卡的數據交換。(南橋芯片相對於北橋芯片數據處理量不算大,南橋芯片通過彙總的方式將數據傳到北橋芯片,北橋芯片纔是主芯片)。
設備類型:南橋芯片主要連接一些I/O設備,決定主板上的功能,主板上的各種接口(USB、串口),PCI總線(內存、聲卡),IDE(硬盤、光驅),以及主板上的其他芯片(RAID、網卡)都歸南橋芯片控制,屬於低速總線控制器。
Note:服務器的最重要的兩大I/O是網卡和磁盤;
那麼南橋芯片是如何來識別這些設備的呢?設備類型又有哪些?
I/O端口:就是一種地址,用於標示對應的I/O設備,I/O端口範圍:0——65536;
(1) 設備類型(宏觀上分類):
字符設備,character:以字符爲單位進行順序訪問的設備,例如鍵盤。
塊設備,block:以塊爲單位,能夠進行隨機訪問的設備,例如硬盤;
(2) 設備具體的分類(比如磁盤,CPU,內存等,我們需要對這些設備進行標識)
設備文件定義:關聯至一個驅動程序,進而能夠與之對應硬件設備進行交互。
(3) 設備文件的標識:
主設備號:標識的是設備的類型。
次設備號:同一類設備中不同設備的標識。(例如都是磁盤,要跟上具體編號1、2…)
[root@localhost ~]# ls -l /dev/sd* brw-rw---- 1 root disk 8, 0 Aug 23 17:01/dev/sda brw-rw---- 1 root disk 8, 1 Aug 23 09:01/dev/sda1 brw-rw---- 1 root disk 8, 2 Aug 23 17:01/dev/sda2 主,次磁盤結構:
磁盤結構圖給出了一個磁盤驅動器兩個主要的移動部件:一個是磁盤組合(diskassembly),另一個是磁頭組合(head assembly)。磁盤組合由一個或多個圓盤(platter)組成;它們圍繞一根中心主軸旋轉。圓盤的上表面和下表面塗覆了一層磁性材料,二進制位被存儲在這些磁性材料上。其中,0和1在磁材料中表現爲不同的模式。
1、 盤面:硬盤的每一個盤片都有兩個盤面(Side),即上、下盤面,一般每個盤面都會利用,都可以存儲數據,成爲有效盤片,也有極個別的硬盤盤面數爲單數;
2、 磁道:磁盤在格式化時被劃分成許多同心圓,這些同心圓軌跡叫做磁道(Track)。磁道從外向內從0開始順序編號。磁盤的每一個盤面有300~1024個磁道,新式大容量硬盤每面的磁道數更多;磁道是硬盤廠商在硬盤出廠時已劃分好的;
3、 扇區:sector,磁盤是固定角速度的設備;每秒轉動的角度,即每段圓弧叫做一個扇區。扇區從“1”開始編號,每個扇區中的數據作爲一個單元同時讀出或寫入,從邏輯層面上將已經進行了低級格式化了,單位爲512字節。第0個扇區存放的是磁盤的分區信息;即MBR:Master Boot Record,主引導記錄;
512byte:
bootloader,加載器,445bytes;
每16個bytes引導一個分區;
最後2個字節被填充了兩個5A,作爲MBR有效性標記;
4、 柱面:所有盤面上的同一位置的磁道構成一個圓柱,通常稱做柱面(Cylinder),每個圓柱上的磁頭由上而下從“0”開始編號。(分區是按照柱面進行分區的)
linux中的磁盤:Linux中的磁盤是以設備文件的形式展現出來的,這也正好體現了Linux一切皆文件的哲學思想;
(1) 設備文件的名稱:
即linux磁盤設備文件的訪問標識:/dev/[s|h]d[a-z][1,2…]
[s|h]:磁盤設備接口類型;
[a-z]:磁盤編號。
[1,2…]:分區標號,1-4標號:主分區和擴展分區的編號,5以上的編號爲邏輯分區編號。如:sda1,代表SCSI接口類型的第一塊磁盤的第一個主分區;
Note:特性:對於Linux系統而言,每個分區都是可以獨立訪問的設備;
(2) 磁盤接口類型:
IDE接口(ATA):並行接口(理解爲:兩個IDE控制器:每個控制器可通過線纜接入兩塊磁盤,主/從,即master/slave模式)這類接口傳輸速率133MB/s。linux中標識爲/dev/hd[a-z][1,2…].
SCSI:Small Computer System Interface,小型計算機接口;
USB接口:串行接口,3.0接口的傳輸速率爲480MB/s。Linux中標識爲/dev/sd[a-z][1,2…]
SAS接口:串行接口,也稱爲序列式SCSI,它由並行SCSI物理存儲接口演化而來,序列方式能提供更快速的通信傳輸速度及更簡易的配置。此外SAS支持與序列式ATA(SATA)設備兼容。它的傳輸速率是6Gbps。Linux中標識爲/dev/sd[a-z][1,2…]
新磁盤需要經過哪些操作才能使用呢?
三個步驟:1、磁盤分區;2、格式化(創建文件系統);3、掛載;
磁盤管理工具fdisk(分區):fdisk提供了一個交互式接口來管理分區,它有許多子命令,用於磁盤額分區的管理,所有編輯操作,都是在內存中完成的。沒有直接同步到磁盤,保存退出後才能完成磁盤的同步。
# fdisk –l 顯示所有的磁盤設備的詳細信息;
#fdisk –l [DEVICE_NAME]顯示指定的設備的詳細信息。
子命令的作用:
Command action a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibilityflag d delete a partition,#刪除一個分區; l list known partition types,#列出已知的所有分區類型; m print this menu,#顯示幫助信息; n add a new partition,#創建一個新分區; o create a new empty DOSpartition table p print the partition table,#打印分區表,列出現有的分區信息; q quit without saving changes,#不保存分區信息退出; s create a new empty Sundisklabel t change a partition's system id,#修改分區的systemis(16進制的數字) u change display/entry units v verify the partition table w write table to disk and exit,#保存分區信息並退出; x extra functionality (expertsonly) Command (m for help): #m顯示幫助信息;
Note:在子命令模式中,想刪除當前的字符,按Ctrl+Backspace組合鍵才能刪除;
查看內核中的分區情況:
cat/proc/partitions 內核是否真正讀取了分區表;
[root@localhost ~]# cat /proc/partitions major minor #blocks name 8 0 125829120 sda 8 1 204800 sda1 8 2 62914560 sda2 253 0 20971520 dm-0 253 1 2097152 dm-1文件系統的創建(格式化):
磁盤分區後,我們接下來就是格式化,也就是文件系統的創建,那麼什麼是文件系統呢?
(1) 文件系統的定義:管理存儲空間中,存儲大量文件時,實現按名存儲的一種機制(按塊進行存取,一個塊=2個扇區的大小)。
文件系統的結構:
每一個文件都是由元數據和數據組成,文件系統通常會將這兩部分的數據分別存放在不同的塊,權限和屬性放置到inode中,實際參數存放在data block中。
另外還有一個superblock(超級塊),會記錄整個文件系統的整體信息,包括inode與block的總量、使用量、剩餘量等。
對上圖的解析:
一個分區可以理解爲由一個BootBlock和N多個塊組(Block Group)構成的;
Boot Block:塊是預留的,用來引導系統分區的。它是被MBR中的Boot Loader調用的。
Super Block:存儲整個文件系統的詳細信息,包括inode/block的總量、使用量、剩餘量,以及文件系統的格式與相關信息;塊組0上必須有Super Block,其他的組可以有也可以沒有,最好是在其他的塊組中有Super Block,用於備份;
GDT:塊組的描述符,描述該組存放的是什麼數據;
Block Bitmap(塊位圖):可以知道哪些block是空的;
Inode Bitmap(Inode位圖):可以知道哪些inode是未使用的;
Inode Table:存放inode條目;
inode屬性:
該文件的訪問權限(r,w,x)
該文件的屬主屬組
該文件的大小
該文件創建或狀態改變的時間(ctime);
該文件最近一次讀取時間(atime)
該文件最近一次修改時間(mtime)
定義文件特性的標誌(flag),例如SUID等;
該文件真正內容的指向(記錄此文件的數據所在的block)
inode的特性:
每個inode大小均固定爲128bytes
每個文件都只會佔用一個inode,所以文件系統上能創建的文件個數與inode數量有關;
inode不記錄文件名,文件名的記錄在目錄block中;
系統讀取文件時需要先找到inode,並分析inode所記錄的權限和用戶是否符合,若符合才能開始實際讀取block的內容;
Data Block:實際記錄文件的內容,若文件太大時,會佔用多個block。
問題1、在linux中要創建一個文件test.txt文件,需要經過哪幾個步驟?
(1) 首先是通過超級塊來明確一下,那個塊組有空間能存儲文件;
(2) 確定塊組之後,在inode表中查找空閒的inode條目,由0標記爲1;
(3) 通過塊位圖,查找空閒的block;
(4) 在inode條目中添加空閒block塊的指向,在空的block中創建test.txt;
問題2、在linux中要查找/tmp/aa/bb文件的過程?
Answer:先查 / 的inode ---> 查 / 目錄block中對應tmp的inode ---> 根據查到的/tmp的inode去查/tmp/目錄block中對應aa的inode ---> 根據查到的/tmp/aa的inode去查/tmpaa目錄block中對應的bb的inode ---> 根據查到的/tmp/aa/bb的inode去查block發現是文件 ---> 讀取數據;
(2) 常用的文件系統類型:
centos 7系列,默認使用的是xfs系列
centos 6系列,默認使用的是ext4系列
centos 5系列,默認使用的是ext3系列
centos 4系列,默認使用的是ext2系列
iso9660 光盤文件系統
nfs 網絡文件系統
gfs2 集羣文件系統(redhat研發)
mogilefs、hdfs 兩者屬於分佈式文件系統
swap 交換分區格式(注意:swap分區不是把它當作內存來使用,而是內存中的數據交換到swap分區,即swap交換分區拿出部分空間來存儲內存中不常用的空間數據,以此來騰出更多的內存空間).
(3) 文件系統管理分爲兩部分:
文件系統內核模塊(普通的文件系統類型ext2\3\4)可以做如下理解:
[root@localhost ~]# cd/lib/modules/2.6.32-504.el6.x86_64/kernel/fs/ [root@localhost fs]# pwd /lib/modules/2.6.32-504.el6.x86_64/kernel/fs [root@localhost fs]# ls autofs4 cifs dlm ext2 fat gfs2 jffs2 nfs nls udf btrfs configfs ecryptfs ext3 fscache jbd lockd nfs_common squashfs xfs cachefiles cramfs exportfs ext4 fuse jbd2 mbcache.ko nfsd ubifs [root@localhost fs]#
/lib/modules/2.6.32-504.el6.x86_64/kernel/fs 文件系統的內核模塊的存放目錄,只有這裏的文件系統類型才能進行格式化;
文件系統管理工具:
Note:VFS虛擬文件系統(磨平了不同文件系統之間的差異,調用的時候直接訪問VFS文件系統)
(4) 文件系統管理工具:
mkfs:mkfs只是一個調用的功能,實際是這些應用程序的使用(mkfs.ext2 mkfs.ext4 mkfs.msdos mkfs.cramfs mkfs.ext3 mkfs.ext4dev mkfs.vfat)
mkfs–t 文件系統類型 分區名
mke2fs:mke2fs專門用來格式化ext系列文件系統的命令;
mke2fs[OPTION] 分區名
-t 用於指定文件系統類型{ext2|3|4}
-b指定塊的大小 {1024|2048|4096},塊的概念:多少個扇區封裝成一個單元;
-L‘LABEL’設定卷標名;
-j 相當於:-t ext3
mkfs.ext3 == mkfs –t ext3 == mke2fs –j == mke2fs –text3
-i # 爲數據中間中的每多少(#)個字節創建一個inode。(2T硬盤,每個都是幾k的小文件,根據文件的大概大小來創建相應的inode條目)
-N# 指定數據區有多少個inode;
-m# 指定爲管理預留空間佔主空間的百分比;
-OFEATURE[,….] 啓用指定特性;
-O^FEATURE 關閉指定特性;
[root@localhost ~]# mke2fs -t ext4 -b 4096-L juanming -N 30000 -m 8 /dev/sda3 mke2fs 1.41.12 (17-May-2010) Filesystem label=juanming————#卷標名爲:juanming OS type: Linux Block size=4096 (log=2)——————#塊的卷大小爲4096字節 Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 30176 inodes, 1313064 blocks——————#inode條目爲30176,塊條目數爲1313064; 105045 blocks (8.00%) reserved for thesuper user First data block=0 Maximum filesystem blocks=1346371584 41 block groups——————————————#25個塊組 32768 blocks per group, 32768 fragments pergroup————————#每個塊組中block總數 736 inodes per group————————#每個塊組的inode條目數; Superblock backups stored on blocks: 32768,98304, 163840, 229376, 294912, 819200, 884736 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystemaccounting information: done This filesystem will be automaticallychecked every 36 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
tune2fs:tune2fs重新設定ext系列文件系統中可調參數;
tune2fs [OPTION] 分區名
-l查看指定文件系統(分區)的超級塊詳細信息;
-L重新指定卷標名;
-m# 調整管理員預留空間的百分比;
-u指定文件系統的UUID;
[root@localhost ~]# e2label /dev/sda3 juanming [root@localhost ~]# tune2fs -L JuanMing1/dev/sda3 tune2fs 1.41.12 (17-May-2010) [root@localhost ~]# e2label /dev/sda3 JuanMing1
mkswap: mkswap用於交換分區的格式化;
mkswap [OPTION] 分區名
-L卷標名
-UUUID
swapon:掛載交換分區;
swapoff:卸載交換分區;
free:查看內存的使用情況:
-m按M爲單位;
-g 按G爲單位;
#free–m
blkid : 塊設備信息顯示工具 UUID也是一種引用;
-L卷標名 設備名
-UUUID 設備名
e2label分區名 :查看分區的卷標名;
dumpe2fs: 文件系統的超級塊信息查看工具;
dumpe2fs –h 只顯示超級塊頭部信息;
[root@localhost ~]# dumpe2fs -h /dev/sda3 dumpe2fs 1.41.12 (17-May-2010) Filesystem volume name: JuanMing1 #卷標名 Last mounted on: <not available> Filesystem UUID: 40206534-232b-4061-9205-e13e06db9d08 Filesystem magic number: 0xEF53 Filesystem revision #: 1(dynamic) Filesystem features: has_journal ext_attr resize_inodedir_index filetype extent flex_bg sparse_super large_file huge_file uninit_bgdir_nlink extra_isize Filesystem flags: signed_directory_hash Default mount options: (none) Filesystem state: clean Errors behavior: Continue Filesystem OS type: Linux #文件系統類型 Inode count: 30176 #總inode數目 Block count: 1313064 #總block數目 Reserved block count: 105045 Free blocks: 1275746 #空閒的block Free inodes: 30165 #空閒的inode First block: 0 Block size: 4096 #塊的大小單位4096字節 Fragment size: 4096 Reserved GDT blocks: 320 Blocks per group: 32768 #每個塊組中的block Fragments per group: 32768 Inodes per group: 736 #每個塊組中的inode Inode blocks per group: 46 #每個塊組中的inode block Flex block group size: 16 Filesystem created: Tue Aug 25 03:12:36 2015 #文件系統創建的時間; Last mount time: n/a Last write time: Tue Aug 25 03:46:56 2015 #tune2fs –l 也可以查看超級塊的詳細信息; Mount count: 0 Maximum mount count: 36 Last checked: Tue Aug 25 03:12:36 2015 Check interval: 15552000 (6 months) Next check after: Sun Feb 21 03:12:36 2016 Lifetime writes: 137 MB Reserved blocks uid: 0 (user root) Reserved blocks gid: 0 (group root) First inode: 11 Inode size: 256
文件系統掛載:
掛載定義:將額外的文件系統與根文件系統建立關聯關係。使得其作爲此額外文件系統的訪問入口的過程;
掛載操作時注意:
在linux系統上,所有的文件系統必須通過根文件系統的某個分支來訪問;
單一文件系統不應該被重複掛載在不同的掛載點(目錄)中;
單一目錄不應重複掛載多個文件系統;
作爲掛載點的目錄理論上都是空白目錄,不然原來目錄下的文件會被隱藏;直到卸載
掛載點注意:
事先存在;
應該使用別的進程未使用的目錄;
掛載點下原有的文件將被隱藏;
mount :掛載命令;
mount [選項] 設備掛載點
mount查看/etc/mtab已經掛載的條目;
-t 指定文件系統類型(CentOS6才能智能識別文件系統類型)
-r 只讀掛載
-w 讀寫掛載
-a 掛載/etc/fstab下的所有條目進行掛載;
-n 掛載時不更新/etc/mtab文件;
-B == --bind
mount –B 原目錄 目標目錄, 關聯目錄(把目標目錄關聯到原目錄)
umount 目標目錄 , 取消關聯(通常用於版本更新),例如:
[root@localhost ~]# mkdir /root/test1 #新建目錄 [root@localhost ~]# mount --bind/tmp/test1/ /root/test1/ #關聯目錄 [root@localhost ~]# ls /root/test1/ -l 查看目標目錄 total 52 -rw-r--r-- 1 root root 0 Aug 22 15:28 End -rw-r--r-- 1 root root 0 Aug 22 14:25 error.out -rw-r--r-- 1 root root 80 Aug 22 14:20 error.txt -rw-r--r-- 1 root root 52 Aug 22 14:32 file.out -rw-r--r-- 1 root root 46 Aug 22 14:45 hello.txt -rw-r--r-- 1 root root 20 Aug 22 14:11 result.txt -rwxr-xr-x 1 root root 162 Aug 22 17:37 spaceline.sh -rwxr-xr-x 1 root root 30 Aug 22 15:41 test.sh [root@localhost ~]# umount /root/test1/ #取消關聯 [root@localhost ~]# ls -l /root/test1/ #再次查看目標目錄 total 0
-o 參數選項 [多個使用,隔開例:-o sync,exec,nouser] -o 裏面還有參數
async:異步模式,使用異步模式數據的修改先於內存中完成,根據某種策略定期同步至磁盤,實現永久存儲。
sync:同步模式,直接將數據的修改同步至磁盤
auto:支持mount -a 這個選項實現自動掛載
noauto:不支持mount -a 不能實現自動掛載
noexec:不允許此設備上的二進制程序執行(一般設爲不允許) exec:允許此設備上的二進制程序執行
user:允許普通用戶掛載設備
nouser:不允許普通用戶掛載設備
unmount:卸載命令
umount [設備|掛載點] 可以是設備名|卷標名|UUID
fuser:查看有哪些進程正在使用掛載點
fuser -v 掛載點
[root@localhost ~]# mount /dev/cdrom /media mount: block device /dev/sr0 is write-protected, mounting read-only [root@localhost ~]# cd /media/ [root@localhost media]# ls autorun.inf debian firmware g2ldr.mbr isolinux md5sum.txt setup.exe win32-loader.ini boot dists g2ldr install live pool tools [root@localhost media]# umount /dev/cdrom umount: /media: device is busy. 因爲user當前正在目標目錄下工作,故無法卸載; (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1)) |
fuser -km 強行終止正在使用的掛載點的進程(直接殺掉進程)
[root@localhost ~]# umount /media umount: /media: device is busy. (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1)) [root@localhost ~]# fuser -v /media #查看哪些進程佔用/media USER PID ACCESS COMMAND /media: root 11777 ..c.. bash [root@localhost ~]# fuser -km /media/ #強制結束使用掛載點的進程,現象是直接關閉用戶所連接的虛擬終端 /media/: 11777c [root@localhost ~]# umount /media/ [root@localhost ~]# cat /proc/mounts | grepmedia 卸載成功 [root@localhost ~]#
與掛載相關的配置文件:
/etc/fstab: 主要用於系統啓動時掛載設備;
/etc/mtab:存儲了已經掛載的條目;
/proc/mounts:內核中識別的所有掛載條目;
/etc/fstab開機自動掛載的配置文件:
9/dev/mapper/vg0-root / ext4 defaults 1 1 10UUID=f3d57e47-8685-4e88-b809-f2a4726dc491 /boot ext4 defaults 1 2 11/dev/mapper/vg0-usr /usr ext4 defaults 1 2 12/dev/mapper/vg0-var /var ext4 defaults 1 2 13/dev/mapper/vg0-swap swap swap defaults 0 0 14tmpfs /dev/shm tmpfs defaults 0 0 15devpts /dev/pts devpts gid=5,mode=620 0 0 16sysfs /sys sysfs defaults 0 0 17proc /proc proc defaults 0 0
/etc/fstab配置文件內容解析:
第一列:要掛載的設備名(設備文件、卷標、UUID這三種引用方式);
第二列:掛載點
第三列:文件系統類型;
第四列:掛載選項;
第五列:轉儲頻率
0:從不備份;
1:每日備份;
2:每隔一日備份;
第六列:自檢次序;
0:不自檢;
1:首先自檢,通常直被/使用;
2:/自檢之後自檢;
Note:這裏面的default選項,既然是掛載選項,直接查看掛載命令mount的幫助
[root@localhost ~]# whatis mount [root@localhost ~]# man 8 mount defaults Use default options: rw, suid, dev, exec, auto, nouser, async, and relatime.
1、文件的硬鏈接:指向同一個inode的多個不同的文件路徑 他們指向同一組磁盤塊
2、文件的字符鏈接(軟連接):符號鏈接有自己的inode,但是此inode沒有指向數據塊,而是指向數據
原文件的訪問路徑(即一些字符串)
硬鏈接的特性:
Ⅰ硬連接不能跨文件系統
Ⅱ不能對目錄進行硬鏈接
Ⅲ創建硬鏈接會增加文件的硬連接數。
軟連接的特性:
Ⅰ符號連接可以跨文件系統
Ⅱ可以對目錄進行軟連接
Ⅲ不會增加硬連接數,
Ⅳ刪除原文件,會損壞符號連接文件。
3、ln創建連接文件的命令
ln [選項] 原文件目標文件 (默認創建硬連接文件)
-s 指明創建軟鏈接文件;
-v 顯示詳細信息;
du:查看某目錄樹佔用空間的情況;
du [選項] 目錄
-s 指列出目錄的總和,不列出子目錄的大小
-h 單位換算:轉換成人能識別的單位
[root@localhost home]# du -h kalaguiyin/ #查看目錄下各個文件佔用空間的情況; 4.0Kkalaguiyin/test/tmp/b/shell 4.0Kkalaguiyin/.gnome2 212K kalaguiyin/network-scripts/network-scripts 216K kalaguiyin/network-scripts 664K kalaguiyin/ [root@localhost home]# du -sh kalaguiyin/ #僅查看目錄佔用空間的總和; 664K kalaguiyin/ df [] [] -h -i inode
[root@localhost home]# df -h /dev/sda1 Filesystem Size Used Avail Use% Mounted on /dev/sda1 190M 33M 148M 18% /boot [root@localhost home]# df -ih /dev/sda1 Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda1 50K 39 50K 1% /boot
e2fsck [選項] 文件系統(分區)
-y 所有問題自動默認爲yes;