URL:
  <http://savannah.gnu.org/bugs/?46691>

                 Summary: grub-install always fail when installing into
unpartitioned filesystem using blocklist
                 Project: GNU GRUB
            Submitted by: kabe
            Submitted on: Wed 16 Dec 2015 02:53:02 AM GMT
                Category: Disk &amp; Partition
                Severity: Major
                Priority: 5 - Normal
              Item Group: Software Error
                  Status: None
                 Privacy: Public
             Assigned to: None
         Originator Name: kabe
        Originator Email: 
             Open/Closed: Open
         Discussion Lock: Any
                 Release: 
                 Release: Git master
         Reproducibility: Every Time
         Planned Release: None

    _______________________________________________________

Details:

Suppose you wanted to make a FAT-based GRUB2 floppy disk image, as follows:

>>>>
mkdosfs -F 12 -R 2 -I -C -S 512 /tmp/14.img 1440
mount -t vfat -o loop,sync,dirsync,umask=0,shortname=mixed /tmp/14.img
/media/fd || exit 1

grub-install \
--boot-directory=/media/fd/boot \
--modules='fat iso9660 biosdisk part_msdos part_bsd part_gpt halt reboot' \
--install-modules='cat linux16 halt reboot help normal ls chain fat ext2 ufs2
ntfs zfs xfs msdospart ' \
--fonts= --locales= --allow-floppy \
--force \
--debug --debug \
/dev/loop0

umount /media/fd
<<<<

grub-install will always fail with

>>>>
grub2-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..
grub2-install: info: will leave the core image on the filesystem.
grub2-install: info: opening the core image
`/media/fd/boot/grub2/i386-pc/core.img'.
grub2-install: info: FIEMAP failed. Reverting to FIBMAP.
grub2-install: info: saving <924,0,512>.
....
grub2-install: info: saving <1018,0,415>.
grub2-install: info: opening the core image
`/media/fd/boot/grub2/i386-pc/core.img'.
grub-core/osdep/hostdisk.c:395: reusing open device `/dev/loop0'
grub2-install: error: blocklists are invalid.
<<<<

This is due to bug/feature of accessing unpartitioned device on linux;
suppose block Y of /dev/loop0 is affected.
(1) grub read-aheads block Y from /dev/loop0
(2) grub writes via filesystem the core.img, which correctly rewrites
underlying block Y
(3) grub re-reads block Y via /dev/loop0 as blocklist of core.img to 
    verify content, 
    which kernel returns stale data of (1),
    resulting in verify mismatch; "error: blocklists are invalid"

grub-install purges its disk cache before core.img verification, but this 
isn't effective since stale data is returned by kernel itself.

This problem also occurs on real block device /dev/floppy .
This does NOT occur on partitioned device such as /dev/sdb1, for unknown
reason;
so did not affect standard HDD installs.

Fix: Open(2) /dev/loop0 with O_DIRECT flag. This fixed the problem. 
Patch attached.  Do
% find . -name '*setup_bios.o' |xargs rm
% find . -name '*hostdisk.o' |xargs rm
(or make clean) after applying patch for correct rebuild.

Unfortunately O_DIRECT requires block-aligned buffer for read(2)ing,
so grub_util_biosdisk_read() needs a whole mess of preparing aligned buffer.

----- 8< -----
Open(2) destination device with O_DIRECT flag. This fixes grub-install to
fail
when installing using a blocklist to a filesystem mounted via /dev/loop0
loopback.



    _______________________________________________________

File Attachments:


-------------------------------------------------------
Date: Wed 16 Dec 2015 02:53:02 AM GMT  Name: p  Size: 8kB   By: kabe
O_DIRECT patch
<http://savannah.gnu.org/bugs/download.php?file_id=35759>

    _______________________________________________________

Reply to this item at:

  <http://savannah.gnu.org/bugs/?46691>

_______________________________________________
  Message sent via/by Savannah
  http://savannah.gnu.org/


_______________________________________________
Bug-grub mailing list
Bug-grub@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-grub

Reply via email to