Hướng dẫn Resize RootFS OpenWRT (Expand root) áp dụng cho ext4, squashfs
Khi flash OpenWRT vào các bộ nhớ như MicroSD hoặc USB (RaspberryPi, NanoPi, OrangePI…) thì OpenWRT chỉ sử dụng một phần của bộ nhớ trên thẻ hoặc USB
Kể cả khi bộ nhớ USB hoặc MicroSD có dung lượng lớn như 32Gb hoặc 64Gb… thì OpenWRT cũng chỉ sử dụng đâu đó khoảng vài trăm MB.
Điều này sẽ khiến bạn không thể tận dụng tối đa bộ nhớ để cài các package bổ sung hoặc các ứng dụng yêu cầu nhiều bộ nhớ như Docker, PassWall…
Bài viết này sẽ hướng dẫn các bạn mở rộng bộ nhớ rootfs của Openwrt để tận dụng tối đa dung lượng SDcard hoặc USB
- Có 2 cách để Resize Rootfs.
- Cách 1 là dùng script tự động, được openwrt hướng dẫn, áp dụng được cho ext4 và squashfs.
- Cách 2 là làm thử công áp dụng với ext4 dành cho các bạn chạy script bị lỗi hoặc muốn chắc chắn từng bước
Cách 2 có tham khảo quá trình làm của thành viên jeremienguyen diễn đàn VOZ.VN
- Thiết bị bạn ấy sử dụng là NanoPi R2S
- Với thẻ SDcard 32Gb
- Filesystem sử dụng là EXT4
- Sử dụng PuTTY hoặc các SSH client khác để đăng nhập OpenWRT SSH
- Kết nối Router với Internet trước khi làm
Khác biệt cơ bản giữa EXT4 với SquashFS là gì?
- Đầu tiên và cơ bản nhất đó là SquashFS là Filesystem chỉ đọc (READONLY) trong khi đó EXT4 có thể ĐỌC-GHI (READ-WRITE)
- Hiểu nôm na thì khi sủ dụng phân vùng SquashFS lúc boot lên, toàn bộ rootfs sẽ được mount qua một lớp Filesystem khác gọi là OverlayFS (FS này có 2 lớp, lớp dưới chỉ đọc và lớp trên là đọc-ghi), khi các bạn chỉnh sửa hay xóa file trong hệ thống thì nó chỉ ghi vào lớp trên. Nếu reset về mặc định thì lớp trên bị xóa đi, tất cả mọi thứ sẽ trở về ban đầu nhờ có lớp dưới. Cũng có trường hợp không sử dụng OverlayFS thay vào đó là UBIFS… nhìn chung thì chúng ta không thể chỉnh sửa file trực tiếp lên phân vùng SquashFS
- Phân vùng EXT4 thì khác. Lúc boot, hệ thống sẽ sử dụng trực tiếp phân vùng EXT4. Điều này có nghĩa là khi bạn xóa hay chỉnh sửa một file, hệ thống sẽ đọc ghi trực tiếp lên phân vùng, kể cả sau khi reset thì bạn cũng không thể khôi phục nó về ban đầu. (Chỉ có cách là Flash lại toàn bộ hệ thống)
- Bởi vì SquashFS lúc boot sẽ phải mount qua 1 FS khác (OverlayFS) cho nên sẽ mất 1 vài giây or vài chục giây tùy vào dung lượng của phân vùng và tốc độ đọc ghi của bộ nhớ cho nên nó chỉ được sử dụng cho các system có dung lượng nhỏ và tốc độ đọc ghi trung bình (Nand, SPI…).
Cách 1 - Script tự động
- Chức năng của script:
- Hỗ trợ ext4 và squashfs.
- Tự động xác định phân vùng root và file hệ thống.
- Mở rộng phân vùng root sử dụng bộ nhớ còn trống.
- Script vẫn được giữ lại sau khi upgrade firmware.
- Tự động chạy sau khi upgdare firmware.
Đăng nhập SSH vào router sau đó chạy lệnh sau để tạo script (Copy toàn bộ script rồi dán vào Terminal)
cat << "EOF" > /etc/uci-defaults/70-rootpt-resizeif [ ! -e /etc/rootpt-resize ] \&& type parted > /dev/null \&& lock -n /var/lock/root-resizethenROOT_BLK="$(readlink -f /sys/dev/block/"$(awk -e \'$9=="/dev/root"{print $3}' /proc/self/mountinfo)")"ROOT_DISK="/dev/$(basename "${ROOT_BLK%/*}")"ROOT_PART="${ROOT_BLK##*[^0-9]}"parted -f -s "${ROOT_DISK}" \resizepart "${ROOT_PART}" 100%mount_root donetouch /etc/rootpt-resizerebootfiexit 1EOFcat << "EOF" > /etc/uci-defaults/80-rootfs-resizeif [ ! -e /etc/rootfs-resize ] \&& [ -e /etc/rootpt-resize ] \&& type losetup > /dev/null \&& type resize2fs > /dev/null \&& lock -n /var/lock/root-resizethenROOT_BLK="$(readlink -f /sys/dev/block/"$(awk -e \'$9=="/dev/root"{print $3}' /proc/self/mountinfo)")"ROOT_DEV="/dev/${ROOT_BLK##*/}"LOOP_DEV="$(awk -e '$5=="/overlay"{print $9}' \/proc/self/mountinfo)"if [ -z "${LOOP_DEV}" ]thenLOOP_DEV="$(losetup -f)"losetup "${LOOP_DEV}" "${ROOT_DEV}"firesize2fs -f "${LOOP_DEV}"mount_root donetouch /etc/rootfs-resizerebootfiexit 1EOFcat << "EOF" >> /etc/sysupgrade.conf/etc/uci-defaults/70-rootpt-resize/etc/uci-defaults/80-rootfs-resizeEOF
Sau khi chạy script bên trên, file 0-rootpt-resize sẽ được tạo ra ở thư mục etc/uci-defaults/
Chạy tiếp các lệnh sau
# Cài đặt các gói phần mềm cần thiết opkg update opkg install parted losetup resize2fs # Khởi chạy script đã tạo sh /etc/uci-defaults/70-rootpt-resize Đơn giản hơn nữa. chỉ cần chạy 2 lệnh:
# Download script wget -U \"\" -O expand-root.sh \"https://openwrt.org/_export/code/docs/guide-user/advanced/expand_root?codeblock=0\" # Chạy script . ./expand-root.sh Nếu quá trình chạy script gặp lỗi hoặc script làm việc không đúng, hãy chuyển qua cách 2
Cách 2: Các bước Resize RootFS OpenWRT trên phân vùng EXT4 thủ công
Áp dụng cho phân vùng EXT4.
Cập nhật opkg và cài đặt các package cần thiết
opkg update && opkg install parted tune2fs resize2fsKiểm tra thông tin phân vùng hiện tại trước khi resize
df -h # Thông tin trả về tương tự như sau # Filesystem Size Used Available Use% Mounted on # /dev/root 102.4M 14.5M 85.8M 14% / # tmpfs 495.8M 1.1M 494.7M 0% /tmp # tmpfs 512.0K 0 512.0K 0% /dev # Chúng ta có thể thấy, Rootfs chỉ sử dụng có 102.4M trong tổng số 32Gb của thẻ nhớ.Dùng Parted để resize phân vùng root
parted # GNU Parted 3.6 # Using /dev/mmcblk0 # Welcome to GNU Parted! Type 'help' to view a list of commands. # (parted)Gõ lần lượt các lệnh
print # hiện thông tin phân vùng trên thẻ resizepart 2 100% # resize phân vùng 2 # nhập <b>yes</b> nếu được hỏi print # hiện thông tin sau khi resize quit # Thoát Tổng quan các lệnh sẽ hiển thị như sau:
root@OpenWrt:~# partedGNU Parted 3.4Using /dev/mmcblk0Welcome to GNU Parted! Type 'help' to view a list of commands.(parted) printModel: SD LX32G (sd/mmc)Disk /dev/mmcblk0: 31.7GBSector size (logical/physical): 512B/512BPartition Table: msdosDisk Flags:Number Start End Size Type File system Flags 1 33.6MB 50.3MB 16.8MB primary ext2 boot 2 67.1MB 176MB 109MB primary ext2(parted) resizepart 2 100%Warning: Shrinking a partition can cause data loss, are you sure you want to continue? Yes/No? yes(parted) printModel: SD LX32G (sd/mmc)Disk /dev/mmcblk0: 31.7GBSector size (logical/physical): 512B/512BPartition Table: msdosDisk Flags:Number Start End Size Type File system Flags 1 133.6MB 50.3MB 16.8MB primary ext2 boot 2 67.1MB 30.0GB 29.9GB primary ext2(parted) quitInformation: You may need to update /etc/fstab.root@OpenWrt:~#
Nếu quá trình nhập lệnh resizepart 2 100% gặp lỗi Warning: Partition /dev/mmcblk0p2 is being used. Are you sure you want to continue? thì các bạn nhập n để dừng quá trình resize sau đó hãy thoát parted (quit) rồi chạy lệnh umount /dev/mmcblk0p2 và làm lại.
Sau khi hoàn thành các lệnh Parted chạy tiếp các lệnh sau
# Remount root sang ReadOnly (Nếu báo lỗi, hãy reboot rồi làm lại) mount -o remount,ro / # Lệnh kiểm tra phân vùng (nhập y nếu được hỏi) tune2fs -O^resize_inode /dev/mmcblk0p2 fsck.ext4 /dev/mmcblk0p2 # Reboot router rebootSau khi Router reboot xong, tiến hành chạy lệnh resize2fs
resize2fs /dev/mmcblk0p2 Tổng quan các lệnh như sau:
root@OpenWrt:~# mount -o remount,ro /root@OpenWrt:~# tune2fs -O^resize_inode /dev/mmcblk0p2tune2fs 1.47.0 (5-Feb-2023)root@OpenWrt:~# fsck.ext4 /dev/mmcblk0p2e2fsck 1.47.0 (5-Feb-2023)rootfs contains a file system with errors, check forced.Filesystem does not have resize_inode enabled, but s_reserved_gdt_blocks is 7; should be zero. Fix<y>? yesResize_inode not enabled, but the resize inode is non-zero. Clear<y>? yesPass 1: Checking inodes, blocks, and sizesPass 2: Checking directory structurePass 3: Checking directory connectivityPass 4: Checking reference countsPass 5: Checking group summary informationBlock bitmap differences: -(2--8) -427Fix<y>? yesFree blocks count wrong for group #0 (15291, counted=15299).Fix<y>? yesFree blocks count wrong (15291, counted=15299).Fix<y>? yesPadding at end of inode bitmap is not set. Fix<y>? yesrootfs: ***** FILE SYSTEM WAS MODIFIED *****rootfs: ***** REBOOT SYSTEM *****rootfs: 1513/6656 files (0.0% non-contiguous), 11325/26624 blocksroot@OpenWrt:~# reboot
Sau khi reboot:
root@OpenWrt:~# resize2fs /dev/mmcblk0p2resize2fs 1.47.0 (5-Feb-2023)Filesystem at /dev/mmcblk0p2 is mounted on /; on-line resizing requiredold_desc_blocks = 1, new_desc_blocks = 2The filesystem on /dev/mmcblk0p2 is now 7307834 (4k) blocks long.
Nhập lệnh df -h để kiểm tra thành quả
root@OpenWrt:~# df -hFilesystem Size Used Available Use% Mounted on/dev/root 7.3G 14.5M 27.5G 0% /tmpfs 495.8M 68.0K 495.7M 0% /tmptmpfs 512.0K 0 512.0K 0% /dev
Chúc các bạn thành công
Bình Luận & Thảo Luận
Góp ý, hỏi đáp và chia sẻ suy nghĩ của bạn