一送矩、設(shè)備文件
在 Linux 操作系統(tǒng)中,設(shè)備文件是一種特殊類型的文件哪替。這些文件絕大多數(shù)位于 /dev
目錄下栋荸,用來表示 Linux 主機檢測到的某個具體的硬件設(shè)備。
比如 /dev/sda
文件通常用來指代系統(tǒng)中的第一塊硬盤凭舶。
Linux 操作系統(tǒng)及其應用與服務則通過這些設(shè)備文件與對應的硬件設(shè)備進行交互晌块。
對于常見的磁盤(ATA、SATA帅霜、SCSI匆背、SAS、SSD 等)和優(yōu)盤等塊存儲設(shè)備身冀,其設(shè)備文件主要以 sd*
的形式命名钝尸。如 sda
表示第一塊硬盤,sdb2
表示第二塊硬盤的第二個分區(qū)搂根,以此類推珍促。
因此,可直接使用 ls -l /dev/sd*
命令查看系統(tǒng)中的磁盤設(shè)備:
$ ls -l /dev/sd*
brw-rw---- 1 root disk 8, 0 8月 7 00:47 /dev/sda
brw-rw---- 1 root disk 8, 1 8月 7 00:47 /dev/sda1
即當前系統(tǒng)中只連接了一塊硬盤(/dev/sda
)剩愧,且該硬盤只有一個分區(qū)(/dev/sda1
)猪叙。
二、分區(qū)
分區(qū)可以理解為將一整塊硬盤劃分為一個或多個相互獨立的存儲區(qū)域隙咸。
比如可以將系統(tǒng)的第一塊硬盤劃分為 3 個分區(qū)沐悦,分別為 sda1、sda2五督、sda3 藏否。sda1 用于掛載根目錄(/
),sda2 掛載 /var
充包,sda3 掛載 /home
目錄副签。則即使 /var
目錄下的日志文件等占用了 sda2 全部的存儲空間遥椿,也不會影響其他兩個分區(qū)的使用。
可以使用 fdisk -l
命令查看系統(tǒng)中的磁盤和分區(qū)信息:
$ sudo fdisk -l
Disk /dev/sda: 10 GiB, 10737418240 bytes, 20971520 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x20985120
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 20964824 20962777 10G 83 Linux
創(chuàng)建磁盤分區(qū)
fdisk
命令還可以用來對硬盤進行分區(qū)操作淆储,包括創(chuàng)建新分區(qū)冠场、刪除已有的分區(qū)、創(chuàng)建分區(qū)表等本砰。
我這里通過 VirtualBox 軟件為虛擬機中的 Linux 系統(tǒng)添加了一塊空白的虛擬硬盤碴裙。使用 fdisk -l
命令查看系統(tǒng)檢測到的硬盤設(shè)備:
$ sudo fdisk -l
Disk /dev/sda: 10 GiB, 10737418240 bytes, 20971520 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x20985120
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 20964824 20962777 10G 83 Linux
Disk /dev/sdb: 5 GiB, 5368709120 bytes, 10485760 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
此時系統(tǒng)中多了一塊不包含任何分區(qū)的新硬盤 /dev/sdb
。
使用 fdisk /dev/sdb
命令對新硬盤進行分區(qū)操作:
$ sudo fdisk /dev/sdb
Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xce119026.
Command (m for help): m
Help:
DOS (MBR)
a toggle a bootable flag
b edit nested BSD disklabel
c toggle the dos compatibility flag
Generic
d delete a partition
F list free unpartitioned space
l list known partition types
n add a new partition
p print the partition table
t change a partition type
v verify the partition table
i print information about a partition
Misc
m print this menu
u change display/entry units
x extra functionality (experts only)
Script
I load disk layout from sfdisk script file
O dump disk layout to sfdisk script file
Save & Exit
w write table to disk and exit
q quit without saving changes
Create a new label
g create a new empty GPT partition table
G create a new empty SGI (IRIX) partition table
o create a new empty DOS partition table
s create a new empty Sun partition table
進入 fdisk 程序界面之后点额,按下 m
鍵并回車舔株,即可打印幫助信息,獲取該界面下支持的交互式命令还棱。
比如輸入 p
可以用來輸出當前硬盤的分區(qū)信息载慈,輸入 n
創(chuàng)建新的分區(qū),輸入 d
刪除已有的分區(qū)珍手。
在對分區(qū)進行任何操作之后办铡,最后都需要使用 w
將之前的所有更改寫入硬盤。
這里先按下 n
開始新分區(qū)的創(chuàng)建琳要,根據(jù)提示選擇分區(qū)類型(p
表示主分區(qū)寡具,e
表示擴展分區(qū)),進一步選擇分區(qū)編號和第一個扇區(qū)的位置(一般默認即可)焙蹭,最后輸入新分區(qū)中最后一個扇區(qū)的位置(也可以直接指定分區(qū)大猩硅尽),格式為 +/-sectors
或 +/-size
孔厉。如輸入 +3G
則表示創(chuàng)建大小為 3 GB 的新分區(qū)。具體步驟如下:
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-10485759, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-10485759, default 10485759): +3G
Created a new partition 1 of type 'Linux' and of size 3 GiB.
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2):
First sector (6293504-10485759, default 6293504):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (6293504-10485759, default 10485759):
Created a new partition 2 of type 'Linux' and of size 2 GiB.
再用同樣的步驟將磁盤的剩余空間劃分為另一個分區(qū)帖努。此時查看分區(qū)信息撰豺,原本空白的 5GB 新硬盤 sdb 已經(jīng)被劃分為兩個分區(qū) sdb1 和 sdb2 :
Command (m for help): p
Disk /dev/sdb: 5 GiB, 5368709120 bytes, 10485760 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xce119026
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 6293503 6291456 3G 83 Linux
/dev/sdb2 6293504 10485759 4192256 2G 83 Linux
需要注意的是,如果此時按下 q
按鍵直接退出 fdisk 程序拼余,則之前所做的全部操作都不會被保存污桦。
如確認前面對硬盤的操作沒有問題,應使用 w
命令將新的分區(qū)信息寫入到磁盤中匙监。類似于編輯文件時的保存并退出凡橱。
三、文件系統(tǒng)
可以將磁盤等存儲設(shè)備看作一個小型的圖書館亭姥,存放在其中的書籍即硬盤中的數(shù)據(jù)稼钩,而分區(qū)的作用類似于對書籍分門類存放的書架,形成相對獨立的區(qū)域达罗。
但是書架上的書籍并不是隨意放置的坝撑,每本書都需要根據(jù)一定的規(guī)則和順序有規(guī)律地擺放静秆,有時還要記錄下擺放的具體位置。這些書籍的擺放規(guī)則即對應于分區(qū)上的文件系統(tǒng)巡李。
文件系統(tǒng)是對存儲設(shè)備的空間進行組織和分配抚笔,負責文件存取并對存入的文件進行保護和檢索的系統(tǒng)。對操作系統(tǒng)而言侨拦,文件的讀寫不會直接作用于硬盤扇區(qū)殊橙,而是通過文件系統(tǒng)以特定的規(guī)則處理和組織文件數(shù)據(jù)。
常見的文件系統(tǒng)如 Windows 中的 NTFS 和 Linux 系統(tǒng)中 Ext4 等狱从。
在 Windows 系統(tǒng)中膨蛮,通常所說的“分區(qū)”操作即包含了創(chuàng)建分區(qū)并建立文件系統(tǒng)的過程。而在 Linux 系統(tǒng)中矫夯,這兩步操作則需要兩個獨立的命令完成鸽疾。
可以使用 mkfs.ext4 /dev/sdb1
命令,在之前新加硬盤的第一個分區(qū)上創(chuàng)建 Ext4 格式的文件系統(tǒng)训貌。
$ sudo mkfs.ext4 /dev/sdb1
mke2fs 1.44.6 (5-Mar-2019)
Creating filesystem with 786432 4k blocks and 196608 inodes
Filesystem UUID: d5e21599-12e9-44da-ae51-124d89fe5eda
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
交換分區(qū)
Linux 系統(tǒng)中的 swap 分區(qū)可以看作位于硬盤上的“內(nèi)存設(shè)備”制肮。Linux 會將內(nèi)存中一部分不需要立即使用的數(shù)據(jù)臨時交換至硬盤上的 swap 分區(qū),以緩解內(nèi)存不足等情況递沪。
我的 Linux 虛擬機安裝時并沒有分配 swap 分區(qū)豺鼻,這里通過 mkswap
命令將 2G 大小的 sdb2
分區(qū)劃分為 swap 空間:
$ sudo mkswap /dev/sdb2
Setting up swapspace version 1, size = 2 GiB (2146430976 bytes)
no label, UUID=47006330-810c-4321-8d73-d52a5f70bc88
然后使用 swapon
命令立即啟用前面創(chuàng)建的 swap 分區(qū):
$ sudo swapon /dev/sdb2
$ free -h
total used free shared buff/cache available
Mem: 983Mi 223Mi 168Mi 4.0Mi 590Mi 597Mi
Swap: 2.0Gi 0B 2.0Gi
分區(qū)掛載
在 Windows 系統(tǒng)中,一般插入一個已經(jīng)分好區(qū)的硬盤或優(yōu)盤之后款慨,會自動為添加的一個或多個分區(qū)分配盤符(如 D:儒飒、E:、F: 等)檩奠,之后就可以直接通過盤符在新分區(qū)上讀取或?qū)懭胛募恕?/p>
Linux 系統(tǒng)中沒有盤符的概念桩了,它的文件層次是一個從根目錄(/
)開始的樹狀結(jié)構(gòu)(目錄),一直向下延申埠戳,每一個分支都是一條具體的路徑井誉,指向某個特定的文件。比如 /usr
整胃、/root
颗圣、/var
、/var/log
等屁使。
目錄可以說是獨立于硬件存儲設(shè)備的抽象的邏輯結(jié)構(gòu)在岂,用于指定文件系統(tǒng)層次中的某個具體位置。而磁盤分區(qū)與目錄結(jié)構(gòu)的對應關(guān)系蛮寂,則需要通過掛載來指定蔽午。
一般在安裝系統(tǒng)時,可以將 sda1 分區(qū)掛載到根目錄下共郭,則該目錄下的所有文件之后都將保存在 sda1 上祠丝。如果后面又添加了一塊新的數(shù)據(jù)盤 sdb疾呻,該硬盤只有一個分區(qū) sdb1。為了將某些文件保存在 sdb1 分區(qū)上写半,可以在目錄樹中新建一個空白分支(比如 /mnt/data
)并將 sdb1 掛載在該分支下岸蜗。之后 /mnt/data
目錄下創(chuàng)建的任何子目錄和文件等數(shù)據(jù)都會保存在 sdb1 上。
具體命令如下:
$ sudo mkdir -p /mnt/data
$ sudo mount /dev/sdb1 /mnt/data
使用 df -h
命令查看文件系統(tǒng)占用的磁盤空間的具體情況:
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 456M 0 456M 0% /dev
tmpfs 99M 1.1M 98M 2% /run
/dev/sda1 9.8G 5.2G 4.2G 56% /
tmpfs 492M 0 492M 0% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 492M 0 492M 0% /sys/fs/cgroup
tmpfs 99M 0 99M 0% /run/user/117
tmpfs 99M 0 99M 0% /run/user/1000
/dev/sdb1 2.9G 9.0M 2.8G 1% /mnt/data
可以看到新添加的分區(qū) /dev/sdb1 已經(jīng)掛載到 /mnt/data 目錄下了叠蝇。
或者也可以使用 lsblk
命令查看塊存儲設(shè)備(即磁盤和分區(qū))的容量和掛載點:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 10G 0 disk
└─sda1 8:1 0 10G 0 part /
sdb 8:16 0 5G 0 disk
├─sdb1 8:17 0 3G 0 part /mnt/data
└─sdb2 8:18 0 2G 0 part [SWAP]
sr0 11:0 1 1024M 0 rom
需要注意的是璃岳,手動掛載的分區(qū)在系統(tǒng)重啟以后會自動卸載。如果想像根目錄那樣悔捶,每次系統(tǒng)啟動時自動掛載分區(qū)铃慷,可以修改 /etc/fstab
配置文件,示例內(nèi)容如下:
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=f3435713-b2cd-4196-b07b-2ffb116a028d / ext4 defaults 0 1
/dev/sdb1 /mnt/data ext4 defaults 0 1
/dev/sdb2 none swap sw 0 0
PS:相對于
/dev/sda1
這種形式蜕该,使用 UUID 掛載分區(qū)往往更保險一點犁柜,可以通過blkid
命令查看磁盤分區(qū)的 UUID:
$ sudo blkid
/dev/sda1: UUID="f3435713-b2cd-4196-b07b-2ffb116a028d" TYPE="ext4" PARTUUID="20985120-01"
/dev/sdb1: UUID="d5e21599-12e9-44da-ae51-124d89fe5eda" TYPE="ext4" PARTUUID="ce119026-01"
/dev/sdb2: UUID="47006330-810c-4321-8d73-d52a5f70bc88" TYPE="swap" PARTUUID="ce119026-02"
四、LVM(邏輯卷管理)
對于不包含邏輯卷管理(LVM)的磁盤分區(qū)方案堂淡,分區(qū)的位置馋缅、大小和數(shù)量一般都是固定的,從而導致擴展當前分區(qū)和添加新分區(qū)等操作變得困難绢淀。
此時若添加額外的硬盤和分區(qū)萤悴,則需要在目錄樹中創(chuàng)建新的分支作為掛載點,文件數(shù)據(jù)分散到多個復雜的位置上皆的,不便于合并覆履、備份和管理數(shù)據(jù)。
LVM 允許將單個或多個分區(qū)合并為一個邏輯卷組费薄,且其中包含的邏輯卷可以動態(tài)地添加硝全、改變大小或刪除。
LVM 系統(tǒng)最底層為物理卷(pv)楞抡,即磁盤柳沙、分區(qū)和 RAID 陣列等。物理卷可以用來創(chuàng)建邏輯卷組(vg)拌倍,而邏輯卷組又可以包含任意數(shù)量的邏輯卷(lv),邏輯卷從功能上即對應于物理磁盤上的分區(qū)噪径。
創(chuàng)建卷組和邏輯卷
可以使用 pvcreate
命令將某個存儲設(shè)備(磁盤或分區(qū)等)標記為物理卷柱恤。
這里我通過 VirtualBox 添加了另一塊大小為 5G 的空白的虛擬硬盤,系統(tǒng)檢測到該設(shè)備為 /dev/sdc :
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 10G 0 disk
└─sda1 8:1 0 10G 0 part /
sdb 8:16 0 5G 0 disk
├─sdb1 8:17 0 3G 0 part /mnt/data
└─sdb2 8:18 0 2G 0 part [SWAP]
sdc 8:32 0 5G 0 disk
sr0 11:0 1 1024M 0 rom
創(chuàng)建物理卷:
$ sudo pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created.
通過 pvs
命令列出所有的物理卷:
$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/sdc lvm2 --- 5.00g 5.00g
通過 vgcreate
命令在物理卷的基礎(chǔ)上創(chuàng)建邏輯卷組:
$ sudo vgcreate data-volume /dev/sdc
Volume group "data-volume" successfully created
使用 vgs
命令列出當前所有的邏輯卷組:
$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
data-volume 1 0 0 wz--n- <5.00g <5.00g
使用 lvcreate
命令在卷組中創(chuàng)建邏輯卷:
$ sudo lvcreate --name data --size 2G data-volume
Logical volume "data" created.
訪問邏輯卷可以通過 /dev/mapper/<vgname>-<lvname>
或者 /dev/<vgname>/<lvname>
形式的路徑找爱,即剛剛創(chuàng)建的 data 邏輯卷可以通過 /dev/data-volume/data
指定梗顺。
在該邏輯卷上創(chuàng)建 Ext4 文件系統(tǒng):
$ sudo mkfs.ext4 /dev/data-volume/data
mke2fs 1.44.6 (5-Mar-2019)
Creating filesystem with 524288 4k blocks and 131072 inodes
Filesystem UUID: 0f24cdd8-62e0-42fd-bc38-aa3bce91e099
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
此時該邏輯卷即可掛載到某個目錄分支下像普通物理分區(qū)一樣正常使用了。
操作卷組和邏輯卷
可以使用 lvextend
命令動態(tài)地擴展邏輯卷的存儲空間:
$ sudo lvextend --size +2G --resizefs /dev/data-volume/data
fsck from util-linux 2.33.1
/dev/mapper/data--volume-data: clean, 11/131072 files, 26156/524288 blocks
Size of logical volume data-volume/data changed from 2.00 GiB (512 extents) to 4.00 GiB (1024 extents).
Logical volume data-volume/data successfully resized.
resize2fs 1.44.6 (5-Mar-2019)
Resizing the filesystem on /dev/mapper/data--volume-data to 1048576 (4k) blocks.
The filesystem on /dev/mapper/data--volume-data is now 1048576 (4k) blocks long.
其中 --size +2G
用于指定增加 2G 空間车摄,--resizefs
指定在擴展邏輯卷大小的同時擴充文件系統(tǒng)的大兴掳(文件系統(tǒng)默認不會隨邏輯卷的空間變化而自動擴展)仑鸥。
或者也可以直接指定擴展后的大小,如:
$ sudo lvextend --size 4G --resizefs /dev/data-volume/data
其他常用的命令比如通過 lvresize
命令擴展邏輯卷变屁,使其占用當前卷組中剩余的全部空間:
$ sudo lvresize -l +100%free /dev/data-volume/data
Size of logical volume data-volume/data changed from <3.00 GiB (767 extents) to <5.00 GiB (1279 extents).
Logical volume data-volume/data successfully resized.
因為上面的命令沒有加上 --resizefs
或者 -r
選項眼俊,因此文件系統(tǒng)不會隨著邏輯卷自動擴展大小,可以通過 resize2fs
命令手動擴展文件系統(tǒng):
$ sudo resize2fs /dev/data-volume/data
假設(shè)一段時間以后粟关,邏輯卷 /dev/data-volume/data 的空間即將被數(shù)據(jù)填滿疮胖,可以嘗試添加另一塊硬盤 sdd
:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 10G 0 disk
└─sda1 8:1 0 10G 0 part /
sdb 8:16 0 5G 0 disk
├─sdb1 8:17 0 3G 0 part /mnt/data
└─sdb2 8:18 0 2G 0 part [SWAP]
sdc 8:32 0 5G 0 disk
└─data--volume-data 253:0 0 5G 0 lvm
sdd 8:48 0 5G 0 disk
sr0 11:0 1 1024M 0 rom
使用 pvcreate
命令創(chuàng)建物理卷:
$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/sdc data-volume lvm2 a-- <5.00g 0
/dev/sdd lvm2 --- 5.00g 5.00g
使用 vgextend
命令將該物理卷添加到之前創(chuàng)建的卷組 data-volume
中:
$ sudo vgextend data-volume /dev/sdd
Volume group "data-volume" successfully extended
$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
data-volume 2 1 0 wz--n- 9.99g <5.00g
此時的 data-volume 卷組包含了兩個物理卷(/dev/sdc
和 /dev/sdd
)和一個邏輯卷(/dev/data-volume/data
),總大小變?yōu)?10G闷板,閑置空間為 5G(即剛剛添加的物理卷)澎灸。
最后使用 lvresize
命令擴展邏輯卷大小,使其占據(jù)兩個物理卷的全部存儲空間:
$ sudo lvresize -l +100%free -r /dev/data-volume/data
fsck from util-linux 2.33.1
/dev/mapper/data--volume-data: clean, 11/196608 files, 30268/785408 blocks
Size of logical volume data-volume/data changed from <5.00 GiB (1279 extents) to 9.99 GiB (2558 extents).
Logical volume data-volume/data successfully resized.
resize2fs 1.44.6 (5-Mar-2019)
Resizing the filesystem on /dev/mapper/data--volume-data to 2619392 (4k) blocks.
The filesystem on /dev/mapper/data--volume-data is now 2619392 (4k) blocks long.
此時邏輯卷 /dev/data-volume/data 的大小擴展為 10G遮晚,即占用了整個卷組 data-volume(包含兩個 5G 的物理卷)的全部空間性昭。
總結(jié):LVM 卷組(vg)的作用類似于物理磁盤,用于承載邏輯卷(lv)县遣。卷組可以由多個物理卷(磁盤或分區(qū)等)構(gòu)成糜颠,空間不夠時也可以隨時添加新的物理卷進行擴展。
而卷組上的邏輯卷(lv)類似于磁盤分區(qū)艺玲,可以掛載到目錄作為存儲空間括蝠。但是物理分區(qū)的位置和大小固定,而邏輯卷則可以在卷組的基礎(chǔ)上動態(tài)的改變大小饭聚,甚至跨越多個物理磁盤和分區(qū)忌警,使得管理起來更加方便和靈活。
常用 LVM 命令列表:
Command | Used For |
---|---|
pvcreate | Labeling devices for use with LVM |
pvremove | Removing the LVM label from a physical volume |
pvdisplay / pvs | Displaying information on the specified device or all physical volumes on the system |
vgcreate | Creating a new volume group |
vgremove | Removing (deleting) a volume group |
vgextend | Adding physical volumes to a volume group |
vgreduce | Removing physical volumes from a volume group |
vgdisplay / vgs | Displaying information about the specified group or all volume groups on the system |
lvcreate | Creating a new logical volume |
lvremove | Removing (deleting) a logical volume |
lvextend | Increasing the size of a logical volume |
lvreduce | Decreasing the size of a logical volume |
lvdisplay / lvs | Displaying all logical volumes on the system or in a specified volume group |