Re: How to add an UFS2 partition on a mbr style partition disk.

From: Ronald Klop <ronald-lists_at_klop.ws>
Date: Sun, 13 Jul 2025 12:06:38 UTC
I assume your question is 'how to make a bootable SDcard with MBR and UFS2?'
In the man page of gpart (type: man gpart) go to the EXAMPLES section and look for MBR.

That contains an example of how to setup MBR + UFS2.

You can play around a bit with it. My RPI3 boots from an SDcard with this layout:

gpart show
=>      1  3994623  mmcsd0  MBR  (1.9G)
        1     2047          - free -  (1.0M)
     2048   102400       1  fat32lba  [active]  (50M)
   104448  3890176       2  freebsd  (1.9G)

=>      0  3890176  ufs/rootfs  BSD  (1.9G)
        0      128              - free -  (64K)
      128  3890048           1  freebsd-ufs  (1.9G)

Although in my config the SDcard only contains /boot. The kernel mounts the rootfs from an SSD.
For your proof of concept I would advice to just write a full rootfs on the SD.

Hope this helps.

Regards,
Ronald.

 
Van: Mario Marietto <marietto2008@gmail.com>
Datum: zondag, 13 juli 2025 12:23
Aan: FreeBSD Mailing List <freebsd-questions@freebsd.org>, freebsd-hackers <freebsd-hackers@freebsd.org>, freebsd-arm <freebsd-arm@freebsd.org>
Onderwerp: How to add an UFS2 partition on a mbr style partition disk.
> 
> Hello.
> 
> I've bought the nice board "KHADAS Edge-V" because I wanted to try to boot FreeBSD from it. An old version of FreeBSD,version 13, is provided by the company,but unfortunately it does not boot. Later I've found that the reason or one of the reasons is because the board wants the sd card to be "formatted" with an MBR style partition layout.
> 
> I've understood that the image named "Edge_Ubuntu-gnome-focal_Linux-5.7_arm64_SD-USB_V0.9.1-20200602.img" can boot from the sd card,but the image named "edge-freebsd-aarch64-13.0-release-20210613.img" can't do it. Why ? I've crudely identified some crucial differences that make the magic.
> 
> the structure of the disk partitions that comes after having written "Edge_Ubuntu-gnome-focal_Linux-5.7_arm64_SD-USB_V0.9.1-20200602.img" to the sd card :=> 63 62333889 da1 MBR (30G) 63 32705 - free - (16M) 32768 491520 1 fat32 [active] (240M) 524288 61808640 2 linux-data (29G) 62332928 1024 - free - (512K)
> 
> MBR here is important. With a GPT disk it is not able to boot.
> 
> 2) inside the fat32 partition there is a script like this :
> 
> Â 
> 
> echo "Run Khadas boot script"
> 
> # Constant
> setenv BOARD_TYPE_NONE        0
> setenv BOARD_TYPE_EDGE        1
> setenv BOARD_TYPE_EDGE_V    2
> setenv BOARD_TYPE_CAPTAIN    3
> 
> # Detect board type
> kbi boarddetect
> 
> if test ${board_type} = ${BOARD_TYPE_NONE}; then
>     echo "Unsupported board detected! Stop here. Reboot...";
>     sleep 5;
>     reset;
> fi
> 
> setenv emmc_root_part        7
> setenv emmc_boot_part        7
> setenv emmc_mbr_root_part    2
> setenv emmc_mbr_boot_part    1
> setenv sd_root_part            2
> setenv sd_boot_part            1
> 
> if test ${devnum} = 0; then
>     echo "Uboot loaded from eMMC.";
>     if test -e mmc ${devnum}:${emmc_root_part} zImage; then
>         setenv imagetype "EMMC";
>         setenv boot_env_part ${emmc_boot_part};
>         setenv root_part ${emmc_root_part};
>         setenv mark_prefix "boot/";
>     else
>         setenv imagetype "EMMC_MBR";
>         setenv boot_env_part ${emmc_mbr_boot_part};
>         setenv root_part ${emmc_mbr_root_part};
>         setenv mark_prefix "";
>     fi;
> 
>     if test -e mmc ${devnum}:${boot_env_part} ${mark_prefix}.next; then
>         setenv default_rootdev "/dev/mmcblk2p${root_part}"
>     else
>         setenv default_rootdev "/dev/mmcblk1p${root_part}"
>     fi
> else if test ${devnum} = 1; then
>     echo "Uboot loaded from SD.";
>     setenv boot_env_part ${sd_boot_part};
>     setenv root_part ${sd_root_part}
>     setenv mark_prefix ""
>     if test -e mmc ${devnum}:${boot_env_part} ${mark_prefix}.next; then
>         setenv default_rootdev "/dev/mmcblk1p${sd_root_part}"
>     else
>         setenv default_rootdev "/dev/mmcblk0p${sd_root_part}"
>     fi
>     setenv imagetype "SD-USB";
> fi;fi;
> 
> # Import environment from env.txt
> if load ${devtype} ${devnum}:${boot_env_part} ${ramdisk_addr_r} /boot/env.txt || load ${devtype} ${devnum}:${boot_env_part} ${ramdisk_addr_r} env.txt; then
>     echo "Import env.txt";
>     env import -t ${ramdisk_addr_r} ${filesize}
> fi
> 
> # Check root part filesystem UUID
> fsuuid ${devtype} ${devnum}:${root_part} root_uuid
> if test "UUID=${root_uuid}" != "${rootdev}"; then
>     echo "Rootfs UUID mismatch! Set rootfs part to default: ${default_rootdev}"
>     setenv rootdev ${default_rootdev}
> fi
> 
> # Check MIPI
> if test "${mipi_lcd_enabled}" = "true"; then
>     setenv dtb_suffix "-mipi";
> else
>     setenv dtb_suffix "";
> fi
> 
> if test -e mmc ${devnum}:${boot_env_part} ${mark_prefix}.next; then
>     if test ${board_type} = ${BOARD_TYPE_EDGE}; then
>         setenv boot_dtb "rk3399-khadas-edge.dtb";
>     else if test ${board_type} = ${BOARD_TYPE_EDGE_V}; then
>         setenv boot_dtb "rk3399-khadas-edge-v.dtb";
>     else if test ${board_type} = ${BOARD_TYPE_CAPTAIN}; then
>         setenv boot_dtb "rk3399-khadas-edge-captain.dtb";
>     fi;fi;fi
> else
>     if test ${board_type} = ${BOARD_TYPE_EDGE}; then
>         setenv boot_dtb "rk3399-khadas-edge-linux.dtb";
>     else if test ${board_type} = ${BOARD_TYPE_EDGE_V}; then
>         setenv boot_dtb "rk3399-khadas-edgev${dtb_suffix}-linux.dtb";
>     else if test ${board_type} = ${BOARD_TYPE_CAPTAIN}; then
>         setenv boot_dtb "rk3399-khadas-captain${dtb_suffix}-linux.dtb";
>     fi;fi;fi
> fi
> 
> if test ${devnum} = 0; then
>     if test -e mmc ${devnum}:${boot_env_part} ${mark_prefix}.next; then
>         if test ${imagetype} = EMMC_MBR; then
>             setenv dtb_prefix "/dtb/rockchip/";
>         else
>             setenv dtb_prefix "/boot/dtb/rockchip/";
>         fi
>     else
>         if test ${imagetype} = EMMC_MBR; then
>             setenv dtb_prefix "/dtb/";
>         else
>             setenv dtb_prefix "/boot/dtb/";
>         fi
>     fi
> else if test ${devnum} = 1; then
>     if test -e mmc ${devnum}:${boot_env_part} ${mark_prefix}.next; then
>         setenv dtb_prefix "/dtb/rockchip/";
>     else
>         setenv dtb_prefix "/dtb/";
>     fi
> fi;fi;
> 
> echo DTB: ${dtb_prefix}${boot_dtb}
> 
> if test -e mmc ${devnum}:${boot_env_part} ${mark_prefix}.next; then
>     setenv condev "earlyprintk console=ttyS2,1500000n8 console=tty0"
> else
>     setenv condev "earlyprintk console=ttyFIQ0,1500000n8 console=tty0"
> fi
> 
> setenv boot_start booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}
> 
> part uuid mmc ${devnum}:1 ubootpartuuid;
> if test "X${ubootpartuuid}" = "X"; then
>     echo "Can not get u-boot part UUID, set to NULL";
>     setenv ubootpartuuid "NULL";
> fi;
> 
> kbi ethmac
> if test -e ${custom_ethmac}; then
>     echo "Found custom ethmac: ${custom_ethmac}, overwrite eth_mac!";
>     setenv eth_mac ${custom_ethmac}
> fi
> 
> if test "X${eth_mac}" = "X" || test "X${eth_mac}" = "X00:00:00:00:00:00"; then
>     echo "Set default mac address to ethaddr: ${ethaddr}!";
>     setenv eth_mac ${ethaddr};
>     setenv saveethmac "save_ethmac=yes";
> fi;
> 
> if test -e ${loglevel}; then
>     setenv log "loglevel=${loglevel}"
> fi
> 
> setenv bootargs "${bootargs} ${condev} ${log} rw root=${rootdev} rootfstype=ext4 init=/sbin/init rootwait ubootpart=${ubootpartuuid} board_type=${board_type} board_type_name=${board_type_name} khadas_board=${board_type_name} fan=${fan_mode} mac=${eth_mac} androidboot.mac=${eth_mac} ${saveethmac} coherent_pool=${dma_size} imagetype=${imagetype}"
> 
> for distro_bootpart in ${devplist}; do
>     echo "Scanning ${devtype} ${devnum}:${distro_bootpart}..."
> 
>     if load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} uInitrd; then
>         if load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} zImage; then
>             if load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${dtb_prefix}${boot_dtb}; then
>                 run boot_start;
>             fi;
>         fi;
>     fi;
> 
> done
> 
> # Rebuilt
> # mkimage -A arm64 -O linux -T script -C none -a 0 -e 0 -n "rk3399 autoscript" -d /boot/rk3399_autoscript.cmd /boot/boot.screcho "Run Khadas boot script"
> 
> # Constant
> setenv BOARD_TYPE_NONE        0
> setenv BOARD_TYPE_EDGE        1
> setenv BOARD_TYPE_EDGE_V    2
> setenv BOARD_TYPE_CAPTAIN    3
> 
> # Detect board type
> kbi boarddetect
> 
> if test ${board_type} = ${BOARD_TYPE_NONE}; then
>     echo "Unsupported board detected! Stop here. Reboot...";
>     sleep 5;
>     reset;
> fi
> 
> setenv emmc_root_part        7
> setenv emmc_boot_part        7
> setenv emmc_mbr_root_part    2
> setenv emmc_mbr_boot_part    1
> setenv sd_root_part            2
> setenv sd_boot_part            1
> 
> if test ${devnum} = 0; then
>     echo "Uboot loaded from eMMC.";
>     if test -e mmc ${devnum}:${emmc_root_part} zImage; then
>         setenv imagetype "EMMC";
>         setenv boot_env_part ${emmc_boot_part};
>         setenv root_part ${emmc_root_part};
>         setenv mark_prefix "boot/";
>     else
>         setenv imagetype "EMMC_MBR";
>         setenv boot_env_part ${emmc_mbr_boot_part};
>         setenv root_part ${emmc_mbr_root_part};
>         setenv mark_prefix "";
>     fi;
> 
>     if test -e mmc ${devnum}:${boot_env_part} ${mark_prefix}.next; then
>         setenv default_rootdev "/dev/mmcblk2p${root_part}"
>     else
>         setenv default_rootdev "/dev/mmcblk1p${root_part}"
>     fi
> else if test ${devnum} = 1; then
>     echo "Uboot loaded from SD.";
>     setenv boot_env_part ${sd_boot_part};
>     setenv root_part ${sd_root_part}
>     setenv mark_prefix ""
>     if test -e mmc ${devnum}:${boot_env_part} ${mark_prefix}.next; then
>         setenv default_rootdev "/dev/mmcblk1p${sd_root_part}"
>     else
>         setenv default_rootdev "/dev/mmcblk0p${sd_root_part}"
>     fi
>     setenv imagetype "SD-USB";
> fi;fi;
> 
> # Import environment from env.txt
> if load ${devtype} ${devnum}:${boot_env_part} ${ramdisk_addr_r} /boot/env.txt || load ${devtype} ${devnum}:${boot_env_part} ${ramdisk_addr_r} env.txt; then
>     echo "Import env.txt";
>     env import -t ${ramdisk_addr_r} ${filesize}
> fi
> 
> # Check root part filesystem UUID
> fsuuid ${devtype} ${devnum}:${root_part} root_uuid
> if test "UUID=${root_uuid}" != "${rootdev}"; then
>     echo "Rootfs UUID mismatch! Set rootfs part to default: ${default_rootdev}"
>     setenv rootdev ${default_rootdev}
> fi
> 
> # Check MIPI
> if test "${mipi_lcd_enabled}" = "true"; then
>     setenv dtb_suffix "-mipi";
> else
>     setenv dtb_suffix "";
> fi
> 
> if test -e mmc ${devnum}:${boot_env_part} ${mark_prefix}.next; then
>     if test ${board_type} = ${BOARD_TYPE_EDGE}; then
>         setenv boot_dtb "rk3399-khadas-edge.dtb";
>     else if test ${board_type} = ${BOARD_TYPE_EDGE_V}; then
>         setenv boot_dtb "rk3399-khadas-edge-v.dtb";
>     else if test ${board_type} = ${BOARD_TYPE_CAPTAIN}; then
>         setenv boot_dtb "rk3399-khadas-edge-captain.dtb";
>     fi;fi;fi
> else
>     if test ${board_type} = ${BOARD_TYPE_EDGE}; then
>         setenv boot_dtb "rk3399-khadas-edge-linux.dtb";
>     else if test ${board_type} = ${BOARD_TYPE_EDGE_V}; then
>         setenv boot_dtb "rk3399-khadas-edgev${dtb_suffix}-linux.dtb";
>     else if test ${board_type} = ${BOARD_TYPE_CAPTAIN}; then
>         setenv boot_dtb "rk3399-khadas-captain${dtb_suffix}-linux.dtb";
>     fi;fi;fi
> fi
> 
> if test ${devnum} = 0; then
>     if test -e mmc ${devnum}:${boot_env_part} ${mark_prefix}.next; then
>         if test ${imagetype} = EMMC_MBR; then
>             setenv dtb_prefix "/dtb/rockchip/";
>         else
>             setenv dtb_prefix "/boot/dtb/rockchip/";
>         fi
>     else
>         if test ${imagetype} = EMMC_MBR; then
>             setenv dtb_prefix "/dtb/";
>         else
>             setenv dtb_prefix "/boot/dtb/";
>         fi
>     fi
> else if test ${devnum} = 1; then
>     if test -e mmc ${devnum}:${boot_env_part} ${mark_prefix}.next; then
>         setenv dtb_prefix "/dtb/rockchip/";
>     else
>         setenv dtb_prefix "/dtb/";
>     fi
> fi;fi;
> 
> echo DTB: ${dtb_prefix}${boot_dtb}
> 
> if test -e mmc ${devnum}:${boot_env_part} ${mark_prefix}.next; then
>     setenv condev "earlyprintk console=ttyS2,1500000n8 console=tty0"
> else
>     setenv condev "earlyprintk console=ttyFIQ0,1500000n8 console=tty0"
> fi
> 
> setenv boot_start booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}
> 
> part uuid mmc ${devnum}:1 ubootpartuuid;
> if test "X${ubootpartuuid}" = "X"; then
>     echo "Can not get u-boot part UUID, set to NULL";
>     setenv ubootpartuuid "NULL";
> fi;
> 
> kbi ethmac
> if test -e ${custom_ethmac}; then
>     echo "Found custom ethmac: ${custom_ethmac}, overwrite eth_mac!";
>     setenv eth_mac ${custom_ethmac}
> fi
> 
> if test "X${eth_mac}" = "X" || test "X${eth_mac}" = "X00:00:00:00:00:00"; then
>     echo "Set default mac address to ethaddr: ${ethaddr}!";
>     setenv eth_mac ${ethaddr};
>     setenv saveethmac "save_ethmac=yes";
> fi;
> 
> if test -e ${loglevel}; then
>     setenv log "loglevel=${loglevel}"
> fi
> 
> setenv bootargs "${bootargs} ${condev} ${log} rw root=${rootdev} rootfstype=ext4 init=/sbin/init rootwait ubootpart=${ubootpartuuid} board_type=${board_type} board_type_name=${board_type_name} khadas_board=${board_type_name} fan=${fan_mode} mac=${eth_mac} androidboot.mac=${eth_mac} ${saveethmac} coherent_pool=${dma_size} imagetype=${imagetype}"
> 
> for distro_bootpart in ${devplist}; do
>     echo "Scanning ${devtype} ${devnum}:${distro_bootpart}..."
> 
>     if load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} uInitrd; then
>         if load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} zImage; then
>             if load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${dtb_prefix}${boot_dtb}; then
>                 run boot_start;
>             fi;
>         fi;
>     fi;
> 
> done
> 
> # Rebuilt
> # mkimage -A arm64 -O linux -T script -C none -a 0 -e 0 -n "rk3399 autoscript" -d /boot/rk3399_autoscript.cmd /boot/boot.scr
> Â 
> 
> I suspect that it has been compiled and it became the file "boot.scr" that's responsible for the booting of Ubuntu from the sd card. This script is not present on the EFI partition of the sd card where is installed FreeBSD :
> 
> Â 
> 
> =>       40  500006832  da3  GPT  (238G)
>          40      32728       - free -  (16M)
>       32768     102400    1  efi  (50M)
>      135168  483708928    2  freebsd-ufs  (231G)
>   483844096   16154624    3  freebsd-swap  (7.7G)
>   499998720       8152       - free -  (4.0M)
> Â 
> 
> anyway,I tried to put it there :
> 
> Â 
> 
> marietto# cd /mnt/da3p1
> marietto# ls
> 
> EFI            dtb            dtb-rock        u-boot~1.bin
> Edge-V            dtb-RK3399        rk3399_autoscript.cmd    ubootefi.var
> boot.scr        dtb-pinebook-pro    splash.bmp        ubootefi_.var
> Â 
> 
> What happened ? that FreeBSD does not boot,but is Android that's installed on the internal EMMC that makes the boot. I'm pretty sure that the script has been written specially for Ubuntu and it should be modified to work with FreeBSD.
> 
> But at the moment I need to understand how to add an UFS2 partition on top of a MBR disk because the KHADAS Edge-V is not able to boot FreeBSD if it stays inside a GPT disk.
> 
> -- 
> Mario.

Â