第5章 Linux上管理文件系統


5.1 機械硬盤

機械硬盤由多塊盤片組成,它們都繞着主軸旋轉。每塊盤片上下方都有讀寫磁頭懸浮在盤片上下方,它們與盤片的距離極小。在每次讀寫數據時盤片旋轉,讀寫磁頭被磁臂控制着不斷的移動來讀取其中的數據。

所有的盤片都是同時同步轉動,所有的磁頭也是同步移動。

 

磁盤在物理上划分了扇區、磁道和柱面。如果划分了分區,則分區是邏輯上柱面的分隔邊界。

讀寫磁頭在停止狀態下,在盤片旋轉時磁頭掃過的一圈軌跡稱為磁道,所有的磁道都是同心圓。從盤片外圈開始向內數,磁道號從0開始逐數增加。

每個磁道以512字節等分為多個弧段,每個弧段就是一個扇區。但是需要說明的是,扇區的大小並非一定是512字節。所以外圈磁道的扇區數較多,內圈磁道的扇區數較少,有些硬盤參數上寫的磁道扇區數通常用一個范圍來標識,如373-768表示最外圈磁道有768個扇區,最內圈有373個扇區,這就可以計算出每個磁道的字節數。

扇區上記錄了物理數據、扇區號、磁頭號(或者盤片號)及磁道號。

 

舊式磁盤的結構不分區(without zones),每個磁道扇區數相同,但是每個扇區仍然是512字節,也就是說磁性材料記錄的01的數量是相同的。這種結構的缺點是外圈磁道的面積大,存儲的數據分布寬松,內圈磁道面積小,存儲的數據分布密集,這樣就導致盤片外圈面積浪費。

新式磁盤結構進行了分區,將每個磁道等面積划分512字節的空間作為一個扇區,所以不同磁道扇區數不同。

現在的磁盤都是新式扇區划分結構。

 

將所有盤片相同磁道數的磁道划分為柱面。和磁道號的標記方式一樣,從外向內從0開始逐數增加。

之所以划分柱面,是因為所有磁盤同步旋轉,所有磁頭同步移動,所有的磁頭在任意一個時刻總是會出在同一個磁道同一個扇區上。讀寫數據時,任意一段數據總是按柱面來讀寫的。所以盤片數越多,讀寫所掃的扇區數就越少,所需的時間相對就越少,性能就越好。

向磁盤寫數據是從外圈柱面向內圈柱面寫的,只有寫完一個柱面才寫下一個柱面。

 

5.2 磁盤或分區容量計算

雖然現在的磁盤都是新式結構(每磁道扇區數不同),但是在磁盤信息上還是根據舊式結構來計算的,也就是說每個磁道扇區數相同,"扇區/磁道"的值說明每個磁道上有多少個扇區,也可以將其認為是新式結構下的平均值。

磁盤相關英文:

disk

磁盤

heads

磁頭。Linux系統中查看到的heads一般包括很多虛擬磁頭,實際的物理磁盤的一塊盤片上下兩面一面一磁頭,即2個磁頭。

sectors

扇區。一磁道上划分多個扇形區域,一般默認一扇區512字節。

track

磁道。盤片上一圈算一磁道。

cylinders

柱面。所有盤片的同一半徑的磁道組成一柱面。柱面數=盤片數*盤片上的磁道數。

units

單元塊。大小等於一個柱面大小。

磁盤或分區大小計算方法:

磁盤大小=units×柱面數(cylinders)

磁盤大小=磁頭數(heads)×每磁道上的扇區數(sectors)×512×柱面數(cylinders)

例如:查看/dev/sda3。

[root@xuexi tmp]# fdisk -l /dev/sda3
Disk /dev/sda3: 19.1 GB, 19116589056 bytes         # 總大小19G
255 heads, 63 sectors/track, 2324 cylinders        # 磁頭255 柱面2324  每磁道扇區數63(這是平均數)
Units = cylinders of 16065 * 512 = 8225280 bytes   # 單元塊大小
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Units=255×63×512=16065×512=8225280

磁盤大小=255*63*2324*512=19115550720= 19.11555072GB,不用1024算,用1000算。

5.3 分區

分區是為了在邏輯上將某些柱面隔開形成邊界。它是以柱面為單位來划分的,但是從CentOS 7開始,是按照扇區進行划分的。

在磁盤數據量非常大的情況下,划分分區的好處是掃描塊位圖等更快速:不用再掃描整塊磁盤的塊位圖,只需掃描對應分區的塊位圖。

5.3.1 分區方法(MBR和GPT)

MBR格式的磁盤中,會維護磁盤第一個扇區——MBR扇區,在該扇區中第446字節之后的64字節是分區表,每個分區占用16字節,所以限制了一塊磁盤最多只能有4個主分區(Primary,P),如果多於4個區,只能將主分區少於4個,通過建立擴展分區(Extend,E),然后在擴展分區建立邏輯分區(Logical,L)的方式來突破4個分區的限制,邏輯分區的數量不限制。

在Linux中,MBR格式的磁盤主分區號從1-4,擴展分區號從2-4,邏輯分區號從5開始。

例如,一塊盤想分成6個分區,可以:

1P+5L:sda1+sda5+sda6+sda7+sda8+sda9

2P+4L:sda1+sda2+sda5+sda6+sda7+sda8

3P+3L:sda1+sda2+sda3+sda5+sda6+sda7

而GPT格式突破了MBR的限制,它不再限制只能存儲4個分區表條目,而是使用了類似MBR擴展分區表條目的格式,它允許有128個主分區,這也使得它可以對超過2TB的磁盤進行分區。

5.3.2 MBR和GPT分區表信息

在MBR格式分區表中,MBR扇區占用512個字節,前446個字節是主引導記錄,即boot loader。中間64字節記錄着分區表信息,每個主分區信息占用16字節,因此最多只能有4個主分區,最后2個字節是有效標識位。如果使用擴展分區,則擴展分區對應的16字節記錄的是指向擴展分區中擴展分區表的指針。

MBR磁盤上,分區和啟動信息是保存在一起的,如果這部分數據被覆蓋或破壞,只能重建MBR。而GPT在整個磁盤上保存多個這部分信息的副本,因此它更為健壯,並可以恢復被破壞的這部分信息。GPT還為這些信息保存了循環冗余校驗碼(CRC)以保證其完整和正確,如果數據被破壞,GPT會發現這些破壞,並從磁盤上的其他地方進行恢復。

下面是GPT格式的分區表信息,大致約占17個字節。

EFI部分可以分為4個區域:EFI信息區(GPT頭)、分區表、GPT分區區域和備份區域。

  • EFI信息區(GPT頭):起始於磁盤的LBA1,通常也只占用這個單一扇區。其作用是定義分區表的位置和大小。GPT頭還包含頭和分區表的校驗和,這樣就可以及時發現錯誤。
  • 分區表:分區表區域包含分區表項。這個區域由GPT頭定義,一般占用磁盤LBA2~LBA33扇區,每扇區可存儲4個主分區的分區信息,所以共能分128個主分區。分區表中的每個分區項由起始地址、結束地址、類型值、名字、屬性標志、GUID值組成。分區表建立后,128位的GUID對系統來說是唯一的。
  • GPT分區:最大的區域,由分配給分區的扇區組成。這個區域的起始和結束地址由GPT頭定義。
  • 備份區:備份區域位於磁盤的尾部,包含GPT頭和分區表的備份。它占用GPT結束扇區和EFI結束扇區之間的33個扇區。其中最后一個扇區用來備份1號扇區的EFI信息,其余的32個扇區用來備份LBA2~LBA33扇區的分區表。

5.3.3 添加磁盤

正常情況下,添加磁盤后需要重啟系統才能被內核識別,在/dev/下才有對應的設備號,使用fdisk -l才會顯示出來。但是有時候不方便重啟,所以下面介紹一種磁盤熱插拔方式。更多熱插和熱拔方法見我的另一篇文章:Linux上磁盤熱插拔

[root@node1 ~]# ls /sys/class/scsi_host/  # 查看主機scsi總線號
host0  host1  host2

重新掃描scsi總線以熱插拔方式添加新設備。

[root@node1 ~]# echo "- - -" > /sys/class/scsi_host/host0/scan
[root@node1 ~]# echo "- - -" > /sys/class/scsi_host/host1/scan
[root@node1 ~]# echo "- - -" > /sys/class/scsi_host/host2/scan
[root@node1 ~]# fdisk -l      # 再查看就有了

如果scsi_host目錄系很多hostN目錄,則使用循環來完成。

[root@xuexi scsi_host]# ls /sys/class/scsi_host/
host0   host11  host14  host17  host2   host22  host25  host28  host30  host4  host7
host1   host12  host15  host18  host20  host23  host26  host29  host31  host5  host8
host10  host13  host16  host19  host21  host24  host27  host3   host32  host6  host9

[root@xuexi scsi_host]# for i in /sys/class/scsi_host/host*/scan;do echo "- - -" >$i;done

5.3.4 使用fdisk分區工具

fdisk工具用來分MBR磁盤上的區。要分GPT磁盤上的區,可以使用gdisk。parted工具對這兩種格式的磁盤分區都支持。

如果一個存儲設備已經分過區,那么它可能是mbr格式的,也可能是gpt格式的,如果已經是mbr格式的,則只能繼續使用fdisk進行分區,如果已經是gpt格式的,則只能使用gdisk進行分區。當然,無論什么格式的都可以使用parted進行分區,只不過也只能划分和已存在分區格式一樣的分區,因為無論何種格式的分區,它的分區表和分區標識是已經固定的。

使用fdisk分區,它只能實現MBR格式的分區。

[root@xuexi ~]# fdisk /dev/sdb   # sdb后沒加數字
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 # 刪除分區,如果刪除擴展分區同時會刪除里面的邏輯分區 l list known partition types # 列出分區類型 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  # 修改分區類型
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit # 保存分區信息並退出
   x   extra functionality (experts only)

新建第一個主分區:

Command (m for help): n                   # 添加分區
Command action
   e   extended                           # 添加擴展分區
   p   primary partition (1-4)            # 添加主分區
p                                         # 輸入p來創建第一個主分區
Partition number (1-4): 1                 # 輸入分區號,從1開始
First cylinder (1-1305, default 1):     # 輸入柱面號,不輸人默認是1
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1305, default 1305): +2G  # 給第一個主分區/dev/sdb1分2G,也可以使用柱面號來指定大小。
Command (m for help): p     # 第一個分區結束,p查看下已分區信息
 
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x2d8d64eb
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         262     2104483+  83  Linux

新建擴展分區:

Command (m for help): n      # 再建一個分區
Command action
   e   extended
   p   primary partition (1-4)
e      # 創建擴展分區
Partition number (1-4): 2     # 擴展分區號為2
First cylinder (263-1305, default 263):
Using default value 263
Last cylinder, +cylinders or +size{K,M,G} (263-1305, default 1305): # 剩余空間全部給擴展分區
Using default value 1305
Command (m for help): p 
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x2d8d64eb

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         262     2104483+  83  Linux
/dev/sdb2             263        1305     8377897+   5  Extended

新建擴展分區:

Command (m for help): n         # 新建邏輯分區
Command action
   l   logical (5 or over)      # 這里不再是擴展分區標識e,只有l。
             # 如果已有3個主分區,這里連l都沒有
   p   primary partition (1-4)
l            # 新建邏輯分區
First cylinder (263-1305, default 263):      # 這里也不能選邏輯分區號了
Using default value 263
Last cylinder, +cylinders or +size{K,M,G} (263-1305, default 1305): +3G
Command (m for help): p
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x2d8d64eb

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         262     2104483+  83  Linux
/dev/sdb2             263        1305     8377897+   5  Extended
/dev/sdb5             263         655     3156741   83  Linux

分區結束,保存。如果不保存,則按q。

Command (m for help): w  
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

分區的過程,實質上是划分柱面以及修改分區表。

上面的fdisk操作全部是在內存中執行的,必須保存生效。保存后,內核還未識別該分區,可以查看/proc/partition目錄下存在的文件,這些文件是能被內核識別的分區。運行partprobe或partx命令重新讀取分區表讓內核識別新的分區,內核識別后才可以格式化。而且分區結束時按w保存分區表有時候會失敗,提示重啟,這時候運行partprobe命令可以代替重啟就生效。

[root@xuexi ~]# partprobe         # 執行partprobe,下面一堆信息,不理它
Warning: WARNING: the kernel failed to re-read the partition table on /dev/sda (Device or resource busy).  As a result, it may not reflect all of your changes until after reboot.
Warning: Unable to open /dev/sr0 read-write (Read-only file system).  /dev/sr0 has been opened read-only.
Warning: Unable to open /dev/sr0 read-write (Read-only file system).  /dev/sr0 has been opened read-only.
Error: Invalid partition table - recursive partition on /dev/sr0.

也可指定在/dev/sdb上重加載分區表,省的無法讀取正忙的/dev/sda磁盤,給出上面一堆信息。

 [root@xuexi ~]# partprobe /dev/sdb

分區之后再使用fdisk -l查看新的分區狀態。

將上面分區所需要使用的命令總結如下,以后便於使用腳本分區。

  • s   fdisk /dev/sdb  # 選擇要分區的設備
  • n  # 創建分區
  • p/e/l # 選擇分區類型

如果主分區數有3個,且已經划分了擴展分區,再繼續分區時將只能划分邏輯分區,這種情況下l選項會直接跳過進入下一個階段。

  • s   N  # 指定分區號
  • \n  # 指定起始柱面號,使用默認值就直接回車即換行
  • +N  # 指定分區大小為N
  • w   # 分區結束保存退出
  • partprobe /dev/sdb &>/dev/null # 重讀分區表
  • fdisk -l | grep "^/dev/sdb"  &>/dev/null # 檢查分區狀態

5.3.5 使用gdisk分區工具

gdisk用來划分gpt分區,需要單獨安裝這個工具包。

shell> yum -y install gdisk

分區的時候直接帶上設備即可。以下是對新硬盤划分gpt分區的過程。

[root@xuexi ~]# gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries.

Command (? for help): ?
b       back up GPT data to a file
c       change a partition's name
d       delete a partition                               # 刪除分區
i       show detailed information on a partition         # 列出分區詳細信息
l       list known partition types                       # 列出所以已知的分區類型
n       add a new partition                              # 添加新分區
o       create a new empty GUID partition table (GPT)    # 創建一個新的空的guid分區表
p       print the partition table                        # 輸出分區表信息
q       quit without saving changes                      # 退出gdisk工具
r       recovery and transformation options (experts only) 
s       sort partitions                                
t       change a partition's type code                   # 修改分區類型
v       verify disk
w       write table to disk and exit                     # 將分區信息寫入到磁盤
x       extra functionality (experts only)             
?       print this menu

添加一個新分區。

Command (? for help): n   
Partition number (1-128, default 1):
First sector (34-41943006, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-41943006, default = 41943006) or {+-}size{KMGTP}: +10G
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'
 
Command (? for help): p
Disk /dev/sdb: 41943040 sectors, 20.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): F8AE925F-515F-4807-92ED-4109D0827191
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 41943006
Partitions will be aligned on 2048-sector boundaries
Total free space is 20971453 sectors (10.0 GiB)
 
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048        20973567   10.0 GiB    8300  Linux filesystem

Command (? for help): i   # 查看分區詳細信息
Using 1
Partition GUID code: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 (Linux filesystem)
Partition unique GUID: B2452103-4F32-4B60-AEF7-4BA42B7BF089
First sector: 2048 (at 1024.0 KiB)
Last sector: 20973567 (at 10.0 GiB)
Partition size: 20971520 sectors (10.0 GiB)
Attribute flags: 0000000000000000
Partition name: 'Linux filesystem'

保存分區表到磁盤。

Command (? for help): w 

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.

執行partprobe重新讀取分區表信息。

[root@server2 ~]# partprobe  /dev/sdb

gdisk還有幾個expert only的命令,其實沒什么專家不專家可用的,咱們需要知道的是命令何時能用,它們的作用是什么?

在gdisk交互過程命令行下,按下x表示進入擴展功能模式,該模式下的功能大部分都和gpt分區表相關,在不是非常了解gpt分區表結構的時候不建議做修改動作,但是查看信息類是沒問題的。以下是擴展功能模式下的命令。

Command (? for help): x

Expert command (? for help): ?
a       set attributes
c       change partition GUID
d       display the sector alignment value
e       relocate backup data structures to the end of the disk
g       change disk GUID
h       recompute CHS values in protective/hybrid MBR
i       show detailed information on a partition
l       set the sector alignment value
m       return to main menu
n       create a new protective MBR
o       print protective MBR data
p       print the partition table
q       quit without saving changes
r       recovery and transformation options (experts only)
s resize partition table # 修改分區表大小,注意不是分區大小
t       transpose two partition table entries
u Replicate partition table on new device # 將分區表導出
v       verify disk
w       write table to disk and exit
z zap (destroy) GPT data structures and exit # 損毀gpt上的數據 ?       print this menu 

5.3.6 使用parted分區工具

parted支持mbr格式和gpt格式的磁盤分區。它的強大在於可以一步到位而不需要不斷的交互式輸入(也可以交互式)。

parted分區工具是實時的,所以每一步操作都是直接寫入磁盤而不是寫進內存,它不像fdisk/gdisk還需要w命令將內存中的結果保存到磁盤中。

[root@xuexi ~]# parted /dev/sdc
GNU Parted 2.1
Using /dev/sdc
Welcome to GNU Parted! Type 'help' to view a list of commands.
 
(parted) help                                                             
  align-check TYPE N                      check partition N for TYPE(min|opt) alignment
  check NUMBER                            do a simple check on the file system(centos 7上已刪除該功能)
  cp [FROM-DEVICE] FROM-NUMBER TO-NUMBER  copy file system to another partition(centos 7上已刪除該功能)
  help [COMMAND]                          print general help, or help on COMMAND
  mklabel,mktable LABEL-TYPE create a new disklabel (partition table)
  mkfs NUMBER FS-TYPE                     make a FS-TYPE file system on partition NUMBER (centos 7上已刪除改該功能) 
 mkpart PART-TYPE [FS-TYPE] START END    make a partition
  mkpartfs PART-TYPE FS-TYPE START END    make a partition with a file system(centos 7上已刪除該功能)   
  move NUMBER START END                   move partition NUMBER(centos 7上已刪除該功能) 
  name NUMBER NAME                        name partition NUMBER as NAME
 print [devices|free|list,all|NUMBER]    display the partition table,available devices,free space, all found partitions,or a particular partition
 quit exit program
  rescue START END                        rescue a lost partition near START and END
 resize NUMBER START END resize partition NUMBER and its file system(修改分區大小(centos 7上已刪除該功能))
  rm NUMBER delete partition NUMBER (刪除分區)             
  select DEVICE choose the device to edit (重選磁盤進入parted狀態)  
  set NUMBER FLAG STATE                   change the FLAG on partition NUMBER(設置分區狀態,如將其off或on)  
 toggle [NUMBER [FLAG]] toggle the state of FLAG on partition NUMBER(修改文件系統類型,如swap、lvm)  
  unit UNIT                               set the default unit to UNIT(修改默認單位,kB/MB/GB等)
  version                                 display the version number and copyright information of GNU Parted

常用的命令是mklabel/rm/print/mkpart/help/quit,至於parted中一些看上去很好的功能如mkfs/mkpartfs/resize等可能會損毀當前數據而不夠安全,所以只要使用它的5個常用命令即可。

parted分區的前提是磁盤已經有分區表(partition table)或磁盤標簽(disk label),否則將顯示"unrecognised disk label",這是和fdisk/gdisk不同的地方,所以需要先使用mklabel創建標簽或分區表,最常見的標簽(分區表)為"msdos"和"gpt",其中msdos分區就是MBR格式的分區表,也就是會有主分區、擴展分區和邏輯分區的概念和限制。

下面使用parted對/dev/sdc創建msdos的新分區。

[root@xuexi ~]# parted /dev/sdc
GNU Parted 2.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel             # 創建磁盤分區標簽(分區表類型)                                               
New disk label type? msdos   # 選擇msdos即MBR類型    
                             # 上面的兩步也可以直接一步進行:(parted) mklabel msdos      
(parted) mkpart              # 開始進行分區     
Partition type?  primary/extended? p     # 創建主分區
File system type?  [ext2]? ext4          # 創建ext4文件系統
                                         # (注意,這里雖然指明了文件系統,但沒有任何意義,后面還是需要手動格式化並選擇文件系統類型)
Start? 1                                 # 分區開始位置,默認是M為單位,表示從1M開始,也可直接指定1G這種方式
End? 1024                                # 分區結束位置,1024-1=1023M

(parted) p                   # print,查看分區信息
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  1024MB  1023MB  primary

# 可以一步完成一個命令中的多個動作
(parted) mkpart p ext4 1026M 4096M       # 可以一步完成,也可以一步完成到任何位置,然后繼續交互下一步
                                         # 可能會提示分區未對齊"Warning: The resulting partition is not properly aligned for best performance.",忽略它
(parted) mkpart e 4098 -1    # 創建擴展分區,注意創建擴展分區時不指定文件系統類型;-1表示剩余的全部分配給該分區

(parted) p                                                               
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos 

Number  Start   End     Size    Type      File system  Flags
 1      1049kB  1024MB  1023MB  primary
 2      1026MB  4096MB  3070MB  primary
 3      4098MB  21.5GB  17.4GB  extended               lba

(parted) mkpart l ext4 4099 8194     # 創建邏輯分區,指定ext4
(parted) mkpart l ext4 8195 -1       # 繼續創建邏輯分區
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type      File system  Flags
 1      1049kB  1024MB  1023MB  primary
 2      1026MB  4096MB  3070MB  primary
 3      4098MB  21.5GB  17.4GB  extended               lba
 5      4099MB  8194MB  4095MB  logical
 6      8195MB  21.5GB  13.3GB  logical

(parted) rm 5    # 刪除5號分區
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type      File system  Flags
 1      1049kB  1024MB  1023MB  primary
 2      1026MB  4096MB  3070MB  primary
 3      4098MB  21.5GB  17.4GB  extended               lba
 5      8195MB  21.5GB  13.3GB  logical

(parted) quit                                  # 退出parted工具
Information: You may need to update /etc/fstab.  # 提示你要更新/etc/fstab中的配置,說明該工具是可以在線分區的

mkfs和mkpartfs等命令不完善,下面的警告信息已經給出了提示。

(parted) mkfs 1                                                          

WARNING: you are attempting to use parted to operate on (mkfs) a file system.
parted's file system manipulation code is not as robust as what you'll find in
dedicated, file-system-specific packages like e2fsprogs.  We recommend
you use parted only to manipulate partition tables, whenever possible. Support for performing most operations on most types of file systems
will be removed in an upcoming release.
Warning: The existing file system will be destroyed and all data on the partition will be lost. Do you want to
continue?
parted: invalid token: 1
Yes/No? n

使用parted工具進行的分區無需運行partprobe重新讀取分區表,內核會即時識別已經分區的分區信息。如下所示。

[root@xuexi tmp]# cat /proc/partitions  | grep "sdc"
   8       32   20971520 sdc
   8       33     999424 sdc1
   8       34    2998272 sdc2
   8       35         1  sdc3
   8       37   12967936 sdc5

一定要注意,雖然parted工具中指定了文件系統,但是並沒有意義,它仍需要手動進行格式化並指定分區類型。實際上,在parted中文件系統是可以不用指定的,即使是非交互模式下也可以省略。

5.3.7 fdisk/gdisk以及parted非交互式操作分區

使用非交互分區時,最重要的是待分的區的起始點不能是已使用的。可以使用lsblk或fdisk -l或parted DEV print來判斷將要從哪個地方開始分區。其實parted在非交互分區是最佳的工具,不僅是因為其書寫方式簡潔,而且待分區的起點如不合理它會自動提示是否要自動調整。

5.3.7.1 parted實現非交互

parted命令只能一次非交互一個命令中的所有動作。如下所示:

parted /dev/sdb mklabel msdos                 # 設置硬盤flag
parted /dev/sdb mkpart primary ext4 1 1000    # Mbr格式分區,分別是partition type/fstype/start/end
parted /dev/sdb mkpart 1 ext4 1M 10240M       # gpt格式分區,分別是name/fstype/start/end
parted /dev/sdb mkpart 1 10G 15G              # 省略fstype的交互式分區
parted /dev/sdb rm 1                          # 刪除分區
parted /dev/sdb p                             # 輸出信息

如果不確定分區的起點大小,可以加上-s選項使用script模式,該模式下parted將回答一切默認值,如yes、no。

shell> parted -s /dev/sdb mkpart 3 14G 16G
Warning: You requested a partition from 14.0GB to 16.0GB.                
The closest location we can manage is 15.0GB to 16.0GB.
Is this still acceptable to you?
Information: You may need to update /etc/fstab.

5.3.7.2 fdisk實現非交互

fdisk實現非交互的原理是從標准輸入中讀取,每讀取一行傳遞一次操作。

所以可以有兩種方式:使用echo和管道傳遞;將操作寫入到文件中,從文件中讀取。

例如:下面的命令創建了兩個分區。使用默認值時傳遞空行即可。

echo -e "n\np\n1\n\n+5G\nn\np\n2\n\n+1G\nw\n"  | fdisk /dev/sdb

如果要傳遞的操作很多,則可以將它們寫入到一個文件中,從文件中讀取。

echo -e "n\np\n1\n\n+5G\nn\np\n2\n\n+1G\nw\n" >/tmp/a.txt
fdisk /dev/sdb </tmp/a.txt

5.3.7.3 gdisk實現非交互

原理同fdisk。例如:

echo -e "n\n1\n\n+3G\n\nw\nY\n" | gdisk /dev/sdb

上面傳遞的各參數意義為:新建分區,分區number為1,使用默認開始扇區位置,分區大小+3G,使用默認分區類型,保存,確認。

5.4 格式化分區

分區結束后就需要格式化創建文件系統了,格式化分區的過程就是創建文件系統的過程。可以使用mkfs(make filesystem)工具進行格式化,也可以使用該工具家族的其他工具如mkfs.ext4/mkfs.xfs等專門針對文件系統的工具。

要查看支持的文件系統類型,只需簡單的輸入mkfs然后按兩下tab鍵,就可以列出各文件系統對應的格式化命令,這些就是支持的文件系統類型。

CentOS 6上支持的:

[root@xuexi ~]# mkfs
mkfs      mkfs.cramfs   mkfs.ext2     mkfs.ext3     mkfs.ext4     mkfs.ext4dev  mkfs.msdos    mkfs.vfat     

CentOS 7上支持的:

[root@server2 ~]# mkfs
mkfs      mkfs.btrfs   mkfs.cramfs  mkfs.ext2    mkfs.ext3    mkfs.ext4    mkfs.fat     mkfs.minix   mkfs.msdos   mkfs.vfat    mkfs.xfs

5.4.1 mkfs工具

mkfs [-t fstype] 分區

該工具非常簡單,它只需指定一個可選的"-t"選項指定要創建的文件系統類型,如果省略則默認創建ext2文件系統。該工具指定的"-t"選項其實是在調用對應文件系統專屬的格式化工具。

5.4.2 mke2fs工具

mkfs.ext2/mkfs.ext3/mkfs.ext4或mkfs -t extX其實都是在調用mke2fs工具。

該工具創建文件系統時,會從/etc/mke2fs.conf配置中讀取默認的配置項。

mke2fs [ -c ] [ -b block-size ] [ -f fragment-size ] [ -g blocks-per-group ] [ -G number-of-groups ] 
[ -i bytes-per-inode ] [ -I inode-size ] [ -j ] [ -N number-of-inodes ] [ -m reserved-blocks-percentage ]
[ -q ] [ -r fs-revision-level ] [ -v ] [ -L volume-label ] [ -S ] [ -t fs-type ] device [ blocks-count ] 選項說明: -t fs-type :指定要創建的文件系統類型(ext2,ext3 ext4),若不指定,則從/etc/mke2fs.conf中獲取默認的文件系統類型。 -b block-size :指定每個block的大小,有效值有1024、2048和4096,單位是字節。 -I inode-size :指定inode大小,單位為字節。必須為2的冪次方,且大於等於128字節。值越大,說明inode的集合體inode table占用越多的空 間,這不僅會擠占文件系統中的可用空間,還會降低性能,因為要掃描inode table需要消耗更多時間,但是在linux kernel 2.6.10 之后,由於使用inode存儲了很多擴展的額外屬性,所以128字節已經不夠用了,因此ext4默認的inode size已經變為256,盡管 inode大小增大了,但因為使用inode存儲擴展屬性帶來的性能提升遠高於inode size變大導致的負面影響,所以仍建議使用256字 節的inode。 -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 :輸出詳細執行過程

所以,有可能用到的選項也就"-t"指定文件系統類型,"-b"指定block大小,"-I"指定inode大小,"-i"指定分配inode的比例。

例如:

shell> mke2fs -t ext4 -I 256 /dev/sdb2 -b 4096
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2684354560
80 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, 1605632

Writing inode tables: done                           
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 39 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

提示使用tune2fs修改自動檢測文件系統的頻率。見下文。

5.4.3 tune2fs修改ext文件系統屬性

該工具其實沒什么太大作用,文件系統創建好后很多屬性是固定不能修改的,能修改的屬性很有限,且都是無關緊要的。

但有些時候還是可以用到它做些事情,例如剛創建完ext文件系統后會提示修改自檢時間。

tune2fs [  -c  max-mount-counts ] [ -i interval-between-checks ] [ -j ] device
-j:將ext2文件系統升級為ext3;
-c:修改文件系統最多掛載多少次后進行自檢,設置為0或-1將永不自檢;
-i:修改過了多少時間進行自檢。時間單位可以指定為天(默認)/月/星期[d|m|w],設置為0將永不自檢。

例如:tune2fs -i 0 /dev/sdb1

5.5 查看文件系統狀態信息

5.5.1 lsblk

lsblk(list block devices)用於列出設備及其狀態,主要列出非空的存儲設備。其實它只會列出/sys/dev/block中的主次設備號文件,且默認只列出非空設備。

[root@server2 ~]# lsblk 

其中上面的幾列意義如下:

NAME:設備名稱;

MAJ:MIN:主設備號和此設備號;

RM:是否為可卸載設備,1表示可卸載設備。可卸載設備如光盤、USB等。並非能夠umount的就是可卸載的;

SIZE:設備總空間大小;

RO:是否為只讀;

TYPE:是磁盤disk,還是分區part,亦或是rom,還有loop設備;

mountpoint:掛載點。

[root@server2 ~]# lsblk /dev/sdb
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb      8:16   0   20G  0 disk
├─sdb1   8:17   0  9.5G  0 part /mydata/data
└─sdb2   8:18   0    3G  0 part

[root@server2 ~]# lsblk /dev/sdb1
NAME MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb1   8:17   0  9.5G  0 part /mydata/data

另外常用的一個選項是"-f",它可以查看到文件系統類型,和文件系統的uuid和掛載點。

[root@xuexi ~]# lsblk -f
NAME   FSTYPE LABEL UUID                                 MOUNTPOINT
sda                                                     
├─sda1 ext4         77b5f0da-b0f9-4054-9902-c6cdacf29f5e /boot
├─sda2 ext4         f199fcb4-fb06-4bf5-a1b7-a15af0f7cb47 /
└─sda3 swap         6ae3975c-1a2a-46e3-87f3-d5bd3f1eff48 [SWAP]
sr0                                                     
sdb                                                      
├─sdb1 ext4         95e5b9d5-be78-43ed-a06a-97fd1de9a3fe
├─sdb2 ext2         45da2d94-190a-4548-85bb-b3c46ae6d9a7
└─sdb3                          

每個已經格式化的文件系統都有其類型和uuid,而沒有格式化的設備(如/dev/sdb3),將只顯示一個Name結果,表示該設備還未進行格式化。

5.5.2 blkid

雖然它有不少比較強大的功能,但一般只用它一個功能,就是查看器文件系統類型和uuid。

[root@xuexi ~]# blkid
/dev/sda1: UUID="77b5f0da-b0f9-4054-9902-c6cdacf29f5e" TYPE="ext4"
/dev/sda2: UUID="f199fcb4-fb06-4bf5-a1b7-a15af0f7cb47" TYPE="ext4"
/dev/sda3: UUID="6ae3975c-1a2a-46e3-87f3-d5bd3f1eff48" TYPE="swap"
/dev/sdb1: UUID="95e5b9d5-be78-43ed-a06a-97fd1de9a3fe" TYPE="ext4"
/dev/sdb2: UUID="45da2d94-190a-4548-85bb-b3c46ae6d9a7" TYPE="ext2"

[root@xuexi ~]# blkid /dev/sdb1
/dev/sdb1: UUID="95e5b9d5-be78-43ed-a06a-97fd1de9a3fe" TYPE="ext4"

5.5.3 parted /dev/sda print和fdisk -l

shell> parted /dev/sdb p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name              Flags
 1      1049kB  10.2GB  10.2GB  ext4
 2      10.2GB  13.5GB  3221MB  ext2         Linux filesystem
shell> fdisk
-l /dev/sda Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x000cb657 Device Boot Start End Blocks Id System /dev/sda1 * 2048 514047 256000 83 Linux /dev/sda2 514048 37847039 18666496 83 Linux /dev/sda3 37847040 41943039 2048000 82 Linux swap / Solaris

雖然fdisk和gdisk分別是mbr和gpt格式的專用工具,但是僅用於查看信息還是可以的。parted能兼容兩者,所以也可以。

5.5.4 file -s

[root@xuexi ~]# file -s /dev/sdb2
/dev/sdb2: Linux rev 1.0 ext2 filesystem data (large files)

5.5.5 du

du命令用於評估文件的空間占用情況,它會統計每個文件的大小,統計時會遞歸統計目錄中的文件,也就是說,它會遍歷整個待統計目錄,所以統計速度上可能並不理想。

du [OPTION]... [FILE]...
選項說明:
-a, --all:列出目錄中所有文件的統計信息,默認只會列出目錄中子目錄的統計信息,而不列出文件的統計信息
-h, --human-readable:人性化顯示大小
-0, --null:以空字符結尾,即"\0"而非換行的"\n"
-S, --separate-dirs:不包含子目錄的大小
-s, --summarize:對目錄做總的統計,不列出目錄內文件的大小信息
-c,--total:對給出的文件或目錄做總計。在統計非同一個目錄文件大小時非常有用。見下文例子。
-d,--max-depth:指定顯示時的目錄深度,默認會遞歸顯示所有層次
--max-depth=N:只列出給定層次的目錄統計,如果N=0,則等價於"-s"
-x, --one-file-system:忽略不同文件系統上的文件,不對它們進行統計 -X, --exclude-from=FILE:從文件中讀取要排除的文件 --exclude=PATTERN:指定要忽略不統計的文件

注意:

(1).上面的選項中,有些是不列出某些項,有些是不統計某些項,它們是不一樣的。

(2).如果要統計的目錄下掛載了一個文件系統,那么這個文件系統的大小也會被計入該目錄的大小中。

[root@xuexi ~]# du -sh /etc
29M     /etc
[root@xuexi ~]# du -ah /tmp
4.0K    /tmp/b.txt
4.0K    /tmp/a
4.0K    /tmp/.ICE-unix
4.0K    /tmp/testdir/subdir
0       /tmp/testdir/a.log
8.0K    /tmp/testdir
24K     /tmp
[root@xuexi ~]# du -h --max-depth=1 /usr
15M     /usr/include
383M    /usr/lib64
132K    /usr/local
391M    /usr/share
4.0K    /usr/etc
118M    /usr/lib
44M     /usr/libexec
49M     /usr/src
32M     /usr/sbin
4.0K    /usr/games
75M     /usr/bin
1.1G /usr
[root@xuexi ~]# du -h --max-depth=1 --exclude=/usr/lib64 /usr
15M     /usr/include
132K    /usr/local
391M    /usr/share
4.0K    /usr/etc
118M    /usr/lib
44M     /usr/libexec
49M     /usr/src
32M     /usr/sbin
4.0K    /usr/games
75M     /usr/bin
721M /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

請注意"-c"和"-s"統計的區別。

[root@xuexi ~]# find /boot/ -type f -name "*.img" -print0 | xargs -0 du -sh
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

5.5.6 df

df用於報告磁盤空間使用率,默認顯示的大小是1K大小block數量,也就是以k為單位。

和du不同的是,df是讀取每個文件系統的superblock信息,所以評估速度非常快。由於是讀取superblock,所以如果目錄下掛載了另一個文件系統,是不會將此掛載的文件系統計入目錄大小的。注意,du和df統計的結果是不一樣的,如果對它們的結果不同有興趣,可參考我的另一篇文章:詳細分析du和df的統計結果為什么不一樣

如果用df統計某個文件的空間使用情況,將會轉而統計該文件所在文件系統的空間使用情況。

df [OPTION]... [FILE]...
選項說明:
-h:人性化轉換大小的顯示單位
-i:統計inode使用情況而非空間使用情況
-l, --local:只列出本地文件系統的使用情況,不列出網絡文件系統信息
-T, --print-type:同時輸出文件系統類型
-t, --type=TYPE:只列出給定文件系統的統計信息
-x, --exclude-type=TYPE:指定不顯示的文件系統類型的統計信息

示例:

[root@server2 ~]# df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sda2      xfs        18G  2.3G   16G  13% /
devtmpfs       devtmpfs  904M     0  904M   0% /dev
tmpfs          tmpfs     913M     0  913M   0% /dev/shm
tmpfs          tmpfs     913M  8.6M  904M   1% /run
tmpfs          tmpfs     913M     0  913M   0% /sys/fs/cgroup
/dev/sda1      xfs       247M  110M  137M  45% /boot
tmpfs          tmpfs     183M     0  183M   0% /run/user/0
/dev/sdb1      ext4      9.3G   37M  8.8G   1% /mydata/data
[root@server2 ~]# df -i
Filesystem       Inodes  IUsed    IFree IUse% Mounted on
/dev/sda2      18666496 106474 18560022    1% /
devtmpfs         231218    388   230830    1% /dev
tmpfs            233586      1   233585    1% /dev/shm
tmpfs            233586    479   233107    1% /run
tmpfs            233586     13   233573    1% /sys/fs/cgroup
/dev/sda1        256000    330   255670    1% /boot
tmpfs            233586      1   233585    1% /run/user/0
/dev/sdb1        625856     14   625842    1% /mydata/data

5.5.7 dumpe2fs

用於查看ext類文件系統的superblock及塊組信息。使用-h選項將只顯示superblock信息。

以下是ext4文件系統superblock的信息。

[root@xuexi ~]# dumpe2fs -h /dev/sda2
dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name:   <none>
Last mounted on:          /
Filesystem UUID:          f199fcb4-fb06-4bf5-a1b7-a15af0f7cb47
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem featurs:      has_journal ext_attr resize_inode dir_index filetype needs_recovery exent 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:              1166880
Block count:              4666624
Reserved block count:     233331
Free blocks:              4196335
Free inodes:              1111754
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      1022
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8160
Inode blocks per group:   510
Flex block group size:    16
Filesystem created:       Sat Feb 25 11:48:47 2017
Last mount time:          Tue Jun  6 18:13:10 2017
Last write time:          Sat Feb 25 11:53:49 2017
Mount count:              6
Maximum mount count:      -1
Last checked:             Sat Feb 25 11:48:47 2017
Check interval:           0 (<none>)
Lifetime writes:          2657 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:      d4e6493a-09ef-41a1-9d66-4020922f1aa9
Journal backup:           inode blocks
Journal features:         journal_incompat_revoke
Journal size:             128M
Journal length:           32768
Journal sequence:         0x00001bd9
Journal start:            23358

其中一個塊組信息。

[root@xuexi ~]# dumpe2fs /dev/sda2 | tail -7
dumpe2fs 1.41.12 (17-May-2010)
Group 142: (Blocks 4653056-4666623) [INODE_UNINIT, ITABLE_ZEROED]
  Checksum 0x64ce, unused inodes 8160
  Block bitmap at 4194318 (+4294508558), Inode bitmap at 4194334 (+4294508574)
  Inode table at 4201476-4201985 (+4294515716)
  13568 free blocks, 8160 free inodes, 0 directories, 8160 unused inodes
  Free blocks: 4653056-4666623
  Free inodes: 1158721-1166880

5.6 掛載和卸載文件系統

在此,只簡單介紹mount和umount的用法,至於實現掛載和卸載的機制和原理細節,參看掛載文件系統的細節

5.6.1 mount

mount用來顯示掛載信息或者進行文件系統掛載,它的功能及其的強大(強大到離譜),它不僅支持掛載非常多種文件系統,如ext/xfs/nfs/smbfs/cifs (win上的共享目錄)等,還支持共享掛載點、繼承掛載點(父子關系)、綁定掛載點、移動掛載點等等功能。在本文只介紹其最簡單的掛載功能。

不同的文件系統掛載選項是有所差別的,在掛載過程中如果出錯,應該man mount並查看對應文件系統的掛載選項。

mount並非只能掛載文件系統,也可以將目錄掛載到另一個目錄下,其實它實現的是目錄"硬鏈接",默認情況下,是無法對目錄建立硬鏈接的,但是通過mount可以完成綁定,綁定后兩個目錄的inode號是完全相同的,但盡管建立的是目錄的"硬鏈接",但其實也僅是拿來當軟鏈接用。

以下是ext類文件系統的選項,可能有些選項是不支持其他文件系統的。

mount # 將顯示當前已掛載信息
mount [-t 欲掛載文件系統類型 ] [-o 特殊選項] 設備名 掛載目錄

選項說明:
-a 將/etc/fstab文件里指定的掛載選項重新掛載一遍。 -t 支持ext2/ext3/ext4/vfat/fat/iso9660(光盤默認格式)。 不用-t時默認會調用blkid來獲取文件系統類型。 -n 不把掛載記錄寫在/etc/mtab文件中,一般掛載會在/proc/mounts中記錄下掛載信息,然后同步到/etc/mtab,指定-n表示不同步該掛載信息。 -o 指定掛載特殊選項。下面是兩個比較常用的: loop 掛載鏡像文件,如iso文件 ro 只讀掛載 rw 讀寫掛載 auto 相當於mount -a dev 如果掛載的文件系統中有設備訪問入口則啟用它,使其可以作為設備訪問入口 default rw,suid,dev,exec,auto,nouser,async,and relatime async 異步掛載,只寫到內存 sync 同步掛載,通過掛載位置寫入對方硬盤 atime 修改訪問時間,每次訪問都修改atime會導致性能降低,所以默認是noatime noatime 不修改訪問時間,高並發時使用這個選項可以減少磁盤IO nodiratime 不修改文件夾訪問時間,高並發時使用這個選項可以減少磁盤IO exec/noexec 掛載后的文件系統里的可執行程序是否可執行,默認是可以執行exec, 優先級高於權限的限定 remount 重新掛載,此時可以不用指定掛載點。 suid/nosuid 對掛載的文件系統啟用或禁用suid,對於外來設備最好禁用suid _netdev 需要網絡掛載時默認將停留在掛載界面直到加載網絡了。使用_netdev可以忽略網絡正常掛載。如NFS開機掛載。 user 允許普通用戶進行掛載該目錄,但只允許掛載者進行卸載該目錄 users 允許所有用戶掛載和卸載該目錄 nouser 禁止普通用戶掛載和卸載該目錄,這是默認的,默認情況下一個目錄不指定user/users時,將只有root能掛載

一般user/users/nouser都用在/etc/fstab中,直接在命令行下使用這幾個選項意義不是很大。

例如:

(1).掛載CentOS的安裝鏡像到/mnt。

mount /dev/cdrom /mnt

其實/dev/cdrom是/dev/sr0的一個軟鏈接,/dev/sr0是光驅設備,所以也可以用/dev/sr0進行掛載。

mount /dev/sr0 /mnt

(2).重新掛載。

[root@xuexi ~]# mount -t ext4 -o remount /dev/sdb1 /data1

(3).重新掛載文件系統為可讀寫。

mount -t ext4 -o rw remount /dev/sdb1 /data1

(4).掛載windows的共享目錄。

win上共享文件的文件系統是cifs類型,要在Linux上掛載,必須得有mount.cifs命令,如果沒有則安裝cifs-utils包。

假設win上共享目錄的unc路徑為\\192.168.100.8\test,共享給的用戶名和密碼分別為long3:123,要掛在linux上的/mydata目錄上。

shell> mount.cifs -o username="long3",password="123" //192.168.100.8/test /mydata

注意,如果是比較新版本的win10(2017年之后更新的版本)或較新版本的win server,直接mount.cifs會報錯:

[root@xuexi ~]# mount.cifs -o username="long3",password="123" //192.168.100.8/test /mnt         
mount error(112): Host is down
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)

這是因為2017年微軟的一個補丁禁用了SMBv1協議,通過smbclient的報告可知:

[root@xuexi ~]# yum -y install samba-client
[root@xuexi ~]# smbclient -L //192.168.100.8
Enter root's password: 
protocol negotiation failed: NT_STATUS_CONNECTION_RESET

因此,在mount的時候指定cifs(SMB)的版本號為2.0即可。

[root@xuexi ~]# mount.cifs -o username="long3",password="123",vers=2.0 //192.168.100.8/test /mnt

但是需要注意,在CentOS 4,5,6下的模塊cifs.ko版本(較低)只能使用SMBv1協議,因此即使指定版本號也一樣無效。只有在CentOS 7上才能使用SMBv2或SMBv3。

(5).基於ssh掛載遠程目錄。

如何基於ssh像NFS一樣掛載遠程主機上的目錄?可以通過sshfs工具,該工具在fuse-sshfs包中,這個包在epel源中提供。

yum -y install fuse-sshfs

例如,掛載192.168.100.8上的根目錄到本地的/mnt上。

sshfs 192.168.100.8:/ /mnt

卸載時直接umount即可。

關於sshfs,詳細內容見:https://www.cnblogs.com/f-ck-need-u/p/9104950.html

(6).掛載目錄到另一個目錄下。掛載目錄時,掛載目錄和掛載點的inode是相同的,它們兩者的內容也是完全相同的。

mount --bind /mydata /mnt

(7).查看某個目錄是否是掛載點,使用mountpoint命令。

[root@xuexi ~]# mountpoint /mydata/
/mydata/ is a mountpoint

[root@xuexi ~]# echo $?           
0

[root@xuexi ~]# mountpoint /mnt
/mnt is not a mountpoint

[root@xuexi ~]# echo $?       
1

掛載的參數信息存放在/proc/mounts(是/proc/self/mounts的軟鏈接)中,在/proc/self/mountstats和/proc/mountinfo里則記錄了更詳細的掛載信息。

[root@xuexi ~]# cat /proc/mounts
rootfs / rootfs rw 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
devtmpfs /dev devtmpfs rw,relatime,size=491000k,nr_inodes=122750,mode=755 0 0
devpts /dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /dev/shm tmpfs rw,relatime 0 0
/dev/sda2 / ext4 rw,relatime,barrier=1,data=ordered 0 0
/proc/bus/usb /proc/bus/usb usbfs rw,relatime 0 0
/dev/sda1 /boot ext4 rw,relatime,barrier=1,data=ordered 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0

文件系統是需要驅動支持的,沒有驅動的文件系統也無法掛載,Linux中支持的文件系統驅動在/lib/modules/$(uname -r)/kernel/fs下。

[root@xuexi ~]# ls /lib/modules/$(uname -r)/kernel/fs/
autofs4  cachefiles  configfs  dlm       exportfs  ext3  fat      fuse  jbd   jffs2  mbcache.ko  nfs_common  nls       ubifs  xfs
btrfs    cifs        cramfs    ecryptfs  ext2      ext4  fscache  gfs2  jbd2  lockd  nfs         nfsd        squashfs  udf

5.6.2 直接掛載鏡像文件

有時候需要掛載CentOS的鏡像文件,在虛擬機中經常是將鏡像放入虛擬機的CD/DVD虛擬光驅中,然后在Linux上對/dev/cdrom進行掛載。其實/dev/cdrom是/dev/sr0的一個軟鏈接,/dev/sr0是Linux中的光驅,所以上面的過程相當於是將鏡像文件通過虛擬軟件的虛擬光驅和linux的光驅連接起來,這樣只需要掛載Linux中的光驅就可以了。但是,在非虛擬環境中沒有虛擬光驅,而且在Linux中的一個鏡像文件難道一定要拷貝到主機上通過虛擬光驅進行連接嗎?

mount是一個極其強大的掛載工具,它支持掛載很多種文件類型,其中就支持掛載鏡像文件,其實它連掛載目錄都支持。

mount -o loop CentOS-6.6-x86_64-bin-DVD2.iso /mnt

[root@xuexi ~]# lsblk
NAME     MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0      7:0    0   1.2G  0 loop /mnt
sda        8:0    0    20G  0 disk
├─sda1   8:1    0   250M  0 part /boot
├─sda2   8:2    0  17.8G  0 part /
└─sda3   8:3    0     2G  0 part [SWAP]
sr0       11:0    1  1024M  0 rom

5.6.3 umount

umount 設備名或掛載目錄
umount -lf 強制卸載

卸載時,既可以使用設備名也可以使用掛載點卸載。有時候掛載網絡系統(如NFS)時,設備名很長,這時候可以使用掛載點來卸載就方便多了。

如果用戶正在訪問某個目錄或文件,使得卸載一直顯示Busy,使用fuser -v DIR可以知道誰正在訪問該目錄或文件。

[root@xuexi ~]# fuser -v /root
                     USER        PID ACCESS COMMAND
/root:               root      37453 ..c.. bash

使用-k選項kill掉正在使用目錄或文件的進程,使用-km選項kill掉文件系統上的所有進程,然后再umount。

[root@xuexi ~]# fuser -km /mnt/cdrom;umount /mnt/cdrom

5.6.4 開機自動掛載/etc/fstab

通過將掛載選項寫入到/etc/fstab中,系統會自動掛載該文件中的配置項。但要注意,該文件在開機的前幾個過程中就被讀取,所以配置錯誤很可能會導致開機失敗。

其中最后兩列,它們分別表示備份文件系統和開機自檢,一般都可以設置為0。

由於能用的備份工具眾多,沒人會在這里設置備份,所以備份列設置為0。

最后一列是開機自檢設置列,開機自檢調用的是fsck程序,所有有些ext類文件系統作為"/"時,可能會設置為1,但是fsck是不支持xfs文件系統的,所以對於xfs文件系統而言,該項必須設置為0。

其實無需考慮那么多,直接將這兩列設置為0就可以了。

5.6.5 修復錯誤的/etc/fstab

萬一/etc/fstab配置錯誤,導致開機無法加載。這時提示輸入root密碼進入單人維護模式,只不過擔任模式下根文件系統是只讀的,哪怕是root也無法直接修改/etc/fstab,所以應該將"/"文件系統進行重新掛載。

執行下面的命令,重掛載根分區,並給讀寫權限,再去修改錯誤的fstab文件記錄,再重啟。

[root@xuexi ~]# mount -n -o remount,rw /

5.6.7 按需自動掛載(autofs)

使用autofs實現需要掛載時就掛載,不需要掛載時5分鍾后自動卸載。但是在實際環境中基本不會使用按需掛載。

autofs是一個服務程序,需要讓其運行在后台,可以用來掛NFS,也可掛本地的文件系統。

默認不裝autofs,需要自己裝。

[root@xuexi ~]# yum install -y autofs

autofs實現按需掛載的方式是指定監控目錄,可在其配置文件/etc/auto.master中指定。

/etc/auto.master里面只有兩列:第一列是監控目錄;第二列是記錄掛載選項的文件,該文件可以隨便取名。

[root@xuexi ~]# cat /etc/auto.master
/share  /etc/auto.mount    # 監控/share目錄,使用/etc/auto.nfs記錄掛載選項

上述監控的/share目錄,其實這是監控的父目錄,在此目錄下的目錄如/share/data目錄可以作為掛載點,當訪問到/share/data時就被監控到,然后會按照掛載選項將掛載設備掛載到/share/data上。

上述配置中配置的掛載選項文件是/etc/auto.mount,所以建立此文件,寫入掛載選項。

[root@xuexi ~]# cat /etc/auto.mount
#cd              -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom

# the following entries are samples to pique your imagination
#linux          -ro,soft,intr           ftp.example.org:/pub/linux
#boot           -fstype=ext2            :/dev/hda1
#floppy         -fstype=auto            :/dev/fd0
#floppy         -fstype=ext2            :/dev/fd0
#e2floppy       -fstype=ext2            :/dev/fd0
#jaz            -fstype=ext2            :/dev/sdc1
#removable      -fstype=ext2            :/dev/hdd

該文件有3列:

第一列指定的是在/etc/auto.master指定的/share下的目錄/share/data,它是真正的被監控路徑,也是掛載點。可使用相對路徑data表示/share/data。

第二列是mount的選項,前面使用一個"-"表示,該列可有可無。

第三列是待掛載設備,可以是NFS服務端的共享目錄,也可以本地設備。

[root@xuexi ~]# vim /etc/auto.mount
data   -rw,bg,soft,rsize=32768,wsize=32768     192.168.100.61:/data

上面的配置表示當訪問到/share/data時,自動使用參數(rw,bg,soft,rsize=32768,wsize=32768)掛載遠端192.168.100.61的/data目錄到/share/data上。

剩下的步驟就是啟動autofs服務。

[root@xuexi data]# /etc/init.d/autofs restart

5.7 swap分區

雖說個人電腦上基本已經無需設置swap分區了,但是在服務器上還是應該准備swap分區,以做到有備無患和防止眾多"玄學"問題。

5.7.1 查看swap使用情況

[root@xuexi ~]# free
            total      used      free     shared    buffers     cached
Mem:       1906488     349376    1557112      200     16920      200200
-/+ buffers/cache:     132256    1774232
Swap:      2097148          0    2097148

[root@xuexi ~]# free -m        # 以MB顯示
             total       used       free      shared    buffers     cached
Mem:          1861        341       1520          0         16        195
-/+ buffers/cache:        129       1732     # 這個是真正的可用內存空間
Swap:         2047          0       2047     # 這個是swap空間,發現一點都沒被用

使用mount/lsblk等可以查看出哪個分區在充當swap分區。使用swapon -s也可以直接查看出。

[root@server2 ~]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/sda3                               partition       2047996 37064   -1

5.7.2 添加swap分區

(1).可以新分一個區,在分區時指定其分區的ID號為SWAP類型。

mbr和gpt格式的磁盤上這個ID可能不太一樣,不過一般gpt中的格式是在mbr格式的ID后加上兩位數的數值,如mbr中swap的類型ID為82,在gpt中則是8200,在mbr中linux filesystem類型的ID為83,在gpt中則為8300,在mbr中lvm的ID為8e,在gpt中為8e00。

(2).格式化為swap分區:mkswap

[root@xuexi ~]# mkswap /dev/sdb5
Setting up swapspace version 1, size = 1951096 KiB
no label, UUID=02e5af44-2a16-479d-b689-4e100af6adf5

(3).加入swap分區空間(swapon):

[root@xuexi ~]# swapon /dev/sdb5  

[root@xuexi ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          1861        343       1517          0         16        196
-/+ buffers/cache:        131       1730
Swap:         3953          0       3953

(4).取消swap分區空間(swapoff):

[root@xuexi ~]# swapoff /dev/sdb5

[root@xuexi ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          1861        343       1518          0         16        196
-/+ buffers/cache:        130       1731
Swap:            0          0          0

(5).開機自動加載swap分區:

修改/etc/fstab,加上一行。

/dev/sda3    swap    swap    defaults    0    0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM