Update docs/emmc-multiboot.md

This commit is contained in:
jez 2026-06-02 21:41:08 +00:00
parent 82f844ff2d
commit d4dd137a9a

View file

@ -20,22 +20,25 @@ If microSD **is** inserted and has a valid bootloader, it takes priority over eM
## Partition Layout
Proposed new partition schema:
```
mmcblk1 (256GB eMMC)
├── mmcblk1boot0 (hardware boot partition — u-boot SPL + proper)
├── mmcblk1boot1 (unused mirror)
└── mmcblk1
├── mmcblk1p1 FAT32 1GB /boot (extlinux.conf, kernels, DTBs — shared)
├── mmcblk1p2 ext4 85GB root1 (Orange Pi OS Arch)
├── mmcblk1p3 ext4 85GB root2 (Armbian)
├── mmcblk1p4 ext4 ~84GB root3 (NixOS)
├── mmcblk1p2 ext4 85GB root_opios (Orange Pi OS Arch)
├── mmcblk1p3 ext4 85GB root_armbian (Armbian)
└── mmcblk1p4 ext4 ~84GB root_nixos (NixOS)
```
### Why a dedicated FAT32 boot partition?
u-boot reads `extlinux.conf` from a FAT, ext4, or btrfs partition. FAT32 is the most universally supported across distro kernel packages. A shared `/boot` means all three OSes drop their kernels and DTBs into one place, and a single `extlinux.conf` controls the menu. 1GB gives headroom for multiple kernel versions across all three OSes.
## Step 1: Clone SD → eMMC (Orange Pi OS, leaves root2/root3 ready)
## Step 1: Clone SD → eMMC
Move Orange Pi OS from the microSD card to eMMC and leave two more root paritions ready for other operating systems later.
### 1.1 — Identify devices
@ -46,21 +49,40 @@ lsblk
mount | grep mmcblk
```
Expected: `mmcblk0` = SD card (boot device), `mmcblk1` = eMMC (target).
Expected:
- `mmcblk0` = SD card (current boot device)
- `mmcblk1` = eMMC (target boot device)
Actual:
- `mmcblk0` = eMMC (target boot device)
- `mmcblk1` = SD card (current boot device)
Ground truth state with only OPi OS on SD card:
```bash
[jez@Rocky ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
mtdblock0 31:0 0 16M 0 disk
mmcblk0 179:0 0 233G 0 disk
mmcblk0boot0 179:32 0 4M 1 disk
mmcblk0boot1 179:64 0 4M 1 disk
mmcblk1 179:96 0 238.4G 0 disk
├─mmcblk1p1 179:97 0 213.6M 0 part /boot
└─mmcblk1p2 179:98 0 238.2G 0 part /
zram0 254:0 0 0B 0 disk
```
### 1.2 — Wipe eMMC partition table
**Destroys everything on eMMC.** Skip if eMMC is already empty.
```bash
sudo sgdisk --zap-all /dev/mmcblk1
sudo blkdiscard /dev/mmcblk1 # optional
sudo sgdisk --zap-all /dev/mmcblk0
sudo blkdiscard /dev/mmcblk0 # optional
```
### 1.3 — Partition eMMC
```bash
sudo gdisk /dev/mmcblk1
sudo gdisk /dev/mmcblk0
```
In `gdisk` interactive mode:
@ -68,30 +90,30 @@ In `gdisk` interactive mode:
```
o (new GPT)
n 1 default +1G ef00 name=boot
n 2 default +85G 8300 name=root1
n 3 default +85G 8300 name=root2
n 4 default default 8300 name=root3
n 2 default +85G 8300 name=root_opios
n 3 default +85G 8300 name=root_armbian
n 4 default default 8300 name=root_nixos
w (write, confirm 'y')
```
### 1.4 — Create filesystems
```bash
sudo mkfs.vfat -F 32 -n BOOT /dev/mmcblk1p1
sudo mkfs.ext4 -L root1 /dev/mmcblk1p2
sudo mkfs.ext4 -L root2 /dev/mmcblk1p3
sudo mkfs.ext4 -L root3 /dev/mmcblk1p4
sudo mkfs.vfat -F 32 -n BOOT /dev/mmcblk0p1
sudo mkfs.ext4 -L root_opios /dev/mmcblk0p2
sudo mkfs.ext4 -L root_armbian /dev/mmcblk0p3
sudo mkfs.ext4 -L root_nixos /dev/mmcblk0p4
```
### 1.5 — Mount and rsync the live rootfs
```bash
sudo mkdir -p /mnt/root1
sudo mount /dev/mmcblk1p2 /mnt/root1
sudo mkdir -p /mnt/root1/boot
sudo mount /dev/mmcblk1p1 /mnt/root1/boot
sudo mkdir -p /mnt/root_opios
sudo mount /dev/mmcblk0p2 /mnt/root_opios
sudo mkdir -p /mnt/root_opios/boot
sudo mount /dev/mmcblk0p1 /mnt/root_opios/boot
sudo rsync -axHAWX --info=progress2 / /mnt/root1/
sudo rsync -axHAWX --info=progress2 / /mnt/root_opios/
```
Flags: archive, stay-on-filesystem (critical — skips /proc, /sys, /dev), preserve
@ -100,34 +122,34 @@ hardlinks/ACLs/xattrs, copy whole files (faster locally).
### 1.6 — Bind mount virtual filesystems
```bash
sudo mkdir -p /mnt/root1/{proc,sys,dev,run,tmp}
sudo mount --bind /proc /mnt/root1/proc
sudo mount --bind /sys /mnt/root1/sys
sudo mount --bind /dev /mnt/root1/dev
sudo mount --bind /run /mnt/root1/run
sudo mkdir -p /mnt/root_opios/{proc,sys,dev,run,tmp}
sudo mount --bind /proc /mnt/root_opios/proc
sudo mount --bind /sys /mnt/root_opios/sys
sudo mount --bind /dev /mnt/root_opios/dev
sudo mount --bind /run /mnt/root_opios/run
```
### 1.7 — Update fstab
```bash
sudo blkid /dev/mmcblk1p1 /dev/mmcblk1p2
sudo blkid /dev/mmcblk0p1 /dev/mmcblk0p2
```
Edit `/mnt/root1/etc/fstab`. Replace old SD card references with:
Edit `/mnt/root_opios/etc/fstab`. Replace old SD card references with:
```
UUID=<boot-UUID> /boot vfat defaults,noatime 0 2
UUID=<root1-UUID> / ext4 defaults,noatime 0 1
UUID=<root_opios-UUID> / ext4 defaults,noatime 0 1
```
### 1.8 — Write extlinux.conf
```bash
uname -r
find /mnt/root1/boot -name "*.dtb" | grep orangepi-3b
find /mnt/root_opios/boot -name "*.dtb" | grep orangepi-3b
```
Create `/mnt/root1/boot/extlinux/extlinux.conf`:
Create `/mnt/root_opios/boot/extlinux/extlinux.conf`:
```
TIMEOUT 10
@ -138,7 +160,7 @@ LABEL orangepi-os
LINUX /vmlinuz-<kernel-version>
INITRD /initrd.img-<kernel-version>
FDT /dtbs/rockchip/rk3566-orangepi-3b.dtb
APPEND root=UUID=<root1-UUID> rootwait console=ttyS2,115200 console=tty1
APPEND root=UUID=<root_opios-UUID> rootwait console=ttyS2,115200 console=tty1
```
### 1.9 — Install u-boot to eMMC hardware boot partition
@ -152,26 +174,26 @@ find / -name "idbloader.img" -o -name "u-boot.itb" -o -name "*loader*" 2>/dev/nu
If files exist at known paths, use them. If not, extract from SD card:
```bash
sudo dd if=/dev/mmcblk0 of=idbloader.img bs=512 count=16384
sudo dd if=/dev/mmcblk0 of=u-boot.itb bs=512 skip=16384 count=8192
sudo dd if=/dev/mmcblk1 of=idbloader.img bs=512 count=16384
sudo dd if=/dev/mmcblk1 of=u-boot.itb bs=512 skip=16384 count=8192
```
Write to eMMC hardware boot partition:
```bash
echo 0 | sudo tee /sys/block/mmcblk1/force_ro
sudo mmc bootpart enable 1 1 /dev/mmcblk1
sudo dd if=idbloader.img of=/dev/mmcblk1boot0 bs=512 seek=64
sudo dd if=u-boot.itb of=/dev/mmcblk1boot0 bs=512 seek=16384
echo 0 | sudo tee /sys/block/mmcblk0/force_ro
sudo mmc bootpart enable 1 1 /dev/mmcblk0
sudo dd if=idbloader.img of=/dev/mmcblk0boot0 bs=512 seek=64
sudo dd if=u-boot.itb of=/dev/mmcblk0boot0 bs=512 seek=16384
sudo sync
```
### 1.10 — Clean up and test
```bash
sudo umount /mnt/root1/boot
sudo umount /mnt/root1/proc /mnt/root1/sys /mnt/root1/dev /mnt/root1/run
sudo umount /mnt/root1
sudo umount /mnt/root_opios/boot
sudo umount /mnt/root_opios/proc /mnt/root_opios/sys /mnt/root_opios/dev /mnt/root_opios/run
sudo umount /mnt/root_opios
sudo sync
sudo poweroff
```
@ -189,11 +211,11 @@ Remove SD card. Power on. u-boot logo → boot menu → Orange Pi OS from eMMC.
## Step 2: Install Armbian
(To be documented — Armbian rootfs goes into root2, kernel+DTB added to shared /boot, next LABEL added to extlinux.conf.)
(To be documented — Armbian rootfs goes into root_armbian, kernel+DTB added to shared /boot, next LABEL added to extlinux.conf.)
## Step 3: Install NixOS
(To be documented — NixOS rootfs goes into root3. Likely the trickiest since NixOS generates its own /boot structure.)
(To be documented — NixOS rootfs goes into root_nixos. Likely the trickiest since NixOS generates its own /boot structure.)
## Reference