OpenWrt 24.x Extroot on XE300 Goal: Use a 512 GB microSD card as the router’s writable storage (overlay), single ext4 partition, no data copied from internal flash. Assumptions (based on your box): Device: GL‑iNet XE300 OpenWrt 24.x, fresh flash SD card in the built‑in slot The card appears as /dev/sda with one partition /dev/sda1 You don’t care about any existing data on the card or in the old overlay 1. Insert card & install required packages Insert the microSD card. SSH into the router (root@192.168.x.x etc). Install the packages that make extroot possible: opkg update opkg install block-mount kmod-fs-ext4 kmod-usb-storage e2fsprogs What they do: block-mount – block info, fstab handling, extroot logic kmod-fs-ext4 – kernel driver for ext4 filesystem kmod-usb-storage – makes the SD slot show up as /dev/sda e2fsprogs – gives you mkfs.ext4 2. Confirm the SD card is detected as /dev/sda//dev/sda1 Check dmesg: dmesg | grep -i sd On your XE300 you should see something like: sd 0:0:0:0: [sda] 1000005632 512-byte logical blocks: (512 GB/477 GiB) sda: sda1 sd 0:0:0:0: [sda] Attached SCSI removable disk That tells you: Disk: /dev/sda Partition already present: /dev/sda1 If you don’t see sda1 for some reason in the future, you’d need to create a partition—but on your current setup, it’s there already, so we can jump straight to formatting. 3. Format /dev/sda1 as ext4 for extroot We’re going to erase whatever is on that partition and build a fresh ext4 FS. mkfs.ext4 -L extroot /dev/sda1 You may get a warning like “contains an exfat file system – Proceed anyway? (y,N)” Answer y You should see output about creating the filesystem, ending with success and a UUID. At this point /dev/sda1 is a clean ext4 filesystem labeled extroot. 4. Grab the UUID and create the extroot fstab entry Ask OpenWrt’s block layer for info and capture the UUID: UUID=$(block info | awk -F\" '/sda1/ {print $2}') echo $UUID You should see a UUID like: 4851f00e-696b-47d3-a529-82c2aca292db Now write the minimal extroot config via UCI: uci set fstab.extroot="mount" uci set fstab.extroot.uuid="$UUID" uci set fstab.extroot.target="/overlay" uci set fstab.extroot.fstype="ext4" uci set fstab.extroot.enabled="1" uci commit fstab Sanity‑check the file: cat /etc/config/fstab Expected content (plus the global section): config global option anon_swap '0' option anon_mount '0' option auto_swap '1' option auto_mount '1' option delay_root '5' option check_fs '0' config mount 'extroot' option uuid '4851f00e-696b-47d3-a529-82c2aca292db' option target '/overlay' option fstype 'ext4' option enabled '1' Note what’s not there: No /rwm mount No copy of internal overlay This is intentionally a clean, single‑overlay setup that lives entirely on the SD card. 5. Reboot into extroot reboot Let the router come back up and SSH in again. 6. Verify that the SD card is now your root overlay Run: df -h On your working system, you got: Filesystem Size Used Available Use% Mounted on /dev/root 4.0M 4.0M 0 100% /rom tmpfs 58.7M 200.0K 58.5M 0% /tmp /dev/sda1 468.3G 2.1M 444.4G 0% /overlay overlayfs:/overlay 468.3G 2.1M 444.4G 0% / Interpreting that: /dev/root at /rom → the read‑only squashfs from flash (normal) /dev/sda1 mounted at /overlay → SD card is the writable layer overlayfs:/overlay mounted on / → your whole root filesystem is now the ROM + SD overlay That’s exactly what we want: the router is effectively a 468 GB OpenWrt box. Extra checks if you ever want them: mount | grep sda1 mount | grep overlay Should show: /dev/sda1 on /overlay type ext4 overlayfs:/overlay on / type overlay 7. Quick functional test Just to flex: opkg install tcpdump df -h /overlay You’ll see a tiny bump in “Used” on /dev/sda1, confirming packages are being installed to SD‑backed overlay, not the tiny internal flash.