在以下两种情况下,tst.sh 脚本完全相同,只是 dd 在第一种情况下创建一个 64 MB 的图像,在第二种情况下创建一个 256 MB 的图像。(图像大小由脚本第一个 dd 行上的 count 参数定义)。
当映像大小为 256 meg 时,grub 安装不会出现错误;当映像大小为 64 meg 时,grub 安装失败。
有什么猜测吗?
一、版本:
(venv3.4)root@ugbuildserver:/home/ubuntu/ubuntucore# grub-install -V
grub-install (GRUB) 2.02~beta2-22ubuntu1.1
场景 1:当 dd count=64 时 GRUB 失败
(venv3.4)root@server:/home/ubuntu/ubuntucore# cat tst.sh
sudo dd if=/dev/zero of=./test.img oflag=direct bs=1M count=64
sudo mkdir -p /mnt/build
sudo parted -s test.img mklabel msdos
sudo parted -s -a optimal test.img mkpart primary ext2 '0%' '100%'
sudo parted -s test.img set 1 boot on
sudo kpartx -av test.img
sudo mke2fs -L '/' -t ext2 /dev/mapper/loop0p1
sudo mount /dev/mapper/loop0p1 /mnt/build
sudo grub-install --root-directory=/mnt/build /dev/loop0
# release mount
sudo umount -l /mnt/build
# release loopback
sudo dmsetup remove loop0p1
sudo losetup -d /dev/loop0
(venv3.4)root@server:/home/ubuntu/ubuntucore# . tst.sh
64+0 records in
64+0 records out
67108864 bytes (67 MB) copied, 0.15139 s, 443 MB/s
Warning: The resulting partition is not properly aligned for best performance.
add map loop0p1 (252:2): 0 131071 linear /dev/loop0 1
mke2fs 1.42.12 (29-Aug-2014)
Discarding device blocks: done
Creating filesystem with 65532 1k blocks and 16384 inodes
Filesystem UUID: 2a52b053-c671-428d-bc13-6b967e0781c5
Superblock backups stored on blocks:
8193, 24577, 40961, 57345
Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
Installing for i386-pc platform.
grub-install: warning: this msdos-style partition label has no post-MBR gap; embedding won't be possible.
grub-install: warning: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..
grub-install: error: will not proceed with blocklists.
场景 2:当 dd count=256 时 GRUB 成功
(venv3.4)root@userver:/home/ubuntu/ubuntucore# cat tst.sh
sudo dd if=/dev/zero of=./test.img oflag=direct bs=1M count=256
sudo mkdir -p /mnt/build
sudo parted -s test.img mklabel msdos
sudo parted -s -a optimal test.img mkpart primary ext2 '0%' '100%'
sudo parted -s test.img set 1 boot on
sudo kpartx -av test.img
sudo mke2fs -L '/' -t ext2 /dev/mapper/loop0p1
sudo mount /dev/mapper/loop0p1 /mnt/build
sudo grub-install --root-directory=/mnt/build /dev/loop0
# release mount
sudo umount -l /mnt/build
# release loopback
sudo dmsetup remove loop0p1
sudo losetup -d /dev/loop0
(venv3.4)root@server:/home/ubuntu/ubuntucore# . tst.sh
256+0 records in
256+0 records out
268435456 bytes (268 MB) copied, 0.637421 s, 421 MB/s
add map loop0p1 (252:2): 0 522240 linear /dev/loop0 2048
mke2fs 1.42.12 (29-Aug-2014)
Discarding device blocks: done
Creating filesystem with 261120 1k blocks and 65280 inodes
Filesystem UUID: 1bf70e68-8f27-426d-b66e-c9c90aaa01b4
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185
Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
Installing for i386-pc platform.
Installation finished. No error reported.
答案1
grub 邮件列表上的好心人建议我对两个映像显示 fdisk -l,这会显示不同的启动扇区。更改 dd 命令以具有显式起始扇区而不是 0% 效果很好:
sudo parted -s -a optimal {0} mkpart primary ext2 '2048s' '100%'
请为两个映像显示“fdisk -l”。
ubuntu@ugbuildserver:~$ sudo fdisk -l /dev/loop0
Disk /dev/loop0: 64 MiB, 67108864 bytes, 131072 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: 0x0e508c47
Device Boot Start End Sectors Size Id Type
/dev/loop0p1 * 1 131071 131071 64M 83 Linux
ubuntu@ugbuildserver:~$ sudo fdisk -l /dev/loop0
Disk /dev/loop0: 256 MiB, 268435456 bytes, 524288 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: 0x0dde66d2
Device Boot Start End Sectors Size Id Type
/dev/loop0p1 * 2048 524287 522240 255M 83 Linux