Linux 磁盤、文件系統管理
2016-08-229
本章內容
磁盤結構
分區類型
管理分區
管理文件系統
掛載設備
管理虛擬內存
第一篇:Linux磁盤管理
概述:
計算機的五大組成部件:輸入設備、輸出設備、存儲器、運算器、控制器,其中,輸入、輸出設備稱之為I/O設備,運算器和控制器稱之為CPU ,存儲器如內存、硬盤等。計算機只有CPU和內存其實就可以獨立完成計算任務了,只是其輸入輸出都在內存中實現,但是,內存屬于隨機存儲單元,斷點就會導致數據丟失,因此,我們就通過其他輔助設備來彌補內存的不足,這些輔助設備稱之為外存,如:磁盤,光驅等。
一、硬盤
1.硬盤接口類型:
2.硬盤:固態硬盤和機械硬盤
3.硬盤存儲術語(CHS):
head:磁頭 256個
track:磁道 1024個磁道
平均尋道時間:5400rpm,7200rpm,10000rpm,15000rpm
cylinder: 柱面 (分區劃分基于柱面)
secotr: 扇區,512bytes 63個
cylinder=512*63track*256head=8M
二、設備文件
1.一切皆文件:
open(), read(), write(), close()
2.設備類型:
塊設備(block):隨機訪問,數據交換單位是“塊”;
字符設備(character):線性訪問,數據交換單位是“字符”;
3.設備文件:FHS /dev
關聯至一個設備驅動程序,進而能夠跟與之對應硬件設備進行通信
4.設備號:
major:主設備號,區分設備類型;用于標明設備所需要的驅動程序;
minor:次設備號,區分同種類型下的不同設備;是特定設備的訪問入口;
make block or character speclal files
語法:mknod [OPTION]… NAME TYPE [MAJOR MINOR]
-m MODE :創建后的設備文件的訪問權限;
三、設備文件名:ICANN
1.磁盤:
IDE:/dev/hd[a-z] 例如:/dev/hda,/dev/hdb
SCSI,SATA,USB,SAS:
不同設備:/dev/sd[a-z]
2.分區:
同一設備上的不同分區:1,2…
/dev/sda#: 如:/dev/sda1…
CentOS 6和7統統將硬盤設備文件表示為/dev/sd[a-z]
3.引用設備的方式:
設備文件名、卷標(label)、
UUID(全局唯一標識符,uuidgen 命令可以生成uuid)
注意:引用設備的時候,最好用UUID,因為設備文件名可能會改變。
四、磁盤分區:MBR、GPT
MBR: 0 sector
1.Master Boot Recor,1982年,使用32位表示扇區數,分區不超過2T
2.如何分區:按柱面
3.0磁道0扇區:512bytes,分為三部分:
446bytes: bootloader,程序,引用啟動操作系統程序;
64bytes:分區表,每16bytes: 標識一個分區,一共只能有4個分區;
2bytes: MBR區域的有效標識,一般55AA為有效;
4. 4個主分區;3主分區+1擴展(N個邏輯分區);
主分區和擴展分區的標識:1-4
邏輯分區只能從5開始(5+)
5.新增添磁盤,還不能直接顯示出來,要想出現要對磁盤進行掃描(實際生產環境中不需要,都是熱插拔技術):
命令:echo "—" > /sys/class/scsi_host/host2/scan
GPT分區:
GUID(Globals Unique Identifiers)partition table
支持128個分區,使用64位,支持8Z(512Byte/block )64Z (4096Byte/block)
使用128位UUID 表示磁盤和分區GPT分區表自動備份在頭和尾兩份,并有CRC校驗位
UEFI (統一擴展固件接口)硬件支持GPT,使操作系統啟動
五、管理磁盤:
1.列出塊設備:lsblk
2.創建分區使用:
fdisk創建MBR分區,也支持GPT,對于一塊硬盤,最多只能管理15分區
gdisk創建GPT分區
GNU parted高級分區操作(創建、復制、調整大小等等)
3.partprobe-重新設置內存中的內核分區表版本
磁盤分區管理工具:fidsk、parted
parted命令:
用法:parted [選項]… [設備[命令[參數]…]…]
parted /dev/sdb mklabel gpt|msdos
parted /dev/sdb print 查看分區
parted /dev/sdb mkpart primary 1 200 (默認M)創建分區
parted /dev/sdb rm1 刪除分區
parted -l
注意:parted的操作都是實時生效的,一般不建議使用
fdisk命令
1.語法:fdisk -l [-u] [device…];
列出指定磁盤設備上的分區情況
2.管理分區
fdisk device
fdisk提供了一個交互式接口來管理分區,他有許多命令,分別用于不同的管理功能;所有的操作均在內存中完成,沒有直接同步到磁盤;直接使用w命令保存至磁盤上;
3.常用命令:
n:創建新分區;
d:刪除已有分區;(如果刪除擴展分區sda4 邏輯分區都會消失)
t:修改分區類型;
l:查看所有分區ID
w:保存并退出;
q:不保存并退出;
m:查看幫助信息
p:顯示現有分區表
注意:在已經分區并且已經掛載其中某個分區的磁盤設備上創建的新分區,內核可能在創建完成后無法直接識別;
同步分區表:partx,partprobe
1)查看內核是否已經識別新的分區:
# cat /proc/partations
2)通知內核重新讀取硬盤分區表
新增分區用:
partx -a /dev/device
kpartx -a /dev/device -f: force
刪除分區用:
partx -d –nr N /dev/DEVICE
centos6:–nr N-M(表示范圍)
partprobe命令:centos5,7使用。一條命令搞定,增減刪除都可以!
用法:partprobe [/dev/DEVICE]
六、創建文件系統(格式化)
相關概念:
文件系統是操作系統用于明確存儲設備或分區上的文件的方法和數據結構;即在存儲設備上組織文件的方法。操作系統中負責管理和存儲文件信息的軟件結構稱為文件管理系統,簡稱文件系統。
從系統角度來看,文件系統是對文件存儲設備的空間進行組織和分配,負責文件存儲并對存入的文件進行保護和檢索的系統。具體地說,它負責為用戶建立文件,存入、讀出、修改、轉儲文件,控制文件的存取,安全控制,日志,壓縮,加密等。
1.格式化:
低級格式化(分區之前進行,劃分磁道)
高級格式化(分區之后進行,創建文件系統)
2.磁盤分區劃分為元數據區和數據區
元數據區:
文件元數據(inode):
包含文件的大小、權限、屬主屬組、時間戳、數據塊指針
符號鏈接文件(軟鏈接):
存儲數據指針的空間當中存儲的是真實文件的訪問路徑;
設備文件:
存儲數據指針的空間當中存儲的是設備號(major,minor)
3.文件系統組織結構中的常見術語:
block groups(塊組),塊組內分為元數據區(inode table中又存放indoe)和數據區(block)
bitmap index :位圖索引 (了解哪些inode已經使用,哪些還沒使用)
block bitmap:了解哪些磁盤塊已經使用,哪些還沒有使用;
superblock:記錄當前整個分區上有哪些塊組,以及塊組的劃分
Linux 的文件系統
1.VFS:虛擬文件系統接口,當兩個層次之間不銜接時,所加的中間層。因此linux可以引入眾多的文件系統類型。
2.文件系統:
linux:
ext2(Extended file system), ext3, ext4, xfs(SGI), btrfs(Oracle),reiserfs, jfs(AIX), swap(用于存放虛擬內存)
光盤:iso9660
Windows:fat32, ntfs
Unix: FFS(fast), UFS(unix), JFS2
網絡文件系統:NFS, CIFS
集群文件系統:GFS2, OCFS2(oracle)
分布式文件系統:ceph, moosefs, mogilefs, glusterfs, Lustre
RAW:未經處理或者未經格式化產生的文件系統
3.根據其是否支持"journal"功能:
日志型文件系統: ext3, ext4, xfs, …
非日志型文件系統: ext2, vfat
4.文件系統的組成部分:
內核中文件系統的驅動模塊(lsmod命令可查看):ext4, xfs, vfat
用戶空間的管理工具:mkfs.ext4, mkfs.xfs,mkfs.vfat
5.查前支持的文件系統:cat /proc/filesystems
內核及文件系統的組成部分:
文件系統驅動:由內核提供
文件系統管理工具:由用戶空間的應用程序提供
七、文件系統管理工具:
mkfs,mk2fs,e2label,tune2fs,dumpe2fs,
主要都是和ext系列的文件系統有關。
注意:擴展分區是不能格式化的,因為它存放的是邏輯分區,可對邏輯分區格式化
1.創建文件系統的工具
mkfs命令:(按兩次Tab鍵)
(1) # mkfs.FS_TYPE /dev/device
ext4,xfs,btrfs,vfat
示例:
創建ext2文件類型
在ext2基礎上創建ext3文件類型(區別:多了一個創建日志的功能)
(2) # mkfs -t FS_TYPE /dev/DEVICE 如:(mkfs -t ext2=mkfs.ext2)
-L 'LABEL': 設定卷標
mke2fs的選項,mkfs也支持
mke2fs:ext系列文件系統專用管理工具
語法:mke2fs [OPTIONS] /dev/sd… 默認為ext2文件系統
-t {ext2|ext3|ext4}:指明要創建的文件系統類型;
-b {1024|2048|4096}:指明塊大小,默認為4K,最大不超過4K
-L 'LABEL' :指明卷標
-j: 創建有日志功能的文件系統ext3
mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3
-i#: 指明indoe與字節的比率;即每多少個字節創建一個inode;此大小不應該小于block的大小
-N #:直接指明要給此文件系統創建的inode的數量;
-I 一個inode記錄大小128—4096
-m #: 默認5%,為管理人員指定預留空間占總空間的百分比
-O FEATURE[,…]:啟用指定特性
-O ^FEATURE:關閉指定特性
e2label命令:卷標的查看,預設定
查看:e2label device
tune2fs:查看或修改ext系列文件系統的某些屬性;
adjust tunable filesystem parameters on ext2/ext3/ext4 filesystems;注意:塊大小不可修改
語法:tune2fs [options] devicd
-l:查看指定文件系統超級塊信息;super block
-L 'LABEL':修改卷標
-m #:調整預留給管理員的空間百分比
-j: 將ext2升級為ext3
-O[^]FEATHER: 文件系統屬性啟用或禁用,–O ^has_journal
-o: 開啟或關閉文件系統的默認掛載選項,–o ^acl
-U UUID: 修改UUID號
dumpe2fs命令
顯示ext系列文件系統的屬性信息
語法:dumpe2fs [-h] device
-h:查看超級塊信息(分組信息),分區用分組管理
用于實現文件系統檢測的工具:fsck,e2fsck
因進程意外中止或系統崩潰等原因導致操作非正常終止時,可能會造成文件損壞;此時應該檢測并修復文件系統,建議離線進行
常發生于死機或者非正常關機之后
掛載為文件系統標記為“dirty”
fsck命令
fsck – check and repair a Linux file system
fsck.FS_TYPE
fsck -t FS_TYPE 如:fsck -t ext4=fsck.ext4
-a: 自動修復錯誤
-r: 交互式修復錯誤
注意: FS_TYPE一定要與分區上已經文件類型相同;
e2fsck:ext系列文件專用的檢測修復工具
語法:e2fsck [OPTIONS] device
-y:對所有問題自動回答為yes;
-f:即使文件系統處于clean狀態,也要強制進行檢測;
blkid:塊設備屬性信息查看
語法:blkid[OPTION]…[DEVICE]
-U UUID: 根據指定的UUID來查找對應的設備
-L LABEL:根據指定的LABEL來查找對應的設備
findfs:查找分區
findfs[options] LABEL=<label>
findfs[options] UUID=<uuid>
八、其他文件系統
1.swap文件系統:
Linux上的交換分區必須使用獨立的文件系統;且文件系統的System ID必須為82;
創建swap設備:mkswap命令
語法:mkswap [OPTIONS] device
-L LIBEL:指明卷標
-f:強制
2.Windows無法識別Linux的文件系統;因此存儲設備需要在兩種系統之間交叉使用時,應該使用windows和linx同時支持的文件系統:fat32(vfat)
# mkfs.vafat device
第二篇:文件系統的使用:掛載
磁盤的分區和格式化完成后,磁盤要想能夠使用,就需要掛載,在掛載某個分區前需要先建立一個掛載點。
一、相關概念
1.首先要"掛載":mount和unmount卸載命令
2.根文件系統之外的其他文件系統要想能夠被訪問,都必須通過“關聯”至根文件系統上的某個目錄來實現,此關聯操作即為“掛載”,此目錄即為掛載點;
3.掛載點:mount_point,作為另一個文件系統的訪問入口
1)事先存在;
2)應該使用未被或不會被其他進程使用到的目錄;
3)掛載點下原有文件將會被臨時隱藏;
4.卸載:為解除此關聯關系的過程
卸載時:可使用設備,也可以使用掛載點
二、mount命令
掛載方法:mount DEVICE MOUNT_POINT
mount:通過查看/etc/mtab文件顯示當前已掛載的所有設備
語法:mount [-fnrsvw] [-t vfstype] [-o options] device dir
device:指明要掛載的設備;
(1) 設備文件:例如/dev/sda5
(2) 卷標:-L 'LABEL', 例如-L 'MYDATA'
(3) UUID, -U 'UUID':例如-U '0c50523c-43f1-45e7-85c0-a126711d406e'
(4) 偽文件系統名稱:proc, sysfs, devtmpfs, configfs
dir:掛載點
事先存在;建議使用空目錄
進程正在使用中的設備無法被卸載
mount命令用法
語法:mount [-nrw] [-t vfstype] [-o options] device dir
命令選項:
-r: readonly,只讀掛載
-w: read and write, 讀寫掛載
-n: 在默認情況下,設備掛載或卸載的操作同時會更新至/etc/mtab文件中,-n 用于禁此特性;
-t vsftype:指定要掛載的設備上的文件系統類型;多數情況下可省略,此時mount會通過blkid來判斷要掛載的設備的文件系統的類型;
-a:自動掛載所有支持自動掛載的設備(定義在了/etc/fstab文件中,且掛載選項中有auto功能)
-L 'LABEL': 掛載時以卷標的方式指明掛載設備
mount -L LABEL dir
-U 'UUID': 掛載時以UUID指定要掛載的設備
mount -U UUID dir
-B, –bind: 將目錄綁定至另一個目錄上,作為其臨時訪問入口
-o options:(掛載文件系統的選項),多個選項使用逗號分隔
async:異步模式
sync:同步模式,內存更改時,同時寫磁盤
atime/noatime:文件或目錄在被訪問時是否更新其訪問時間戳;
diratime/nodiratime:目錄在被訪問是是否更新其訪問時間戳
auto/noauto:是否支持自動掛載,是否支持-a選項
exec/noexec:是否允許運行此設備上的程序文件;
dev/nodev:此設備上是否允許創建設備文件;
suid/nosuid:是否允許程序文件上的suid和sgid特殊權限生效;
remount:重新掛載
ro:只讀
rw:讀寫
user/nouser:是否允許普通用戶掛載此設備,默認管理員才能掛載
acl:啟用此文件系統上的acl功能
# mount -o acl device dir
# tune2fs -o acl device
defaults:相當于rw, suid, dev, exec, auto, nouser, async
查看當前系統已掛載的所有設備:
# mount
# cat /etc/mtab
# cat /proc/mounts
掛載光盤:
mount -r /dev/cdrom mount_point
光盤設備文件:/dev/cdrom,/dev/dvd
把光盤制作成iso文件方法:
掛載U盤:
事先識別U盤的設備文件
掛載本地回環設備:
# mount -o loop /PATH/TO/SOME_LOOP_FILE MOUNT_POINT
unmount命令:
正在被進程訪問到的掛載點無法被卸載
查看掛載情況:
# findmnt MOUNT_POINT
查看被那個或者哪些進程所占用:
# lsof MOUNT_POINT
# fuser -v MOUNT_POINT
終止所有在正訪問指定的文件系統的進程:
# fuser -km MOUNT_POINT
卸載:
# umount DEVICE
# umount MOUNT_POINT
# umount -l
/etc/fstab 配置文件
設定除根文件系統以外的其他文件系統能夠開機時自動掛載
/etc/fstab每行定義一個要掛載的文件系統及相關屬性;
6個字段:
1)要掛載的設備
設備文件;
LABEL(LABEL="")
UUID(UUID="")
偽文件系統
2)掛載點
swap類型的設備的掛載點為swap;
3)文件系統類型
4)掛載選項
defaults:使用默認掛載選項
如果要同時指明多個掛載選項,彼此間逗號分隔;
5)轉儲頻率
0:從不備份
1:每天備份
2:每隔一天備份
6)自檢次序
0:不自檢;
1:首先自檢,通常只能是根文件系統可用;
2:次級自檢
…
mount -a:可自動掛載定義在此文件中的所支持自動掛載的設備;
示例:
在/etc/fstab配置文件中添加一行來掛載分區 使用命令 df或者mount可以查看掛載情況,要想生效執行 mount -a命令,自動掛載此文件中的所有支持自動掛載的設備
如果對掛載的參數修改,要重新生效使用 mount -o remount MOUNT_POINT
注意:/etc/fstab 設備名出錯,自檢非0,開機會導致無法啟動
排錯方法:mount -o remount,rw /
四、處理swap交換文件和分區:
swap,它類似于Windows的虛擬內存,分區時一般指定虛擬內存的大小為實際內存的2倍,如果你的實際內存超過了8G,那你劃分16G給虛擬內存就足夠日常交換了,如果真的遇到虛擬內存不夠用的情況,就必須增加哦一個虛擬磁盤,因此我們不可能重新給磁盤分區,增加虛擬內存的基本思路:建立swapfile–>格式化swap格式–>啟用虛擬磁盤。
交換分區是系統RAM的補充
1.基本設置包括:
1)創建交換分區(fdisk -t 82)或者文件
2)使用mkswap寫入特殊簽名
4)使用swapon -a 激活交換空間
2.掛載交換分區
啟用:swapon
swapon[OPTION]… [DEVICE]
-a:激活所有的交換分區;
-p PRIORITY:指定優先級
/etc/fstab:pri=value
禁用:swapoff[OPTION]… [DEVICE]
總結:
swap的創建
1)fdisk -t 82 分區
dd if=/dev/zero of=/swapfile bs=1M count=1024 文件
2)mkswap /dev/sdc1
mkswap /swapfile
3)vim /etc/fstab
/dev/sdc1 swap swap defaults,pri=100 0 0
/swapfile swap swap pri=100 0 0
4)swapon -s 查看swap分區
swapon -a 讀/etc/fstab 生效
示例:創建swap文件增加虛擬內存
心得:既然可以把一個文件當做一個swap分區用,同樣我們也可以創建一個文件當做分區使用,如果需要的話直接就可以把文件拷貝走,很方便。
swap的優先級
用戶可以給某個swap指定一個0到32767的優先級
如果用戶沒有指定,那么核心會自動給swap指定一個優先級,這個優先級從-1開始,每加入一個新的沒有用戶指定優先級的swap,會給這個優先級減一。
先添加的swap的缺省優先級比較高,除非用戶自己指定一個優先級,而用戶指定的優先級(是正數)永遠高于核心缺省指定的優先級(是負數)。
優化性能:分布存放,高性能磁盤存放
free命令:內存空間及交換分區使用狀態查看:
free [OPTION]
-m: 以MB為單位
-h:以人類適宜的方式查看
Mem:物理內存的使用情況;
Swap:交換分區的使用情況 ;
-/+ buffers/cache:表示物理內存在不考慮緩存和緩存占據空間時的使用情況
cache: 緩存,迎來緩存度
df命令:查看磁盤設備的使用情況
df [OPTION]… [FILE]…
-l:僅顯示本地文件的相關信息;
-H 以1000為單位
-T 文件系統類型
-h: human-readable
-i:顯示inode的使用狀態而非block
-P: 以Posix兼容的格式輸出
du命令:查看某目錄總體空間占用狀態:
du [OPTION]… DIR
-h: human-readable
-s: summary
losetup命令
可以把文件關聯到一個設備,從而用設備名代替文件名
centos6 實現loop 設備和文件關聯
dd if=/dev/zero of=/testdir/bigfile bs=1M count=500
losetup /dev/loop7 /testdir/bigfile
mkfs.ext4 /testdir/bigfile
mount /dev/loop7 /mnt/bigfile/
losetup -a
示例:
創建一個文件,對文件進行格式化掛載到另一個目錄下
下面是CentOS7版本的
dd命令:convert and copy a file
用法:
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST
bs=#:block size, 復制單元大小
count=#:復制多少個bs
of=file 寫到所命名的文件而不是到標準輸出
if=file 從所命名文件讀取而不是從標準輸入
bs=size 指定塊大小(既是是ibs也是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長度的每一行尾的空格為新行
lcase 把大寫字符轉換為小寫字符
ucase 把小寫字符轉換為大寫字符
swab 交換輸入的每對字節
noerror 出錯時不停止
notrunc 不截短輸出文件
sync 把每個輸入塊填充到ibs個字節,不足部分用空(NUL)字符補齊
1)磁盤拷貝:
dd if=/dev/sda of=/dev/sdb
2)備份MBR:
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
3)破壞MBR中的bootloader:
dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446
4)有一個大與2K的二進制文件fileA?,F在想從第64個字節位置開始讀取,需要讀取的大小是128Byts。又有fileB, 想把上面讀取到的128Bytes寫到第32個字節開始的位置,替換128Bytes,請問如何實現?
#ddif=fileAof=fileBbs=1 count=128 skip=63 seek=31 conv=notrunc
1)備份:
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工具進行壓縮,保存到指定路徑
2)恢復:
dd if=/path/to/image of=/dev/sdx
將備份文件恢復到指定盤
gzip -dc /path/to/image.gz | dd of=/dev/sdx
將壓縮的備份文件恢復到指定盤
1)拷貝內存資料到硬盤
dd if=/dev/mem of=/root/mem.bin bs=1024
將內存里的數據拷貝到root目錄下的mem.bin文件
2)從光盤拷貝iso鏡像
dd if=/dev/cdrom of=/root/cd.iso
拷貝光盤數據到root文件夾下,并保存為cd.iso文件
3)銷毀磁盤數據
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 if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file
通過比較dd指令輸出中所顯示的命令執行時間,即可確定系統最佳的block size大小
測試硬盤讀寫速度
dd if=/root/1Gb.file bs=64k | dd of=/dev/null
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
通過上兩個命令輸出的執行時間,可以計算出測試硬盤的讀/寫速度
修復硬盤
dd if=/dev/sda of=/dev/sda
當硬盤較長時間(比如1,2年)放置不使用后,磁盤上會產生消磁點。當磁頭讀到這些區域時會遇到困難,并可能導致I/O錯誤。當這種情況影響到硬盤的第一個扇區時,可能導致硬盤報廢。上邊的命令有可能使這些數據起死回生。且這個過程是安全,高效的。
原創文章,作者:zhumengxiaotao,如若轉載,請注明出處:http://www.www58058.com/40299
文章整體思路清晰,結構層次分明,對于前面的可以做成鏈接跳轉回更好。