Bookmark
Billboard ads

Hướng dẫn Resize RootFS OpenWRT (Expand root) áp dụng cho ext4, squashfs

Ads top post

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)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
cat << "EOF" > /etc/uci-defaults/70-rootpt-resize
if [ ! -e /etc/rootpt-resize ] \
&& type parted > /dev/null \
&& lock -n /var/lock/root-resize
then
ROOT_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 done
touch /etc/rootpt-resize
reboot
fi
exit 1
EOF
cat << "EOF" > /etc/uci-defaults/80-rootfs-resize
if [ ! -e /etc/rootfs-resize ] \
&& [ -e /etc/rootpt-resize ] \
&& type losetup > /dev/null \
&& type resize2fs > /dev/null \
&& lock -n /var/lock/root-resize
then
ROOT_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}" ]
then
LOOP_DEV="$(losetup -f)"
losetup "${LOOP_DEV}" "${ROOT_DEV}"
fi
resize2fs -f "${LOOP_DEV}"
mount_root done
touch /etc/rootfs-resize
reboot
fi
exit 1
EOF
cat << "EOF" >> /etc/sysupgrade.conf
/etc/uci-defaults/70-rootpt-resize
/etc/uci-defaults/80-rootfs-resize
EOF

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 resize2fs
Kiể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 yes 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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
root@OpenWrt:~# parted
GNU Parted 3.4
Using /dev/mmcblk0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: SD LX32G (sd/mmc)
Disk /dev/mmcblk0: 31.7GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk 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) print
Model: SD LX32G (sd/mmc)
Disk /dev/mmcblk0: 31.7GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk 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) quit
Information: 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 reboot
Sau 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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
root@OpenWrt:~# mount -o remount,ro /
root@OpenWrt:~# tune2fs -O^resize_inode /dev/mmcblk0p2
tune2fs 1.47.0 (5-Feb-2023)
root@OpenWrt:~# fsck.ext4 /dev/mmcblk0p2
e2fsck 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>? yes
Resize_inode not enabled, but the resize inode is non-zero. Clear<y>? yes
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
Block bitmap differences: -(2--8) -427
Fix<y>? yes
Free blocks count wrong for group #0 (15291, counted=15299).
Fix<y>? yes
Free blocks count wrong (15291, counted=15299).
Fix<y>? yes
Padding at end of inode bitmap is not set. Fix<y>? yes
rootfs: ***** FILE SYSTEM WAS MODIFIED *****
rootfs: ***** REBOOT SYSTEM *****
rootfs: 1513/6656 files (0.0% non-contiguous), 11325/26624 blocks
root@OpenWrt:~# reboot

Sau khi reboot:

1
2
3
4
5
root@OpenWrt:~# resize2fs /dev/mmcblk0p2
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/mmcblk0p2 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/mmcblk0p2 is now 7307834 (4k) blocks long.

Nhập lệnh df -h để kiểm tra thành quả

1
2
3
4
5
root@OpenWrt:~# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                 7.3G     14.5M     27.5G   0% /
tmpfs                   495.8M     68.0K    495.7M   0% /tmp
tmpfs                   512.0K         0    512.0K   0% /dev

Chúc các bạn thành công


Ads bottom post
0 Bình luận

Góp Ý / Bình Luận / Đánh giá