33

Every time update-grub is run all hard drives are scanned. Each drives that is in standby state will spin up to go idle. This is a waste of energy. We use update-grub version 1.98:

# update-grub -v
grub-mkconfig (GRUB) 1.98+20100804-14+squeeze1

Regression

  1. There is a GRUB_DISABLE_OS_PROBER=true option in the /etc/default/grub file. But that seems to only work from version 2 and up. At least it doesn't stop scanning all drives in our version 1.98.

  2. There is a /etc/grub.d/20_linux_xen script that might be run as a part of update-grub. After removing execute rights for all users with chmod a-x /etc/grub.d/20_linux_xen all drives do still spin up.

How to stop update-grub from scanning each and every hard drive?

4
  • It's just a shell script... Modify it? It should only run after kernel updates, which doesn't occur very often.
    – jordanm
    Nov 17, 2012 at 23:04
  • One of the script lines executes /usr/sbin/grub-probe --target=device /. That command also causes all drives to spin up. The /usr/sbin/grub-probe is not a shell script.
    – Pro Backup
    Nov 17, 2012 at 23:17
  • How often are you running update-grub? This should only happen when you install a new kernel, so who cares?
    – psusi
    Nov 18, 2012 at 3:00
  • I know, that entire picojoule it uses is such a waste - if you ran update-grub 24/7 for a month on 1000 computers with 3 HDDs each, it might add a cent or two to your electric bill.
    – tkbx
    Dec 29, 2012 at 21:01

5 Answers 5

22

In file /etc/grub.d/30_os-prober the line

OSPROBED="`os-prober | tr ' ' '^' | paste -s -d ' '`"

makes all drives spin (standby -> idle). Os-prober is a utility to find Linux installations at drives other then your boot drive. It is the os-prober that needs to be disabled.

  1. One way is to remove the package: apt-get --purge remove os-prober.
  2. Another way is to remove executable rights for os-prober. First find the location of os-prober using $ which os-prober. Output might look like: /usr/bin/os-prober. The remove the executable rights for all users for that file: # chmod a-x /usr/bin/os-prober
  3. Another way is to remove executable rights for 30_os-prober. Find the location of 30_os-prober using $ locate /30_os-prober. Output might look like: /etc/grub.d/30_os-prober. The remove the executable rights for all users for that file: # chmod a-x /etc/grub.d/30_os-prober
  4. Yet another way is to skip the execution of /etc/grub.d/30_os-prober. For example by making the GRUB_DISABLE_OS_PROBER=true option work in our grub version 1.98. This can be done by inserting in file /etc/grub.d/30_os-prober the code below the line set -e:

...

if [ "x${GRUB_DISABLE_OS_PROBER}" = "xtrue" ]; then
  exit 0
fi
1
  • 3
    #4 - GRUB_DISABLE_OS_PROBER=true works as expected on GRUB 2.02/Buster/Debian 10. It was scanning 22 of my iscsi drives across all the VM's hosted on this machine! Neither fast nor useful! Feb 10, 2020 at 1:48
7

For those wondering if it's really worth the effort, yes it is. Perhaps not for energy saving but today I encountered a problem with update-grub as it wanted to probe for both /dev/sda (my harddisk) and /dev/sdc (a USB-stick). Without the latter inserted into my laptop, update-grub would hang, even though there is actually no OS on my USB-stick installed nor did I ever boot from this stick. As the USB-stick recently broke, I needed a way for update-grub to continue (alive) without it. Fortuately, GRUB_DISABLE_OS_PROBER=true just did the trick. :)

3
  • 1
    I had the inverse problem: update-grub failing if an USB stick was present. The USB stick was a bit unusual, since it has Easy2Boot installed. But since this was on a kiosk with the update-grub command being issued from a script placed on that very USB stick, this solution was very welcome.
    – noamik
    Jul 10, 2017 at 15:48
  • another problem is if you use LVM and use snapshots... grub will mount the snapshot and add them to the boot menu, but then it will sometimes fail to unmount them, and it will be impossible to remove the snapshot , so when/if the snapshot is compltetely full, your only change will be a reboot
    – am70
    Jan 8, 2021 at 8:16
  • see also unix.stackexchange.com/a/628160/121890
    – am70
    Jan 8, 2021 at 8:39
3

(Is this really worth the time and effort to fix?)

As you mentioned, the probing is probably happening when grub-mkconfig calls grub-probe. You could modify grub-mkconfig by simply hardcoding the result of the grub-probe calls. It is used to fill GRUB_DEVICE, GRUB_DEVICE_UUID, GRUB_DEVICE_BOOT, GRUB_DEVICE_BOOT_UUID, and GRUB_FS.

2

See my solution here to selectively disable which partitions are checked by os-prober with a small patch.

The configuration of GRUB_OS_PROBER_SKIP_LIST="UUID@device_path" in /etc/default/grub:

  • reduces the numbers of devices in ${OSPROBED} used by /etc/grub.d/30_os-prober

  • which stops the check with ${grub_probe} --target=fs_uuid --device

1
  • This works now (Ubuntu 21.10) without patch. Just make the skip list in /etc/default/grub and you are done.
    – emk2203
    Jun 15, 2021 at 13:20
0

I know this is an old post, but I found another way to accomplish this that doesn't involve making changes to the scripts. in /etc/grub.d/ I renamed the file 30_os-prober to .30_os-prober (start with a period) and it is skipped during the update even though it shows in the same place in ls if you use -a.

0

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .