塊設備:block 存取單位“塊” 磁盤
字符設備:char 存取單位“字符” 鍵盤
設備文件:關聯至一個設備驅動程序,進而能夠跟與之對應硬件設備進行通信
只有元數據,沒有數據
設備號碼
主設備 :major number 標識設備類型
次設備:minor number 標識同一類型下的不同設備
硬盤接口類型:數據交換能力
並口:
IDE :33MB/S (接口速率)
SCSI :640MB/S
串口:
SATA:6Gbps
SAS:6Gbps
USB : 480MB/s
磁盤設備的設備文件命名:
IDE: /dev/hd
SCSI,SATA,SAS,USB :/dev/sd
不同設備:a-z
/dev/sda ,/dev/sdb....
同一哦設備上的不同分區:1,2,3....
/dev/sda1 , /dev/sda5
1.磁盤的基礎知識
1.1機械硬盤(HDD:Hard Disk Drive)
機械硬盤由多塊盤片組成,它們都繞着主軸旋轉。每塊盤片上下方都有讀寫磁頭懸浮在盤片上下方,它們與盤片的距離極小。在每次讀寫數據時盤片旋轉,讀寫磁頭被磁臂控制着不斷的移動來讀取其中的數據。
所有的盤片都是同時同步轉動,所有的磁頭也是同步移動。
磁盤在物理上划分了扇區、磁道和柱面。如果划分了分區,則分區是邏輯上柱面的分隔邊界。
讀寫磁頭在停止狀態下,在盤片旋轉時磁頭掃過的一圈軌跡稱為磁道,所有的磁道都是同心圓。從盤片外圈開始向內數,磁道號從0開始逐數增加。
每個磁道以512字節等分為多個弧段。所以外圈磁道的扇區數較多,內圈磁道的扇區數較少,有些硬盤參數上寫的磁道扇區數通常用一個范圍來標識,如373-768表示最外圈磁道有768個扇區,最內圈有373個扇區,這就可以計算出每個磁道的字節數。
每個扇區512字節,扇區是磁盤控制器的最小讀寫單元。
盤片同步旋轉,轉動一個角度,外圈比內圈的線速度更快,磁頭能夠掃過的扇區數更多,因此讀寫越外圈磁道中的數據比越內圈更快。
向磁盤寫數據是從外圈柱面向內圈柱面寫的,只有寫完一個柱面才寫下一個柱面。因此磁盤用過一段時間后存儲東西的速度會有所減慢就是因為外圈柱面已經用掉了。
1.2分區
分區是為了在邏輯上將某些柱面隔開形成邊界。它是以柱面為單位來划分的,首先划分外圈柱面,然后不斷向內划分。
由於讀寫越外圈磁道中的數據比越內圈更快,所以第一個分區在讀寫性能上比后面的分區更好。在Windows操作系統上,C盤的速度是最快的,越后面的區越慢就是這個原因。
在磁盤數據量非常大的情況下,划分分區的好處是掃描塊位圖等更快速:不用再掃描整塊磁盤的塊位圖,只需掃描對應分區的塊位圖。
1.3 MBR分區方法
MBR:主引導記錄(Master Boot Record),又叫做主引導扇區,是計算機開機后訪問硬盤時所必須要讀取的首個扇區.由於這一扇區承擔有不同於磁盤上其他普通存儲空間的特殊管理職能,作為管理整個磁盤空間的一個特殊空間,它不屬於磁盤上的任何分區,因而分區空間內的格式化命令不能清除主引導記錄的任何信息。主引導扇區由三個部分組成(共占用512個字節):
- 主引導程序即主引導記錄(MBR)(bootloader,占446個字節):可在FDISK程序中找到,它用於硬盤啟動時將系統控制轉給用戶指定的並在分區表中登記了的某個操作系統。
- 磁盤分區表項(DPT,Disk Partition Table):由四個分區表項構成(每16個字節標識一個分區)。
- 結束標志(占2個字節):AA55
在Linux中,MBR格式的磁盤主分區號從1-4,擴展分區號從2-4,邏輯分區5+;
MBR最大支持2T(32位表示扇區,2^32*512)。
hexdump -C /dev/sda -n512 # 查看sda硬盤的前512個字節 dd if=/dev/sda of=/data/MBR_bak bs=1 count=512 # 備份sda這塊銀盤的前512字節至/data/MBR_bak文件
1.4 GPT分區
GPT:GUID(Globals Unique Identifiers) partition table 支持128個分區,使用64位,支持8Z( 512Byte/block )64Z ( 4096Byte/block)
2.分區命令:
小技巧: 對於在vmare 下直接添加的硬盤,在不重啟機器的情況下通過fdisk -l或lsblk都無法識別剛剛新加的硬盤,我們可以通過這條命令來識別剛剛添加的硬盤;
第一步: ls /sys/class/scsi_host/ host0host1host2 第二步: echo "- - -" > /sys/class/scsi_host/host0/scan echo "- - -" > /sys/class/scsi_host/host1/scan echo "- - -" > /sys/class/scsi_host/host2/scan 第三步: lsblk fdisk -l # 即可看到剛剛添加的硬盤
2.1 fdisk 針對MBR分區
fdisk - manipulate disk partition table : 對於一塊硬盤來講,最多只能管理15個分區
如果一個存儲設備已經分過區,那么它可能是mbr格式的,也可能是gpt格式的,如果已經是mbr格式的,則只能繼續使用fdisk進行分區,
如果已經是gpt格式的,則只能使用gdisk進行分區。
使用fdisk分區,它只能實現MBR格式的分區
fdisk [選項] device
[root@CentOS7 ~]#fdisk /dev/sda Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. # 改變將只保存在內存中,直到你作出決定 Command (m for help): m # m獲取幫助 Command action a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition # 刪除分區 g create a new empty GPT partition table # 創建一個新的GPT分區表 G create an IRIX (SGI) partition table l list known partition types # 羅列各種分區類型(82 代表swap) m print this menu # 顯示幫助信息 n add a new partition # 添加一個新分區 o create a new empty DOS partition table p print the partition table # 顯示現有分區信息 q quit without saving changes # 僅退出,不保存 s create a new empty Sun disklabel t change a partition's system id # 修改分區id u change display/entry units v verify the partition table w write table to disk and exit # 保存並退出 x extra functionality (experts only) # 額外功能(僅限專家)
2.1.1、新建邏輯分區:(同樣的操作可新建主分區)
[root@CentOS7 ~]#fdisk /dev/sda Command (m for help): n # 新建分區 All primary partitions are in use Adding logical partition 7 # 此處顯示所有的主分區都在使用中,只能添加邏輯分區7 First sector (220209152-419430399, default 220209152): +5G # 一般直接回車,表示新建的分區從磁盤220209152-419430399哪個data block開始 Partition 7 of type Linux and of size 5 GiB is set Command (m for help): w The partition table has been altered!
通過fdisk -l
命令查看分區已經建好
分區結束,w保存退出。如果不保存,則按q退出。
因為上面的fdisk操作是在內存中執行的,w保存退出后,
2.1.2、系統內核是否已經識別新的分區:cat /proc/partition
2.1.3、所以要通過命令讓內核識別分區,才能進行格式化:
CentOS 5:partprobe [device]
CentOS 6,7:
partx, kpartx
partx -a [device]-n M:N :指明從哪個分區編號到哪個分區結束
kpartx -af [device]
注意:如果是刪除分區,我們也要同步,命令為:
partx -d --nr 1-2 /dev/sdb 表示同步刪除/dev/sdb里的1-2分區
注意:一般分區完結尾出現“Syncing disks.” 則已經同步完成,不再需要執行partprobe
。
補充:
在用shell寫腳本的過程中,如何新建分區:
echo -e "n\np\n\n\n+1G\nw\n" | fdisk /dev/sdc # 利用echo管道 在sdc建立一個1G的主分區; # 第二種方法; fdisk /dev/sdc << EOF #利用多行重定向輸入
2.2 parted 分區工具
parted - a partition manipulation program
parted [options] [device [command [options...]...]]
parted支持mbr格式和gpt格式的磁盤分區。它的強大在於可以一步到位而不需要不斷的交互式輸入
parted [options] [device [command [options...]...]] # option: -l lists partition layout on all block devices ,顯示全部塊設備 # command [options...]... print Display the partition table. mkpart part-type [fs-type] start end # Make a part-type partition for filesystem fs-type (if specified), beginning at start and ending at end (by default in megabytes). fs-type can be one of "btrfs", "ext2", "ext3", "ext4", "fat16", "fat32", "hfs", "hfs+", "linux-swap", "ntfs", "reiserfs", or "xfs". part-type should be one of "primary", "logical", or "extended". 示例: parted /dev/sdc mkpart extended ext4 9666 12000 #表示將
3.文件系統,格式化
文件系統是操作系統用於明確存儲設備或分區上的文件的方法和數據結構;即在存儲設備上組織文件的方法。操作系統中負責管理和存儲文件信息的軟件結構稱為文件管理系統,簡稱文件系統;
從系統角度來看,文件系統是對文件存儲設備的空間進行組織和分配,負責文件存儲並對存入的文件進行保護和檢索的系統。具體地說,它負責為用戶建立文件,存入、讀出、修改、轉儲文件,控制文件的存取,安全控制,日志,壓縮,加密等;
各種類型的文件系統:
Linux文件系統:ext2(Extended file system), ext3, ext4, xfs(SGI), btrfs(Oracle), reiserfs, jfs(AIX), swap
光盤:iso9660
Windows:FAT32, exFAT,NTFS
Unix: FFS(fast), UFS(unix), JFS2
網絡文件系統:NFS, CIFS
集群文件系統:GFS2, OCFS2(oracle)
分布式文件系統: fastdfs,ceph, moosefs, mogilefs, glusterfs, Lustre
RAW:未經處理或者未經格式化產生的文件系統
文件系統的組成部分:
內核中的模塊:ext4,xfs , vfat
用戶空間的管理工具: mkfs ,ext4,mkfs , xfs , mkfs
格式化的過程就是創建文件系統的過程,可以使用mkfs(make filesystem)工具進行格式化,也可以使用該工具家族的其他工具如mkfs.ext4/mkfs.xfs等專門針對文件系統的工具。
查看當前系統支持的文件系統:cat /proc/filesystems
補充:
- buffer:緩沖器,在將數據寫入磁盤前,數據是存放在buffer上的,然后再寫入磁盤;buffer決定寫入速度
- cache:緩存,cpu讀取磁盤的數據是從cache中讀取的,也就是說cache性能越好,讀取磁盤數據越快;
3.1 mkfs命令
mkfs - build a Linux filesystem
該命令在制作ext系統文件格式時調用的是mke2fs
命令
mkfs [options] [-t type] [fs-options] device [size]
創建文件系統:
mkfs 命令:
(1) mkfs.FS_TYPE /dev/DEVICE
FS_TYPE : ext4 , xfs ,brtfs , vfat
e.g mkfs.ext4 /dev/sda5
(2) mkfs -t FS_TYPE -f -L /dev/device
-L 'Lable' : 指定卷標名
要查看支持的文件系統類型,只需簡單的輸入mkfs然后按兩下tab鍵,就可以列出各文件系統對應的格式化命令,這些就是支持的文件系統類型:
CentOS 6: [root@CentOS6 ~]#mkfs mkfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.ext4dev mkfs.msdos mkfs.vfat # # # CentOS 7: [root@CentOS7 ~]#mkfs mkfs mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.fat mkfs.minix mkfs.msdos mkfs.vfat mkfs.xfs
也可以直接 mkfs -t FS_TYPE /device # 確定格式化的文件類型
blkid 分區名稱 : 顯示該分區屬性信息 (如果輸入命名沒有反應,說明沒有還沒有做文件系統)
3.2 mke2fs工具
mke2fs,是ext系列文件系統專用管理工具。該工具創建文件系統時,會從/etc/mke2fs.conf配置中讀取默認的配置項。
mke2fs - create an ext2/ext3/ext4 filesystem
mke2fs [ -c | -l filename ] [ -b block-size ] [ -D ] [ -f fragment-size ] [ -g blocks-per-group ] [ -G number-of-groups ] [ -i bytes-per-inode ] [ -I inode-size ] [ -j ] [ -J journal-options ] [ -N number-of-inodes ] [ -n ] [ -m reserved-blocks-percentage ] [ -o creator-os ] [ -O feature[,...] ] [ -q ] [ -r fs-revision-level ] [ -E extended-options ] [ -v ] [ -F ] [ -L volume-label ] [ -M last-mounted-directory ] [ -S ] [ -t fs-type ] [ -T usage-type ] [ -U UUID ] [ -V ] device [ blocks-count ] mke2fs -O journal_dev [ -b block-size ] [ -L volume-label ] [ -n ] [ -q ] [ -v ] external-journal [ blocks-count ] ### # option: -t fs-type # 指定要創建的文件系統類型(ext2,ext3 ext4),若不指定,則從/etc/mke2fs.conf中獲取默認的文件系統類型。 -b block-size # 指定每個block的大小,有效值有1024、2048和4096,單位是字節。 -I inode-size # 指定inode大小,單位為字節。一般128或256字節 -i bytes-per-inode # 指定每多少個字節就為其分配一個inode號。值越大,說明一個文件系統中分配的inode號越少,更適用於存儲大量大文件,值越小,inode號越多,更適用於存儲大量小文件。
該值不能小於一個block的大小,因為這樣會造成inode多余。注意,創建文件系統后該值就不能再改變了。 -c # 創建文件系統前先檢查設備是否有bad blocks。 -f fragment-size # 指定fragments的大小,單位字節。 -g blocks-per-group # 指定每個塊組中的block數量。不建議修改此項。 -G number-of-groups # 該選項用於ext4文件系統(嚴格地說是啟用了flex_bg特性),指定虛擬塊組(即一個extent)中包含的塊組個數,必須為2的冪次方。對於ext4文件系統來說,使用extent的功能能極大提升其性能。 -j # 創建帶有日志功能的文件系統,即ext3。如果要指定關於日志方面的設置,在-j的基礎上再使用-J指定,不過一般默認即可,具體可指定的選項看man文檔。 -L new-volume-label # 指定卷標名稱,名稱不得超出16字節。一般設定為掛載點的名字 -m reserved-blocks-percentage # 指定文件系統保留block數量的比例,保留一部分block,可以降低物理碎片。默認比例為5%。 -N number-of-inodes # 強制指定該文件系統應該分配多少個inode號,它會覆蓋通過計算得出inode數量的結果(根據block大小、數量和每多少字節分配一個inode得出Inode數量),但是不建議這么做。 -q # 安靜模式,可用於腳本中 -S # 重建superblock和group descriptions。在所有的superblock和備份的superblock都損壞時有用。它會重新初始化superblock和group descriptions,但不會改變inode table、bmap和imap(若真的改變,該分區數據就全丟了,還不如重新格式化)。在重建superblock后,應該執行e2fsck來保證文件系統的一致性。但要注意,應該完全正確地指定block的大小,其改選項並不能完全保證數據不丟失。 -v # 輸出詳細執行過程 -O FEATURE[,...] # 啟用指定特性 -O ^FEATURE # 關閉指定特性
以上mke2fs命令常用選項有:
-b :每個block大小
-L :創建卷標
-i :每多少個block分配一個inode
-t :創建的文件類型
-m :預留塊數量
示例:
CentOS 6:
[root@CentOS7 ~]#mke2fs -t ext4 -b 4096 -L hahahaha /dev/sda6 mke2fs 1.42.9 (28-Dec-2013) Filesystem label=hahahaha OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 327680 inodes, 1310720 blocks 65536 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=1342177280 40 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done CentOS 6 [root@CentOS6 ~]#mke2fs -t ext4 -b 4096 -L mydata /dev/sda6 mke2fs 1.41.12 (17-May-2010) Filesystem label=mydata OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 328656 inodes, 1312604 blocks 65630 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=1346371584 41 block groups 32768 blocks per group, 32768 fragments per group 8016 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 38 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
3.3 e2label 查看、設置卷標
查看:e2label device
設定:e2label device LABEL
> tune2fs -L NEWLABEL /device 也可以修改卷標
注意:此命令只針對ext文件系統做卷標,且只有格式化后才能設置卷標
3.4 tune2fs 工具
查看或修改ext系列文件系統的某些屬性
tune2fs - adjust tunable filesystem parameters on ext2/ext3/ext4 filesystems
tune2fs [OPTIONS] device # option: -l # 查看指定文件系統超級塊的內容:super block -j:ext2 --> ext3; (ext2不帶日志系統,ext3帶日志系統) -L LABEL:修改卷標; -m # 調整預留空間百分比; -U UUID: 修改UUID號 tune2fs -U `uuidgen` # 以隨機生成的uuid作為修改的uuid號 -O [^]FEATHER:開啟或關閉某種特性: acl :開啟acl功能 ^acl:關閉acl功能 (acl(access control list,訪問控制列表)功能詳見文件權限管理) tune2fs -l /dev/sda1 # 查看該分區超級塊內容 Default mount options: user_xattr acl # 其中的這一項含有acl表示開了acl功能 tune2fs -o ^acl /dev/sda1 # 表示關閉acl功能
4.查看文件系統狀態信息
4.1 lsbik
lsblk - list block devices 列出設備及其狀態(主要列出非空設備)
lsblk [options] [device...]
lsblk -f
查看到文件系統類型,和文件系統的uuid和掛載點
4.2 blkid :塊設備屬性信息查看
blkid - locate/print block device attributes 定位/輸出設備屬性信息
blkid -L LABEL:根據指定LABEL來定位對應的設備
blkid -U UUID:根據指定的UUID來定位對應的設備
4.3 du
du - estimate file space usage 評估某目錄總體空間占用情況
du [OPTION]... [FILE]... du [OPTION]... --files0-from=F # option: -a, --all:列出目錄中所有文件的統計信息,默認只會列出目錄中子目錄的統計信息,而不列出文件的統計信息 -h, --human-readable:人性化顯示大小 -0, --null:以空字符結尾,即"\0"而非換行的"\n" -S, --separate-dirs:不包含子目錄的大小 -s, --summarize:對目錄做總的統計,不列出目錄內文件的大小信息 -c,--total:對給出的文件或目錄做總計。在統計非同一個目錄文件大小時非常有用。見下文例子。 -d,--max-depth:指定顯示時的目錄深度,默認會遞歸顯示所有層次(centos7) --max-depth=N:只列出給定層次的目錄統計,如果N=0,則等價於"-s"(centos6) -x, --one-file-system:忽略不同文件系統上的文件,不對它們進行統計 -X, --exclude-from=FILE:從文件中讀取要排除的文件 --exclude=PATTERN:指定要忽略不統計的文件
注意區分du /etc
和du -a /etc
[root@CentOS7 ~]#du -a /etc |wc -l 3505 # 遞歸顯示全部的文件的統計信息 [root@CentOS7 ~]#du /etc |wc -l 734 # 只顯示目錄的信息 [root@CentOS7 ~]#find /etc -type d | wc -l 734
注意:du -d1 /etc
和du --max-depth=1 /etc
效果相同du -exclude=FILE /usr
的用法:
[root@CentOS6 ~]#du -h --max-depth=1 --exclude=/usr/lib64 /usr 136K /usr/local 310M /usr/lib 7.6M /usr/include 12K /usr/src 1.8G /usr/share 4.0K /usr/games 32M /usr/sbin 36M /usr/libexec 4.0K /usr/etc 269M /usr/bin 2.5G /usr
結合find使用
[root@xuexi ~]# find /boot/ -type f -name "*.img" -print0 | xargs -0 du -ch 28K /boot/grub2/i386-pc/core.img 4.0K /boot/grub2/i386-pc/boot.img 592K /boot/initrd-plymouth.img 44M /boot/initramfs-0-rescue-d13bce5e247540a5b5886f2bf8aabb35.img 17M /boot/initramfs-3.10.0-327.el7.x86_64.img 16M /boot/initramfs-3.10.0-327.el7.x86_64kdump.img 76M total
4.4 df
df - report file system disk space usage 顯示文件系統空間使用情況
df [OPTION]... [FILE]... # option -h:人性化轉換大小的顯示單位 -i:統計inode使用情況而非空間使用情況 -l, --local:只列出本地文件系統的使用情況,不列出網絡文件系統信息 -T, --print-type:同時輸出文件系統類型 -t, --type=TYPE:只列出給定文件系統的統計信息 -x, --exclude-type=TYPE:指定不顯示的文件系統類型的統計信息
-P :以Posix兼容的格式輸出(同一行輸出格式)
注意:df是讀取每個文件系統的superblock信息,所以評估速度非常快。由於是讀取superblock,所以如果目錄下掛載了另一個文件系統,是不會將此掛載的文件系統計入目錄大小的。
4.5 dumpe2fs
dumpe2fs - dump ext2/ext3/ext4 filesystem information
dumpe2fs prints the super block and blocks group information for the filesystem present on device.
顯示ext系列文件系統的super block 和block groups信息
[root@CentOS7 ~]#dumpe2fs -h /dev/sda6 查看超級塊信息 dumpe2fs 1.42.9 (28-Dec-2013) Filesystem volume name: hahahaha Last mounted on: <not available> Filesystem UUID: 8525fe09-c310-4a16-9f38-23ff43051e80 Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize Filesystem flags: signed_directory_hash Default mount options: user_xattr acl Filesystem state: clean Errors behavior: Continue Filesystem OS type: Linux Inode count: 327680 Block count: 1310720 Reserved block count: 65536 Free blocks: 1252258 Free inodes: 327669 First block: 0 Block size: 4096 Fragment size: 4096 Group descriptor size: 64 Reserved GDT blocks: 639 Blocks per group: 32768 Fragments per group: 32768 Inodes per group: 8192 Inode blocks per group: 512 Flex block group size: 16 Filesystem created: Sat Nov 24 16:00:45 2018 Last mount time: n/a Last write time: Sat Nov 24 16:00:46 2018 Mount count: 0 Maximum mount count: -1 Last checked: Sat Nov 24 16:00:45 2018 Check interval: 0 (<none>) Lifetime writes: 131 MB Reserved blocks uid: 0 (user root) Reserved blocks gid: 0 (group root) First inode: 11 Inode size: 256 Required extra isize: 28 Desired extra isize: 28 Journal inode: 8 Default directory hash: half_md4 Directory Hash Seed: f4ca6814-6107-4432-a987-4bc22801a5b9 Journal backup: inode blocks Journal features: (none) Journal size: 128M Journal length: 32768 Journal sequence: 0x00000001 Journal start: 0
4.6 findfs 查找分區
findfs [options] LABEL=<label> findfs [options] UUID=<uuid> 示例: findfs `grep /data /etc/fstab | cut -d" " -f1`
5.文件系統檢測與修復
注意:一定不要在掛載狀態下修復
fsck: File System Check fsck.FS_TYPE == fsck -t FS_TYPE -p: 自動修復錯誤 -r: 交互式修復錯誤 注:FS_TYPE一定要與分區上已有文件類型相同 e2fsck:ext系列文件專用的檢測修復工具 -y:自動回答為yes -f:強制修復