18

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?

  • It's just a shell script... Modify it? It should only run after kernel updates, which doesn't occur very often. – jordanm Nov 17 '12 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 '12 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 '12 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 '12 at 21:01
13

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
5

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. :)

  • 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 '17 at 15:48
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.

0

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

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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.