CentOS 8 – LVM (Logical Volume Manager)

Loading

測試環境為 CentOS8 / RHEL (Red Hat Enterprise Linux) x86_64 (虛擬機)

最近把作業系統換到 CentOS 8 ,使用了預設的磁區切割 (/home 佔去 80% 的空間,使用 LVM 分割),想說可以直接透過 LVM 把 /home 縮小, 把 / (Root) 放大,卻在縮小 /home 時遇到問題.

什麼是 LVM

傳統的硬碟空間在切割完時就決定了大小,如果要重新規劃必須將資料先備份下來,硬碟磁區重新切割才可能有改變原來的硬碟磁區環境.透過 LVM (Logical Volume Manager) 就不同了,LVM 是一種可以動態變更 Volume 大小的方式 (由 LVM 所切割出來的空間稱為 Volume),它可以讓我們更容易管理硬碟空間.

如果磁區空間不夠了,我們可以把使用率低的磁區空間縮小再將空間不夠的磁區放大 (放大縮小時皆都不影響硬碟上的資料).

LVM 說明:

  • Physical Volume (PV)
    這就是硬碟切割出來的實體 Partition (/dev/sdb1,/dev/sdc1)
  • volume group (VG)
    接下來再由多個(可以單一) PV (/dev/sdb1,/dev/sdc1) 的磁區再組合成一個虛擬的磁碟 ( /dev/volum00 ) ,使用上如同一般磁碟 ( /dev/sda) ,但不同於一般磁碟他是可以做縮放的.
  • Logical Volume (LV)
    由 VG 這個虛擬磁碟所切割出來的 Partition ( /dev/volum00/LVOL1 ) 使用時就如同一般磁區 ( /dev/sda1 ),但不同於一般磁區他是可以做縮放的.
  • Physical Extent (PE)
    PE 就如同是磁碟機在格式化時,每個 Block 的大小.而 PE 系統預設大小為 4M 而一個 VG 最多可以擁有 65534 個 PE ( LVM2 已經沒有這個限制了 ) ,所以當系統預設時,ㄧ個 VG 最大尺寸為 65534*4M 大概為256G.對於現在大硬碟 的狀況下很快就無法再延伸了.所以建議在設定PE時指定大小.除了預設的 4M 外只要是 2的倍數在 8k-16GB 都是可以的範圍.

LVM 的整個架構如下:
lvm00

整個架構就是將許多的 Partition (/dev/sdb1 /dev/sdc1) 組成一個虛擬的磁碟 (/dev/vg).之後就可以將它動態切割成你需要大小的 Partition(/dev/vg/lv1,/dev/vg/lv2).就可以像一般的 Partition 來使用.

回到剛剛 /home 無法縮小的問題.

參考官方文件說明: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_and_managing_logical_volumes/assembly_modifying-logical-volume-size-configuring-and-managing-logical-volumes

文件內提到縮小 LVM 可以使用 lvreduce ,但是 XFS 的檔案格式則無法縮小,剛好這一次的 CentOS 8 預設的檔案格式為 XFS ( 64 位元日誌檔案系統).

You can reduce the size of a logical volume with the lvreduce command.
Note

Shrinking is not supported on a GFS2 or XFS file system, so you cannot reduce the size of a logical volume that contains a GFS2 or XFS file system. 

只好先把 /home 磁區移除 (需先移除使用者 #userdel),並把它掛載在 / (Root) 下,再把這個磁區重新規劃.

[root@localhost ~]# df -h
Filesystem           Size  Used Avail Use% Mounted on
devtmpfs             1.9G     0  1.9G   0% /dev
tmpfs                1.9G     0  1.9G   0% /dev/shm
tmpfs                1.9G   18M  1.9G   1% /run
tmpfs                1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/mapper/cl-root   12G  3.8G  8.3G  32% /
/dev/sda1            190M  132M   45M  75% /boot
tmpfs                376M   32K  376M   1% /run/user/42
tmpfs                376M  3.5M  373M   1% /run/user/0
/dev/sr0             6.7G  6.7G     0 100% /run/media/root/CentOS-8-BaseOS-x86_64

[root@localhost ~]# fdisk -l
Disk /dev/sda: 20 GiB, 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
Disklabel type: dos
Disk identifier: 0x670bc78e

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sda1  *        2048   411647   409600  200M 83 Linux
/dev/sda2         411648 25585663 25174016   12G 8e Linux LVM
/dev/sda3       25585664 33974271  8388608    4G 82 Linux swap / Solaris

Disk /dev/mapper/cl-root: 12 GiB, 12884901888 bytes, 25165824 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

我的 /home 磁區已移除,下面是重新分割,並指定 Type 為 LVM (8e).

[root@localhost ~]# fdisk /dev/sda

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): n
Partition type
   p   primary (3 primary, 0 extended, 1 free)
   e   extended (container for logical partitions)
Select (default e): p

Selected partition 4
First sector (33974272-41943039, default 33974272): 
Last sector, +sectors or +size{K,M,G,T,P} (33974272-41943039, default 41943039): 

Created a new partition 4 of type 'Linux' and of size 3.8 GiB.

Command (m for help): t
Partition number (1-4, default 4): 4
Hex code (type L to list all codes): L

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        
 1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden or  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx         
 5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data    
 6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility   
 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt         
 9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access     
 a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O        
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor      
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi ea  Rufus alignment
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         eb  BeOS fs        
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ee  GPT            
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        ef  EFI (FAT-12/16/
11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f0  Linux/PA-RISC b
12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f1  SpeedStor      
14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f4  SpeedStor      
16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      f2  DOS secondary  
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fb  VMware VMFS    
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fc  VMware VMKCORE 
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fd  Linux raid auto
1c  Hidden W95 FAT3 75  PC/IX           bc  Acronis FAT32 L fe  LANstep        
1e  Hidden W95 FAT1 80  Old Minix       be  Solaris boot    ff  BBT            
Hex code (type L to list all codes): 8e

Changed type of partition 'Linux' to 'Linux LVM'.

Command (m for help): w
The partition table has been altered.
Syncing disks.

[root@localhost ~]# fdisk -l
Disk /dev/sda: 20 GiB, 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
Disklabel type: dos
Disk identifier: 0x670bc78e

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sda1  *        2048   411647   409600  200M 83 Linux
/dev/sda2         411648 25585663 25174016   12G 8e Linux LVM
/dev/sda3       25585664 33974271  8388608    4G 82 Linux swap / Solaris
/dev/sda4       33974272 41943039  7968768  3.8G 8e Linux LVM

Disk /dev/mapper/cl-root: 12 GiB, 12884901888 bytes, 25165824 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

前面有提到 LVM 的架構,須先加入新的 PV (透過指令 pvcreate) ,把這一個 PV 加到需要放大的 VG (透過指令 vgextend),最後透過指令 lvresize 動態放大 / (Root) 的 LV ( /dev/cl/root).
lvm00

我們直接進入 lvm 的指令模式來把新的 sda4 磁區的空間給 / (Root : /dev/cl/root ) 來使用.

[root@localhost ~]# lvm
lvm> pvscan
  PV /dev/sda2   VG cl              lvm2 [12.00 GiB / 0    free]
  Total: 1 [12.00 GiB] / in use: 1 [12.00 GiB] / in no VG: 0 [0   ]
lvm> pvcreate /dev/sda4
  Physical volume "/dev/sda4" successfully created.
lvm> pvscan
  PV /dev/sda2   VG cl              lvm2 [12.00 GiB / 0    free]
  PV /dev/sda4                      lvm2 [<3.80 GiB]
  Total: 2 [<15.80 GiB] / in use: 1 [12.00 GiB] / in no VG: 1 [<3.80 GiB]
lvm> vgextend cl /dev/sda4
  Volume group "cl" successfully extended
lvm> lvscan                              
  ACTIVE            '/dev/cl/root' [12.00 GiB] inherit

可以指定大小 -l 15G 或是 剩餘空間全部 -l +100%FREE .

lvm> lvextend -l 15G /dev/cs/root

除了可以使用 lvextend 也可以用 lvresize

lvm> lvresize -l 15G /dev/cl/root -r
  Size of logical volume cl/root changed from 12.00 GiB (3072 extents) to 15.00 GiB (3840 extents).
  Logical volume cl/root successfully resized.
meta-data=/dev/mapper/cl-root    isize=512    agcount=4, agsize=786432 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=3145728, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 3145728 to 3932160
lvm> lvscan
  ACTIVE            '/dev/cl/root' [15.00 GiB] inherit
lvm> exit
  Exiting.

這樣就完成了.

[root@localhost ~]# df -h
Filesystem           Size  Used Avail Use% Mounted on
devtmpfs             1.9G     0  1.9G   0% /dev
tmpfs                1.9G     0  1.9G   0% /dev/shm
tmpfs                1.9G   18M  1.9G   1% /run
tmpfs                1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/mapper/cl-root   15G  3.9G   12G  26% /
/dev/sda1            190M  132M   45M  75% /boot
tmpfs                376M   32K  376M   1% /run/user/42
tmpfs                376M  3.5M  373M   1% /run/user/0
/dev/sr0             6.7G  6.7G     0 100% /run/media/root/CentOS-8-BaseOS-x86_64
沒有解決問題,試試搜尋本站其他內容

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料