This has and continues to affect all releases of Ubuntu including 18.04 and probably beyond.
This bug is to track potential fixes to allow writes for some common scenarios - the easiest being a RAID-1 mirror where it is just a case of mapping the writes to the underlying device nodes.
In summary, upstream GRUB has a 'diskfilter' module for dealing with LVM (lvm2), Device Mapper (dmsetup), Multiple Device (mdadm). The module only supports reading from these devices.
When trying to install to such a device the operation fails with:
$ grub-install /dev/md0
Installing for i386-pc platform.
grub-install: error: diskfilter writes are not supported.
There are work-arounds which involve identifying and operating on the underlying device, e.g: for a RAID-1 mirror:
It should be possible to factor out and re-use the common device and offset calculation code from these functions since all but the actual grub_disk_write() only do in-memory operations.
Related bugs:
Bug #701351 "grub-install fails to install on a raid1 array" (same issue) Bug #1274320 "Error: diskfilter writes are not supported" (boot-time fix)
This has and continues to affect all releases of Ubuntu including 18.04 and probably beyond.
This bug is to track potential fixes to allow writes for some common scenarios - the easiest being a RAID-1 mirror where it is just a case of mapping the writes to the underlying device nodes.
In summary, upstream GRUB has a 'diskfilter' module for dealing with LVM (lvm2), Device Mapper (dmsetup), Multiple Device (mdadm). The module only supports reading from these devices.
When trying to install to such a device the operation fails with:
$ grub-install /dev/md0
Installing for i386-pc platform.
grub-install: error: diskfilter writes are not supported.
There are work-arounds which involve identifying and operating on the underlying device, e.g: for a RAID-1 mirror:
$ cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdb[1] sda[0]
244198400 blocks super 1.0 [2/2] [UU]
$ grub-install /dev/sda
$ grub-install /dev/sdb
These cam be sub-optimal in some circumstances as well as breaking some standard OS package-upgrade operations.
The responsible code is ./grub- core/disk/ diskfilter. c:
static grub_err_t diskfilter_ write (grub_disk_t disk __attribute ((unused)),
grub_disk_ addr_t sector __attribute ((unused)), NOT_IMPLEMENTED _YET,
"diskfilter writes are not supported");
grub_
grub_size_t size __attribute ((unused)),
const char *buf __attribute ((unused)))
{
return grub_error (GRUB_ERR_
}
The read functionality gives some indication of how the write operation might be organised:
grub_diskfilter _read() diskfilter_ read_node( ) disk_read( )
>read_lv()
>>read_segment()
>>>grub_
>>>>grub_
It should be possible to factor out and re-use the common device and offset calculation code from these functions since all but the actual grub_disk_write() only do in-memory operations.
Related bugs:
Bug #701351 "grub-install fails to install on a raid1 array" (same issue)
Bug #1274320 "Error: diskfilter writes are not supported" (boot-time fix)