grub-install: error: diskfilter writes are not supported
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
grub2 (Ubuntu) |
Incomplete
|
Low
|
TJ |
Bug Description
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 workaround is to create a /boot/grub/
# grub-probe -t bios_hints -d /dev/md0
mduuid/
$ echo "($(sudo grub-probe -t bios_hints -d /dev/md0)) /dev/md0" | sudo tee -a /boot/grub/
Should then have added:
(mduuid/
After which, despite the warning message, this will install correctly:
# grub-install /dev/md0
Installing for i386-pc platform.
grub-install: warning: the drive name `mduuid/
cd').
Installation finished. No error reported.
If we want it to work without needing to manually intervene (which requires understanding the device.map syntax and that ignoring the warnings is OK), then the responsible code is ./grub-
static grub_err_t
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_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)
Changed in grub2 (Ubuntu): | |
status: | New → Triaged |
importance: | Undecided → Low |
assignee: | nobody → TJ (tj) |
description: | updated |
AFAIK, grub-installer (the udeb package) already has logic to install correctly on RAID systems, by using the underlying devices. This should be writing grub-*/ install- devices as well, which should be taking care of package upgrades.
diskfilter writes not being supported in grub is certainly not something new; so let's figure out why this is now becoming an issue when it was not typically all that critical in the past.
But yet more importantly, why do we need another bug than /bugs.launchpad .net/ubuntu/ +source/ grub2/+ bug/1274320?
https:/
I think this correctly describes the situation, and any work on having grub support RAID (or gracefully handle the fact that things are on RAID and thus can't save_env), should probably better go on the original bug.