測試環境為 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 都是可以的範圍.
整個架構就是將許多的 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).
我們直接進入 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