** Description changed:
- Binary package hint: initrd-tools
+ Package hint: initrd-tools
+
Greetings!
The Bug:
--------
When booting Ubuntu from a frugal install, or when booting Ubuntu through
Grub2 directly from the Ubuntu LiveCD ISO-file, the booting process fails if
there's a partition with Windows hibernated on it.
Reportedly such boot also fails if there's an encrypted partition,
logically before the partition which holds the Ubuntu files.
In short: If such a partition exists, which...
... is (1) logicly BEFORE the partition which holds filesystem.squashfs
...AND (2) that partition contains a supported file system, ...
...AND (3) that partition is for some reason not able to be mounted, ...
then the booting process panics and fails.
Distros affected:
--------------------------
I encountered the problem with: ubuntu-10.10-desktop-i386.iso
The problem likely exists in all distros that use the same Casper startup
scripts.
I confirmed the same problem with the downstream
linuxmint-10-gnome-rc-i386.iso
The Problem:
------------
When the OS takes over from the boot loader, it needs to find its
"filesystem.squashfs". It knows the path, we've supplied it through the
"iso-scan/filename=" boot option, but it doesn't know on which device it is on.
- So what the init scripts currently do, is they start a big search loop
+ So what the init-scripts currently do, is they start a big search loop
through all partitions on all devices, mounting them in a row, looking
for the needed path in the file systems of those partitions.
- So far so good. But the problem is, if that search encounters a
- partition which for some reason can't be mounted, instead of silently
- ignoring that partition and moving on, the init script starts trying to
+ So far so good. But the problem is that if the search encounters a
+ partition that for some reason can't be mounted, instead of silently
+ ignoring that partition and moving on, the init-thing keeps trying to
mount that same partition over and over again, for a long time, until it
finally throws a tantrum, raises panic, and sets my computer on fire.
- On my computer, Windows is usually hibernated on the first partition of
- the first disk. Unfortunately, that is the first partition Ubuntu would
+ On my computer Windows is usually hibernated on the first partition of
+ the first disk. Unfortunately, that is the first partition Ubuntu will
encounter in its attempted search through all the partitions. If I
remove that hibernation file (which I don't like!), it allows Ubuntu to
boot normally.
On closer look, it turns out the culprit is in the file called "lupin-
helpers". No mater how I think about it, I find no good reason why it
would raise panic from within the loop if a certain partition refuses to
mount. What it really needs to do is to just silently ignore it, and
move on looking through the rest of the loop.
Posible workaround...
---------------------
Since Windows installations are most often on the first partition, my first
impulse was to simply reverse the device order in which the search loops.
i.e., in "lupin-helpers", change this line:
for dev in $(subdevices "${sysblock}"); do
to:
for dev in $(subdevices "${sysblock}" | tac -s' '); do
That would "fix" the problem for most setups. But that's not really
fixing the bug, it's just making the bug less likely to ever manifest
itself. A proper solution to the problem is the fix below.
The Fix:
--------
In file "lupin-helpers", replace this line:
try_mount "$devname" "$mountpoint" "$mountoptions" || return 1
...with the following:
mount -o $mountoptions $devname $mountpoint || true
I tested that by repackaging the initrd.lz, remastering the iso file, and
booting directly from it.
It works flawlesly, as far as I can see.
+
Even Better:
------------
- It was nice when Ubuntu implemented the "iso-scan/filename=" boot option.
But that's only half the problem with finding a file. The knowledge about
which device the file is on is also needed.
+ It was nice when Ubuntu implemented the "iso-scan/filename=" boot option.
But the path is only half the problem with finding a file. The knowledge about
which device the file is on is also needed. The bootloader can easily pass
along that knowledgeto the OS: the UUID of the needed partition.
- So, it would be really nice if the bootloader would tell the OS which
- partition was currently active at the time. Let's say, for example, my
- Grub script would pass, a "grub2-root=" parameter, like this:
+ For example, the Grub2 grub.cfg script can do something like this:
- linux ${someplace}/casper/vmlinuz grub2-root=${root}
iso-scan/filename=${isofile} ${other_boot_options}
- initrd ${whatever}/casper/initrd.lz
+ menuentry "Ubuntu 10.10" {
+ set isofile="/path/to/my/iso-dir/ubuntu-10.10-desktop-i386.iso"
+ loopback loop ${isofile}
+ probe -u $root -s bootloader-uuid
+ linux ${loop}/casper/vmlinuz bootloader-uuid=${bootloader-uuid} \
+ iso-scan/filename=${isofile} ${other_boot_options}
+ initrd (loop)/casper/initrd.lz
+ }
- When the OS takes over, it would find in "/proc/cmdline" BOTH the device AND
the path.
- (In my example, the OS would see "... grub2root=hd2,4
iso-scan/filename=/path/to/my/distro.iso ...")
-
- That way it won't be necessary to start that whole messy search loop
- through all the partitions on all the block devices. The OS can go
- straight to mounting that partition, (in this example, /dev/sdc4) and
- using the path on it. Cleaner and faster boot!
+ When the OS takes over, it would find in its "/proc/cmdline" BOTH the
+ device AND the path. So it won't be necessary to start that whole messy
+ search loop through all the partitions on all the block devices. The OS
+ can go straight to mounting that particular partition. The result is a
+ cleaner and faster boot!
Of course, if for some reason that path is not found on that device,
- THEN the init script could go through that same loop as before. But
- definitely without raising any panic from within the loop! And if it
- goes through the whole loop without finding the needed path, only then
- would be the proper time to panic.
+ only then the init script could go through that same loop as before. But
+ definitely without raising any panic from within the loop! And if, per
+ chance, it goes through the whole loop without finding the needed path,
+ only then it would be the proper time to panic.
Yours,
Purko Balkanski
- (ivan at y3klimousine dot com)
-
- Note: I suggested the name "grub2root=" to avoid possible confusion
- coming from the way legacy-grub names its partitions. (Legacy-grub would
- have named that same partition in the example as "hd2,3"). For
- completeness, we could also have the OS recognize a "legacy-grub-root="
- parameter.
** Changed in: initrd-tools (Ubuntu)
Status: New => Confirmed
--
Ubuntu fails to boot from ISO if there's a NTFS partition with Windows
hibernated on it.
https://bugs.launchpad.net/bugs/670096
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs