Linux磁盤及文件系統
一、硬盤
硬盤接口
PATA(Paralled Advanced Technology Attachment,并行的先進技術規范),也叫IDE(Integrated Drive Eelectronics,集成電路驅動設備),是作為一種簡單而廉價的接口而開發的。速度中等,容量大而且非常便宜。
串行ATA接口SATA(Serial ATA)是傳統IDE的后續技術。除了支持更快的傳輸速率外,SATA通過清楚的連線和更長的最大電纜長度讓連接更簡單。SATA身支持熱插拔和命令隊列功能,讓IDE在服務器領域成為SCSI的一種替代選擇。
SCSI(Small Computer System Interface,小型計算機系統接口)支持在一條總線上安裝多個硬盤,并且支持不同的速率和多種通信類型。
SAS(Serial Attached SCSI)串行連接SCSI是新一代的SCSI技術,兼容SATA。
光線通道(Fiber Channel)是在企業環境中得到廣泛應用的串行接口,因為它的帶寬高,一次能夠連接大量的設備。
USB(Universal Serial Bus,通用串行總線)。在個人電腦上使用得非常普遍。
目前主流服務器接口為SATA和SAS。
硬盤原理與結構
典型的硬盤由鍍上磁性薄膜的旋轉盤片組成。數據是通過改變盤片表面的磁性微粒方向的一個小磁頭來進行讀取和寫入的。
盤片圍繞中心的主軸以恒定的速度高速旋轉。將磁頭移動到正確的位置讀取特定的一段數據,稱為尋道。當硬盤在磁頭下面旋轉時磁頭所能達到的每個位置稱為磁道。磁道還可以進一步劃分為扇區,通常情況下它有512字節長。
在不同的盤片上距離旋轉軸相同距離的一系列磁道稱為一個柱面。如果所有的磁頭都一起移動,那么不需要任何額外移動,就能讀取存儲在一個單獨的柱面上的數據。盡管磁頭的移動相當快,但相對硬盤旋轉要慢的多。因此,不需要磁頭尋找新的位置的硬盤訪問都會更快一些。
磁盤存儲術語
Head 磁頭
Track 磁道
Cylinder 柱面
Sector 扇區,512Bytes
二、磁盤文件系統
在計算機上添加一塊新的硬盤后,首先得進行分區(必要時先格式化),然后在分區上建立文件系統,再將此文件系統掛在某目錄下才可用。
分區
硬盤分區能夠把硬盤劃分成一組獨立的數據區域,而不是只有一個巨大的數據塊,硬盤分區中還有引導塊和分區表這樣的結構。
分區的作用:
備份更容易;
優化I/O性能,提高修復速度;
實現磁盤空間配額限制;
隔離系統和程序;
安裝多個OS;
采用不同的文件系統。
現在的系統傾向于使用更少的分區,但在大多數系統里至少有下面兩種分區。
根分區:讓系統所需要的所有東西都保存在這里。
交換分區:當沒有足夠的物理內存來保存信息時,交換分區就能存儲虛擬內存中的內容。每個系統都應該至少有一個交換分區。
兩種分區方式:MBR&GPT
1、MBR: Master Boot Record
特點:
使用32位表示扇區數,分區大小不超過2T。
0磁道0扇區為主引導記錄:512bytes
446bytes: boot loader
64bytes:分區表
每16bytes: 標識一個分區
2bytes: 55AA,MBR區域的有效性,一般55AA為有效,否則無效。
按柱面進行分區??山?個主分區,3主分區+1擴展分區(內可建N個邏輯分區) 。
MBR 硬盤分區結構圖
2、GPT:GUID(Globals Unique Identifiers)
特點:
Partition table支持128個分區,使用64位,支持8Z(512Byte/block)64Z(4096Byte/block);
使用128位UUID 表示磁盤和分區 ,GPT分區表自動備份在頭和尾兩份,并有CRC校驗位;
UEFI (統一擴展固件接口)硬件支持GPT,使操作系統啟動。
GPT分區結構
分區管理命令
1、分區管理工具–fdisk
常用用法:
1)fdisk device 編輯磁盤分區;
2)fdisk -l [-u] [device…]查看磁盤分區信息;
Options -l:列出指定設備的分區表信息,若未指定,則列出/proc/partions里的;
-u:按扇區而非柱面顯示分區信息。
3)fdisk -s partition… 顯示分區的大?。ò磯Kblocks顯示)
fdisk命令提供了一個交換式的接口來管理分區,用#fdisk device命令進入編輯后,它有許多子命令,用于不同的管理功能,所有的操作均在內存中完成,沒有直接同步到磁盤,直到使用w命令保存。
常用子命令:
p:顯示分區列表 t:更改分區類型
n:創建新分區 d:刪除分區
w:保存并退出 q:不保存并退出
m:查看幫助信息 l:查看所有分區類型
2、重讀分區表–partx;kpartx;partprobe
在已劃分過分區別且已經掛載其中某個分區的磁盤上創建新的分區時不會立即讀至內核生效,需要用命令重讀分區表。用法:
1)partx
添加分區:partx -a device
刪除分區:partx -d –nr N-M device(–nr:指定分區范圍eg. –nr2-4)
2)partprobe (centos6 不適用)
3)Kpartx [-a|-d] device (效果不穩定一般用partx)
3、其他分區管理工具–gdisk;blkid;parted
gdisk 管理GPT設備的工具,用法基本同fidsk;
blkid 顯示塊設備屬性;
parted非交互式分區管理命令
用法:parted [選項]… [設備[命令[參數]…]…];
eg.: parted /dev/sdb mklabel gpt|msdos:創建gpt或msdoc分區磁盤;
parted /dev/sdb print:顯示分區表;
Parted /dev/sdb mkpart primary 1 200 (默認M):創建分區;
parted /dev/sdb rm1 :刪除分區;
parted的操作都是實時生效的,需小心使用。
4、查看塊設備:
lsblk 列出塊設備;
cat /proc/partitons;
ls /dev/sd*
文件系統
即便一個硬盤已經在概念上被分成了若干個分區,它仍舊沒有為保存文件做好準備,在硬盤使用做好準備前,須創建文件系統,文件系統需要添加一點自己的開銷。
分區與文件系統結構
磁盤文件系統類型
Linux文件系統:ext2(Extended file system), ext3,ext4, xfs(SGI), btrfs(Oracle) , reiserfs, jfs(AIX), swap;
Windows:fat32, ntfs;
Unix: FFS(fast), UFS(unix), JFS2;
網絡文件系統:NFS, CIFS;
集群文件系統:GFS2, OCFS2(oracle);
分布式文件系統:ceph, moosefs, mogilefs, glusterfs,Lustre;
光盤:iso9660;
RAW:未經處理或者未經格式化產生的文件系統。
ext文件系統目前一直是Linux文件系統的主流,雖然最新的centos7版本已經采用了xfs文件系統。ext3后開始加入了日志功能,大大增加了可靠性。此文件系統在硬盤上專門開辟了一個區域來保存日志文件。在發生系統操作時,所要求的修改首先寫入日志文件。之后,才對正式的文件系統做修改。如果發生了崩潰,可以用日志記錄重構出完全相同的文件系統。
文件系統管理命令
1、創建文件系統–mkfs;mke2fs
mkfs常用方法
mkfs [-t fstype] [fs-options] device
常用fstype選項:ext2;ext3;ext4;xfs;btrfs;vfat;msdos。默認ext2
mkfs實際是是各種文件系統創建命令的前端。如mkfs.ext3;mkfs.ext4…
mke2fs -j = mke2fs -t ext3 = mkfs -t ext3 = mkfs.ext3
mke2fs命令是ext系列文件系統的專用文件系統創建工具。目前最常用為ext文件系統,其命令選項也基本與mkfs相同。因此我們詳細介紹下mke2fs命令。常用用法:
mke2fs [-t fstype] [fs-options] device
options: -t {ext2,ext3,ext4} :指明要創建的文件系統類型;
-b {1024|2048|4096} : 指明文件系統的塊大小,不超過4096;
-L LABEL :指明卷標;
-j : journal,創建有日志功能的文件系統ext3;
-i #: bytes-per-inode,指明inode與字節的比率,即每多少字節創建一個inode;
-I #:設定每個inode的大小(128-4096bytes)
-N # : 直接指明要給此文件系統創建的Inode數量;
-O [^] FEATURES:設置某種屬性,掛載時這些屬性將會繼承,加^表示關閉;
eg. mke2fs -O ^has_journal /dev/sda3 #關閉日志功能;
-o [^]MOUNT_OPTIONS:開啟或關閉某種默認掛載選項。
-m # : 指定預留的空間百分比;不需要加百分號
其他相關命令工具–e2label;blkid;findfs
e2label
e2label device 查看設備卷標;
e2label device LABEL 設定卷標;
blkid
-U UUID: 根據指定的UUID來查找對應的設備
-L LABEL:根據指定的LABEL來查找對應的設備
findfs:查找分區
findfs LABEL=<label>
findfs UUID=<uuid>
文件系統屬性修改與查看–tune2fs;dumpe2fs
tune2fs –重新設定ext系列文件系統可調整參數的值。
-l:查看指定文件系統超級塊信息;super block;
-L 'LABEL':修改卷標;
-m #:修預留給管理員的空間百分比;
-j: 將ext2升級為ext3;
-O: 文件系統屬性啟用或禁用,–O ^has_journal;
-o: 調整文件系統的默認掛載選項,–o ^acl;
-U UUID: 修改UUID號;
dumpe2fs–查看ext系列文件系統所有文件系統信息,包括各分組。
-h:只查看超級塊信息,不顯示分組信息
文件系統檢查與修復–fsck;e2fsck
命令–fsck;e2fsck;
fsck [-t fstype] [device]
options: -a 無須交互而自動修復所有錯誤;
-r 交互式修復;
e2fsck —ext系列文件系統修復,常用用法:
e2fsck [options] [device]
option:-t fstype 指明文件系統類型;
-y 非交互,所有問題自動回答為yes;
-r 交互式修復;
-f:強制修復,即使文件系統狀態為clean。
注:不要在掛載情況下修復。
掛載(安裝文件系統)
根之外的文件系統需要被訪問,就需先關聯至文件系統下的某目錄來實現,此關聯過程即為掛載。此目錄即為掛載點Mount_point。
Mount_point當為文件的訪問入口時,需注意如下特性:
目錄需要事先存在的;
應該使用未被或不會被其它進程所使用的目錄;
掛載的目錄當有人訪問時,目錄不能被卸載;
/etc/mtab記錄了所有的mount設備。
掛載文件系統命令工具–mount
mount [-fnrsvw] [-t vfstype] [-o options] device dir
options:
-t vsftype:指定要掛載的設備上的文件系統類型
-r: readonly,只讀掛載;
-w: read and write, 讀寫掛載;
-n: 不更新/etc/mtab掛載;
-a:自動掛載(定義在了/etc/fstab文件中,且掛載選項中有auto功能的設備);
-L LABEL: 以卷標指定掛載設備;
-U UUID: 以UUID指定要掛載的設備;
-B, –bind: 綁定目錄到另一個目錄上;
-o options:指定掛載的文件系統的屬性,多個選項使用逗號分隔;
async:異步模式,I/O讀寫異步執行;
sync:同步模式,內存更改時,同時寫磁盤;
atime/noatime:文件或目錄被訪問時是否更形其時間戳;
diratime/nodiratime:文件或目錄被訪問時是否更形其時間戳;
auto/noauto:是否支持自動掛載;
exec/noexec:是否支持在文件系統上運行應用程序;
dev/nodev:是否支持在此文件系統上的設備文件可以使用;
suid/nosuid:是否支持suid和sgid權限;
remount:重新掛載;
ro:只讀;
rw:讀寫;
user/nouser:是否允許普通用戶掛載此設備,默認管理員才能掛載;
acl:啟用此文件系統上的acl功能;
owner:是否應許普通用戶掛載此設備如果其實設備的所有者(默認加帶nodev和nosuid選項除非有其他指明);
defaults:默認掛載選項,相當于rw, nosuid, dev, exec, auto, nouser, async。
為了讓系統在引導的時候自動掛載文件系統,在/etc/fstab文件中為每一個文件系統添加了一行配置。每行列出了設備名、掛載點、文件系統類型、安裝選項、備份頻率及自檢次序。如圖
查看掛載情況
1)mount;
2)cat /etc/mtab;
3)cat /proc/mounts(詳細)
其他設備安裝與掛載
swap設備
創建swap文件系統
mkswap [options] device
options:-L LABEL:指定設備卷標
啟用:swapon
swapon [OPTION]… [DEVICE]
-a:激活所有的交換分區;
-p PRIORITY:指定優先級;
默認優先級從負1開始,每增加一個優先級減1.
禁用swap設備
swapoff [OPTION]… [DEVICE]
查看swap設備
swapon -s
cat /proc/swaps
自動掛載所有swap文件系統
swapon -a (掛載/etc/fstab中所有的swap文件系統)
U盤文件系統
U盤設備會被自動識別成scsi類似的設備名如/dev/sdd
掛載 mount -r /dev/sdd dir
退出U盤時建議先使用sync命令同步。
光盤文件系統
在圖形環境下自動啟動掛載/run/media/<user>/<label>
否則就必須被手工掛載 mount /dev/cdrom dir
eject命令卸載或彈出磁盤;
創建ISO文件;
eg. cp /dev/cdrom /root/centos7.iso
mkisofs -r -o /root/etc.iso /etc
刻錄光盤;
wodim –v –eject centos.iso
卸載文件系統
命令umount
umount [-dflnrv] {dir|device}…
umount -a 取消掛載/etc/mtab中所有已掛載的設備
注:正在被進程訪問的設備不能被卸載;
查看設備正被些進程使用
lsof MOUNT_POINT
fuser -v MOUNT_POINT
強制終止所有正在訪問某掛載點的進程
fuser -km MOUNT_POINT
兩種特殊的掛載
1、目錄掛載
又稱目錄綁定,將某目錄掛載到另一個目錄上,其內容在兩個地方皆可見;
mount –bind srv_dir dest_dir
2、文件掛載–掛載本地回環設備
1)格式化某文件為文件系統;eg. mkfs.ext4 /PATH/TO/SOME_LOOP_FILE
2)mount -o loop /PATH/TO/SOME_LOOP_FILE MOUNT_POINT(centos7可無選項);
此時用blkid命令看不到此文件系統,需用blkid FILENAME 查看;
Centos6的/dev中有7個loop設備,分別為/dev/loop0、/dev/loop2…/dev/loop7;當創建一個回環文件時則會與某個loop設備自動關聯,一般從0開始,此時可直接用此loop設備名掛載;也可以自己手動指定和管理loop設備,使用losetup命令。
losetup /dev/loop2 LOOP_FILE 指定LOOP_FILE與/dev/loop2關聯;
losetup -d /dev/loop2 刪除此loop設備,需先取消掛載;
losetup -a 查看所有已關聯loop設備情況;
losetup -f 查看第一個尚未被關聯的loop設備。
其他相關常用工具–free;df;du;dd
內存空間使用狀態
free [OPTION]
-m: 以MB為單位
-g: 以GB為單位
文件系統空間占用等信息的查看
df [OPTION]… [FILE]…
-H : 以1000為單位
-T : 顯示文件系統類型
-h: human-readable
-i:inodes instead of blocks,顯示inode節點使用狀況;
-P: 以Posix兼容的格式輸出
查看某目錄總體空間占用狀態:
du [OPTION]… DIR (默認只遞歸顯示目錄的大?。?/span>
-h: human-readable;
-s: summary只顯示目錄總的大小而不顯示子目錄;
-a:遞歸顯示所有文件和目錄而不只是目錄的大?。?/span>
dd命令:convert and copy a file
常用用法:dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=# count=#
bs=#:block size, 復制單元大?。?/span>
count=#:復制多少個bs;
of=file:寫到所命名的文件而不是到標準輸出;
if=file:從所命名文件讀取而不是從標準輸入;
bs=size:指定塊大?。仁鞘莍bs也是obs);
ibs=size:一次讀size個byte;
obs=size:一次寫size個byte;
cbs=size:一次轉化size個byte;
skip=blocks:從開頭忽略blocks個ibs大小的塊;
seek=blocks:從開頭忽略blocks個obs大小的塊;
count=n:只拷貝n個記錄;
conv=conversion[,conversion…] 用指定的參數轉換文件
轉換參數:
ascii 轉換EBCDIC 為ASCII;
ebcdic 轉換ASCII 為EBCDIC;
block 轉換一行數據為長度為cbs 的記錄,不足部分用空格填充;
unblock 替代cbs長度的每一行尾的空格為新行;
case 把大寫字符轉換為小寫字符;
ucase 把小寫字符轉換為大寫字符;
nocreat 不創建輸出文件;
noerror 出錯時不停止;
notrunc 不截短輸出文件;
sync 把每個輸入塊填充到ibs個字節,不足部分用空(NULL)字符補齊;
備份MBR
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
破壞MBR中的bootloader:
dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446
eg.有一個大與2K的二進制文件fileA?,F在想從第64個字節位置開始讀取,需要讀取的大小是128Byts。又有fileB, 想把上面讀取到的128Bytes寫到第32個字節開始的位置,替換128Bytes,請問如何實現?
#dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc
備份
dd if=/dev/sdx of=/dev/sdy
將本地的/dev/sdx整盤備份到/dev/sdy
dd if=/dev/sdx of=/path/to/image
將/dev/sdx全盤數據備份到指定路徑的image文件
dd if=/dev/sdx | gzip >/path/to/image.gz
備份/dev/sdx全盤數據,并利用gzip工具進行壓縮,保存到指定路徑
恢復
dd if=/path/to/image of=/dev/sdx
將備份文件恢復到指定盤
gzip -dc /path/to/image.gz | dd of=/dev/sdx
將壓縮的備份文件恢復到指定盤
拷貝內存資料到硬盤
dd if=/dev/mem of=/root/mem.bin bs=1024
將內存里的數據拷貝到root目錄下的mem.bin文件
dd if=/dev/cdrom of=/root/cd.iso
拷貝光盤數據到root文件夾下,并保存為cd.iso文件
銷毀磁盤數據
dd if=/dev/urandom of=/dev/sda1
利用隨機的數據填充硬盤,在某些必要的場合可以用來銷毀數據。執行此操作以后,/dev/sda1將無法掛載,創建和拷貝操作無法執行。
得到最恰當的block size
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
通過比較dd指令輸出中所顯示的命令執行時間,即可確定系統最佳的block size大小.
測試硬盤讀寫速度
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
dd if=/root/1Gb.file bs=64k | dd of=/dev/null
通過上兩個命令輸出的執行時間,可以計算出測試硬盤的寫/讀速度.
修復硬盤
dd if=/dev/sda of=/dev/sda
當硬盤較長時間(比如1,2年)放置不使用后,磁盤上會產生消磁點。當磁頭讀到這些區域時會遇到困難,并可能導致I/O錯誤。當這種情況影響到硬盤的第一個扇區時,可能導致硬盤報廢。上邊的命令有可能使這些數據起死回生,且這個過程是安全高效的。
原創文章,作者:beyond,如若轉載,請注明出處:http://www.www58058.com/47098