创建可启动 USB 的脚本

创建可启动 USB 的脚本

我一直在 Ubuntu 14.04.5 LTS 上使用以下 bash 脚本为嵌入式系统创建可启动 USB 磁盘,效果很好:

# Partition disk.
/usr/bin/sudo /bin/umount /dev/sdc1 /dev/sdc2
/usr/bin/sudo /sbin/parted -s -- /dev/sdc mklabel msdos
/usr/bin/sudo /sbin/parted -s -- /dev/sdc mkpart primary 2048s 5244928s
/usr/bin/sudo /sbin/parted -s -- /dev/sdc set 1 boot on
/usr/bin/sudo /sbin/parted -s -- /dev/sdc mkpart primary 5246976s -977920s
/usr/bin/sudo /sbin/parted -s -- /dev/sdc quit
/usr/bin/sudo /sbin/partprobe /dev/sdc
/usr/bin/sudo /bin/umount /dev/sdc1 /dev/sdc2
/usr/bin/sudo /sbin/mkfs.ext4 -L rootfs /dev/sdc1
/usr/bin/sudo /sbin/mkfs.ext4 -L var /dev/sdc2
/usr/bin/sudo /sbin/partprobe /dev/sdc
/bin/sync

# Copy filesystem.
/usr/bin/udisksctl mount -b /dev/sdc1
/usr/bin/sudo /bin/cp -a ${ROOTFS_DIR}/. ${ROOTFS_MOUNTPOINT}
/usr/bin/udisksctl mount -b /dev/sdc2
/usr/bin/sudo /bin/cp -a ${VAR_DIR}/. ${VAR_MOUNTPOINT}
/bin/sync

# Upload bootloader.
/usr/bin/udisksctl mount -b /dev/sdc1
/usr/bin/sudo /usr/sbin/grub-install --no-floppy --directory=${ROOTFS_MOUNTPOINT}/usr/lib/grub/i386-pc --locale-directory=${ROOTFS_MOUNTPOINT}/usr/share/locale --boot-directory=${ROOTFS_MOUNTPOINT}/boot /dev/sdc
/bin/sync
/usr/bin/sudo /usr/bin/eject /dev/sdc

fdisk生成的 USB 磁盘的输出为:

Disk /dev/sdc: 14.9 GiB, 16022241280 bytes, 31293440 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x22953b4d

Device     Boot   Start      End  Sectors  Size Id Type
/dev/sdc1  *       2048  5244928  5242881  2.5G 83 Linux
/dev/sdc2       5246976 30315520 25068545   12G 83 Linux

最近,我切换到了 Ubuntu 18.04,但是现在,grub加载了 linux 内核和 initramfs,但之后启动失败并出现以下输出,并且进入紧急 shell:

mount: wrong fs type, bad option, bad superblock on /dev/sdb1,
missing codepage or helper program, or other error

在紧急 shell 中,blkid命令按预期显示分区,其与/boot/grub/grub.cfg和中的 UUID 匹配/etc/fstab

/dev/sdb1: LABEL="rootfs" UUID="5556accb-3244-47d0-8042-aaad74dd3950" TYPE="ext4" PARTUUID="22953b4d-01"
/dev/sdb2: LABEL="var" UUID="6ee3b764-77dB-481d-9564-fbfabb590933" TYPE="ext4" PARTUUID="22953b4d-02"

由于我已经在 Ubuntu 18.04 中遇到了一些其他问题,例如与 的行为不同losetup、 的输出格式不同等,我是否应该在脚本中fdisk提供进一步的命令选项mkfs.ext4或命令?命令来自版本 的 Ubuntu ,但其选项使用具有 grub 的嵌入式文件系统中的目录,那么,是否会因此而出现一些不一致?grub-installgrub-install2.02-2ubuntu8.132.02.beta2-4

答案1

原来mkfs.ext4是这个原因,因为 Ubuntu 18.04 上的命令比嵌入式系统上的命令更新mount,导致启动时出现以下错误:

EXT4-fs (mmcblk1p2): couldn't mount RDWR because of unsupported optional features (400)

基于此主题此信息,我metadata_csum在创建文件系统时使用以下选项禁用了该功能,并且系统正常启动:

/usr/bin/sudo /sbin/mkfs.ext4 -O ^metadata_csum -L 'rootfs' /dev/sdc1

相关内容