縮小或擴大linux ext4文件系統(包含在線擴大根文件系統步驟)
概念
一般而言,我們喜歡把分區和文件系統混為一談,實際上,它們是有區別的。它們的關系是:文件系統是建立在分區上的,分區大小要大于等于文件系統大?。ň拖袢萜骱蜕匙樱萜黧w積要大于等于沙子體積)。
縮小分區的操作步驟是:先縮小文件系統,然后再縮小分區。
擴大分區的操作步驟是:先擴大分區,然后再擴大文件系統。
起因
我的樹莓派U盤有128G大小,里面安裝了Raspi OS,已經有兩個分區,第二個分區是根分區?,F在我把第二分區縮小成30GB,然后將多余的容量用于創建一個exfat的分區,用于windows。
后文包含的內容:
- 離線縮小根分區上的文件系統
需要把待縮容的磁盤插到一個已啟動的linux系統 - 在線擴大根分區上的文件系統
此時待擴容的磁盤上的linux系統已啟動,根分區已掛載至/
后文未包含的內容:
- 在線縮小根分區上的文件系統
操作很麻煩,只介紹原理:因為在掛載狀態下,使用resize2fs命令是不允許縮小文件系統的。如果沒有另一個Linux系統可用的情況下,想要在線縮小根分區文件系統大小,可以使用initram hook形式來執行e2fsck和resize2fs。因為此時操作系統啟動過程還處于initram階段,根文件系統還沒有掛載。
離線縮小根分區上的文件系統操作步驟
步驟簡述:
- 查看分區情況
- 縮小第二分區上的文件系統
- 使用fdisk或parted命令縮小第二分區
- 驗證結果
1. 查看分區情況
root用戶執行:fdisk -l /dev/sdb # 注意fdisk只能支持MBR分區表,parted支持MBR/GPT分區表,如果你的磁盤是GPT的,可以使用parted命令: parted /dev/sdb unit s p (unit s表示按扇區查看)
回顯如下:
Disk /dev/sdb: 115.5 GiB, 124017180672 bytes, 242221056 sectors ### 該磁盤大小115GB多點
Disk model: DataTraveler 3.0
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: 0xdf3f5459
Device Boot Start End Sectors Size Id Type
/dev/sdb1 16384 1064959 1048576 512M c W95 FAT32 (LBA)
/dev/sdb2 1064960 242221055 241156096 115G 83 Linux ### 第二分區大小115G, 注意起始扇區 1064960, 后面會用到 ###
root用戶執行:dd if=/dev/sdb of=/root/first-16384-sector.dd count=16384 # 備份分區表,此步非必須,只是為了以防萬一,可以用dd命令恢復分區表。備份分區表(這里直接備份前16384個扇區,MBR分區表存在于第一個扇區,我這里備份冗余了一點,數字16384可參考前面fdisk命令)。
回顯如下:
16384+0 records in
16384+0 records out
8388608 bytes (8.4 MB, 8.0 MiB) copied, 0.456542 s, 18.4 MB/s
2. 縮小第二分區上的文件系統
root用戶執行:e2fsck -f /dev/sdb2 # 先強制檢查文件系統,注意-f選項
回顯如下:
e2fsck 1.47.0 (5-Feb-2023)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
rootfs: 61657/3816960 files (0.2% non-contiguous), 786615/15728640 blocks
root用戶執行:resize2fs /dev/sdb2 30720M # 改第二分區的文件系統大小為30G
回顯如下:
resize2fs 1.47.0 (5-Feb-2023)
Resizing the filesystem on /dev/sdb2 to 7864320 (4k) blocks.
3. 縮小第二分區
分別用fdisk和parted兩種方法演示。fdisk命令步驟比較多,parted命令只需要一條命令。
下面的操作是fdisk的縮小第二分區的操作方法,有點繁瑣。
fdisk /dev/sdb # 注意,這里是sdb不是sdb2,下面進入fdisk操作界面
Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p ### p命令查看當前分區情況 ###
Disk /dev/sdb: 115.5 GiB, 124017180672 bytes, 242221056 sectors
Disk model: DataTraveler 3.0
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: 0xdf3f5459
Device Boot Start End Sectors Size Id Type
/dev/sdb1 16384 1064959 1048576 512M c W95 FAT32 (LBA)
/dev/sdb2 1064960 242221055 241156096 115G 83 Linux
Command (m for help): d ### d命令用于刪除分區 ###
Partition number (1,2, default 2): 2 ### 刪除第二分區 ###
Partition 2 has been deleted.
Command (m for help): n ### n命令新建分區 ###
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p ### 分區類型是p, 也就是主分區 ###
Partition number (2-4, default 2): 2 ### 分區號是2,第二個分區, 具體是第幾個分區,可以看前面的1. 查看分區情況步驟的fdisk -l命令輸出###
First sector (2048-242221055, default 2048): 1064960 ### 分區的起始扇區的值,其值參考第一步的值 ###
Last sector, +/-sectors or +/-size{K,M,G,T,P} (1064960-242221055, default 242221055): +32768M ### 分區的末尾值,這里使用32GB,為了安全起見,比前面的30GB大一點 ###
Created a new partition 2 of type 'Linux' and of size 32 GiB.
Partition #2 contains a ext4 signature.
Do you want to remove the signature? [Y]es/[N]o: n ### 是否移除簽名, ??!注意這里選擇“否”,不移除ext4簽名 ??!**
Command (m for help): p ### 查看新分區情況 ###
Disk /dev/sdb: 115.5 GiB, 124017180672 bytes, 242221056 sectors
Disk model: DataTraveler 3.0
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: 0xdf3f5459
Device Boot Start End Sectors Size Id Type
/dev/sdb1 16384 1064959 1048576 512M c W95 FAT32 (LBA)
/dev/sdb2 1064960 68173823 67108864 32G 83 Linux
Command (m for help): w ### w命令寫入變更 ###
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
下面是parted命令縮小第二分區的操作過程
簡潔版就是直接修改分區大小,只有一條命令:parted /dev/sdb resizepart 2 33313M # 這里的33313MB大致是:第二分區之前的空間+32GB=33313M
繁瑣版本是先刪除第二分區,再建立一個新分區,操作如下:
root@raspberrypi:~# parted /dev/sdb
GNU Parted 3.5
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p ### p命令查看當前分區情況 ###
Model: Kingston DataTraveler 3.0 (scsi)
Disk /dev/sdb: 124GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 8389kB 545MB 537MB primary fat32 lba
2 545MB 124GB 123GB primary ext4
(parted) rm 2 ### rm命令刪除分區,刪除第二分區 ###
(parted) mkpart primary ext4 1064960s 33313M ### 新建第二分區,分區開始于第1064960扇區, 結束于32G+545MB(545M是第1分區末尾所在位置) ###
(parted) p ### p命令查看新分區情況 ###
Model: Kingston DataTraveler 3.0 (scsi)
Disk /dev/sdb: 124GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 8389kB 545MB 537MB primary fat32 lba
2 545MB 33.3GB 32.8GB primary ext4 lba
(parted) quit ### quit命令退出parted ###
Information: You may need to update /etc/fstab.
4. 驗證新文件系統
使用e2fsck -f /dev/sdb2命令檢查新的第二分區上的文件系統,結果沒有報錯。lsblk命令查看,發現分區大小32GB, mount掛載后,發現能正常掛載,使用df -h命令查看文件系統大小是30GB。這里文件系統比分區
大小小了2GB,那么可以umount卸載分區,使用e2fsck -f /dev/sdb2強制檢查文件系統,執行resize2fs /dev/sdb2(注意,此處resize2fs后面不帶數字),最后就發現文件系統大小就和分區大小一樣大了。
在線擴大根分區上的文件系統操作步驟
直接上命令:
root用戶執行:lsblk # lsblk命令查看分區情況
回顯如下:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 1 15.2G 0 disk ### U盤總大小接近15.2GB,注意lsblk命令查看的結果和parted命令查看的空間大小是有一定的差別的,估計是1000和1024進位的差別。
├─sda1 8:1 1 512M 0 part /boot/firmware
└─sda2 8:2 1 9.5G 0 part / ### 可見此時sda2是掛載了/分區,分區大小9.5GB,和前面第一分區加起來才10GB,說明此U盤后面有大概5G左右是自由空間。
root用戶執行:parted /dev/sda ### 下面進入parted操作
GNU Parted 3.5
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit MB ### unit命令設置單位為MB
(parted) p ### p命令查看分區情況
Model: Lenovo USB Flash Drive (scsi)
Disk /dev/sda: 16359MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 8.39MB 545MB 537MB primary fat32 lba
2 545MB 10785MB 10240MB primary ext4 ### 根分區大小約10GB
(parted) resizepart 2 16359MB ### resizepart命令變更分區大小,這里將第二分區的末尾設置成U盤大小,16359MB這個數字出現在本段落前面的p命令的回顯結果中,當然也可以使用100%來代替這個數字。
Warning: Partition /dev/sda2 is being used. Are you sure you want to continue?
Yes/No? yes ### 警告,我們這里輸入yes
(parted) q ### q命令退出parted操作界面
Information: You may need to update /etc/fstab.
至此,第二分區的分區大小已經擴至可用空間的最大值,接下來還需要使用resize2fs命令把文件系統擴至最大可用之空間。
root用戶執行:resize2fs /dev/sda2 ### resize2fs不帶數字參數,則文件系統擴容成最大可用空間
回顯如下:
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/sda2 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/sda2 is now 3860720 (4k) blocks long.
root用戶執行:lsblk # lsblk查看分區大小。
回顯如下:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 1 15.2G 0 disk
├─sda1 8:1 1 512M 0 part /boot/firmware
└─sda2 8:2 1 14.7G 0 part / ### 現在兩個分區加起來就是15GB多點了。
root用戶執行:df -h |grep '^/' # df查看文件系統大小, 兩個分區加起來也15GB多
/dev/sda2 15G 2.2G 12G 16% /
/dev/sda1 510M 66M 445M 13% /boot/firmware
在線擴大根分區上的文件系統大小的操作至此結束
關于fdisk和parted
- fdisk命令只支持MBR分區表,小于2TB的磁盤,只要不執行w命令,變更就不會生效。parted命令支持GPT和MBR分區表,支持大于2TB的磁盤,操作是實時生效的,每個操作都要謹慎。
- parted指定的大小可能會出入很大,比如我在parted命令下使用mkpart primary ext4 60G, 結果生效后,lsblk查看只有大概55GB。為了避免這個情況,我一般使用MB為單位,或者使用帶小數點的值。
本博文是作者“進取有樂”原創,僅發布于博客園,其他網站轉載請注明出處。
浙公網安備 33010602011771號