Bug#814960: cdrom-detect: Premounted /cdrom directory causes an error at apt-setup
Package: cdrom-detect
Version: 1.61
Severity: normal
Tags: patch
Dear Debian Install System Team,
Debian installer returns to the main menu at apt-setup-udeb
when we mount ISO image on /cdrom by hand.
http://anonscm.debian.org/cgit/d-i/cdrom-detect.git/tree/debian/cdrom-detect.postinst#n83
> # Is a cdrom already mounted? If so, assume it's the right one.
> mount | grep -q 'on /cdrom' && set_suite_and_codename && exit 0
> if [ -e /cdrom/.disk/info ]; then
> CDNAME=$(cat /cdrom/.disk/info)
> log "Detected CD '$CDNAME'"
> set_suite_and_codename
> exit 0
> fi
If there is an already mounted /cdrom directory, the installer skips
the rest of the commands, especially:
http://anonscm.debian.org/cgit/d-i/cdrom-detect.git/tree/debian/cdrom-detect.postinst#n268
> # Hey, we're done
> db_subst cdrom-detect/success cdname "$CDNAME"
> db_input low cdrom-detect/success || [ $? -eq 30 ]
> db_go
>
> anna-install apt-mirror-setup || true
> if [ ! -e /cdrom/.disk/base_installable ]; then
> log "Base system not installable from CD, requesting choose-mirror"
> anna-install choose-mirror || true
> else
> anna-install apt-cdrom-setup || true
>
> # Install <codename>-support udeb (if available).
> db_get cdrom/codename
> anna-install $RET-support || true
> fi
This missing configuration causes an error at:
https://anonscm.debian.org/cgit/d-i/apt-setup.git/tree/generators/50mirror#n58
> db_metaget apt-setup/use/netinst description
Error message (with 'set -x'):
> + db_metaget apt-setup/use/netinst description
(snip)
> + RET=10 apt-setup/use/netinst doesn't exist
> + return 10
This error prevents further installation.
Archived Bug#636145 might be the same issue. (see Message #22 and #27)
This is similar to Bug#594344:
Message #14
> I wonder, though, if some of the other steps later on (after the exit 0 when a
> premounted /cdrom is found) might be also useful to do, such as validating the
> Release file, precaching, and falling back to looking for a mirror when all
> else fails. But this patch will at least allow debian-installer-launcher to
> work in what I hope is a fairly unintrusive way.
Unfortunately, that kind of issue happened.
A patch sequence attached.
I feel this "maybe-intrusive" way is the best, however,
I can write another fix if you don't feel so.
Note: We may need to ask the user some questions and set some
variables for other installations, in addition to this fix.
Confirmed on: debian-testing-amd64-netinst.iso (daily, today)
on qemu-kvm with -cdrom option.
1. Before cdrom-detect, execute:
# mkdir /cdrom
# mount -t iso9660 /dev/cdrom /cdrom
2. Continue the installation as usual.
3. At apt-setup-udeb, the installer returns to the main menu.
4. Activating "Configure the package manager" gets the same result.
Best regards,
Hiroshi Ohkubo
--
Hiroshi Ohkubo
<ohkubo.fs@gmail.com>
From 13904ed6c79d18dbb32673b2c2f1f95c48e4fadc Mon Sep 17 00:00:00 2001
From: Hiroshi Ohkubo <ohkubo.fs@gmail.com>
Date: Sat, 13 Feb 2016 14:48:22 +0900
Subject: [PATCH 1/3] Revert commit 9191d29
Revert "Set cdrom/suite and cdrom/codename
when premounted /cdrom found. Closes: #594344."
The bug will be fixed by the next commit,
as long as another one.
This reverts commit 9191d29c5b20c3216078fc9a4979a556cb2f7c89.
Signed-off-by: Hiroshi Ohkubo <ohkubo.fs@gmail.com>
---
debian/cdrom-detect.postinst | 37 ++++++++++++++++---------------------
1 file changed, 16 insertions(+), 21 deletions(-)
diff --git a/debian/cdrom-detect.postinst b/debian/cdrom-detect.postinst
index 6bf2454..da7dadf 100755
--- a/debian/cdrom-detect.postinst
+++ b/debian/cdrom-detect.postinst
@@ -39,24 +39,6 @@ try_mount() {
return $ret
}
-# Set the suite and codename used by base-installer and base-config
-# to the suite/codename that is on the CD. In case there are multiple
-# suites, prefer the one in default-release.
-set_suite_and_codename() {
- for dir in $(cat /etc/default-release) $(ls -1 /cdrom/dists/); do
- relfile="/cdrom/dists/$dir/Release"
- if [ -e $relfile ]; then
- suite=$(sed -n 's/^Suite: *//p' "$relfile")
- codename=$(sed -n 's/^Codename: *//p' "$relfile")
- log "Detected CD with '$suite' ($codename) distribution"
- db_set cdrom/suite "$suite"
- db_set cdrom/codename "$codename"
-
- break
- fi
- done
-}
-
OS=$(udpkg --print-os)
case "$OS" in
kfreebsd)
@@ -81,11 +63,10 @@ case "$OS" in
esac
# Is a cdrom already mounted? If so, assume it's the right one.
-mount | grep -q 'on /cdrom' && set_suite_and_codename && exit 0
+mount | grep -q 'on /cdrom' && exit 0
if [ -e /cdrom/.disk/info ]; then
CDNAME=$(cat /cdrom/.disk/info)
log "Detected CD '$CDNAME'"
- set_suite_and_codename
exit 0
fi
@@ -253,7 +234,21 @@ for pooldir in /cdrom/pool/*/*; do
done
db_progress STOP
-set_suite_and_codename
+# Set the suite and codename used by base-installer and base-config
+# to the suite/codename that is on the CD. In case there are multiple
+# suites, prefer the one in default-release.
+for dir in $(cat /etc/default-release) $(ls -1 /cdrom/dists/); do
+ relfile="/cdrom/dists/$dir/Release"
+ if [ -e $relfile ]; then
+ suite=$(sed -n 's/^Suite: *//p' "$relfile")
+ codename=$(sed -n 's/^Codename: *//p' "$relfile")
+ log "Detected CD with '$suite' ($codename) distribution"
+ db_set cdrom/suite "$suite"
+ db_set cdrom/codename "$codename"
+
+ break
+ fi
+done
if [ -z "$suite" ]; then
log "Error reading Release file; unable to determine distribution"
--
2.1.4
From 26fe9b02f794efa467fc952fab0ff42fdad96b57 Mon Sep 17 00:00:00 2001
From: Hiroshi Ohkubo <ohkubo.fs@gmail.com>
Date: Sat, 13 Feb 2016 14:57:10 +0900
Subject: [PATCH 2/3] Don't exit when premounted /cdrom found
Return from newly extracted detect_and_mount_cdrom instead.
Signed-off-by: Hiroshi Ohkubo <ohkubo.fs@gmail.com>
---
debian/cdrom-detect.postinst | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/debian/cdrom-detect.postinst b/debian/cdrom-detect.postinst
index da7dadf..5f5cf1a 100755
--- a/debian/cdrom-detect.postinst
+++ b/debian/cdrom-detect.postinst
@@ -62,12 +62,13 @@ case "$OS" in
esac
+detect_and_mount_cdrom() {
# Is a cdrom already mounted? If so, assume it's the right one.
-mount | grep -q 'on /cdrom' && exit 0
+mount | grep -q 'on /cdrom' && return 0
if [ -e /cdrom/.disk/info ]; then
CDNAME=$(cat /cdrom/.disk/info)
log "Detected CD '$CDNAME'"
- exit 0
+ return 0
fi
hw-detect cdrom-detect/detect_progress_title || true
@@ -95,7 +96,7 @@ while true; do
devices="$(list-devices cd; list-devices maybe-usb-floppy)"
for device in $devices; do
if try_mount $device $CDFS; then
- break 2
+ return 0
fi
done
@@ -103,11 +104,11 @@ while true; do
for device in $devices; do
if try_mount $device $CDFS; then
db_set cdrom-detect/hybrid true
- break 2
+ return 0
fi
if try_mount $device $FATFS; then
db_set cdrom-detect/usb-hdd true
- break 2
+ return 0
fi
done
@@ -194,7 +195,7 @@ while true; do
if mount -t $CDFS -o $OPTIONS $device /cdrom; then
log "CD-ROM mount succeeded: device=$device fstype=$CDFS"
db_set cdrom-detect/cdrom_fs $CDFS
- break
+ return 0
else
log "CD-ROM mount failed: device=$device fstype=$CDFS"
fail
@@ -203,6 +204,8 @@ while true; do
fail
fi
done
+}
+detect_and_mount_cdrom
# Check for unetbootin files
UNETBOOTIN_FILES="ubnfilel.txt ubninit ubnkern ubnpathl.txt"
--
2.1.4
From 3befa4d1e65c9471f9321339c088b90c834b6be0 Mon Sep 17 00:00:00 2001
From: Hiroshi Ohkubo <ohkubo.fs@gmail.com>
Date: Sat, 13 Feb 2016 15:02:41 +0900
Subject: [PATCH 3/3] Cosmetic fix
* Define detect_and_mount_cdrom earlier
* Indent
* Remove trailing spaces
Signed-off-by: Hiroshi Ohkubo <ohkubo.fs@gmail.com>
---
debian/cdrom-detect.postinst | 289 ++++++++++++++++++++++---------------------
1 file changed, 145 insertions(+), 144 deletions(-)
diff --git a/debian/cdrom-detect.postinst b/debian/cdrom-detect.postinst
index 5f5cf1a..0c92e8e 100755
--- a/debian/cdrom-detect.postinst
+++ b/debian/cdrom-detect.postinst
@@ -39,6 +39,150 @@ try_mount() {
return $ret
}
+detect_and_mount_cdrom() {
+ # Is a cdrom already mounted? If so, assume it's the right one.
+ mount | grep -q 'on /cdrom' && return 0
+ if [ -e /cdrom/.disk/info ]; then
+ CDNAME=$(cat /cdrom/.disk/info)
+ log "Detected CD '$CDNAME'"
+ return 0
+ fi
+
+ hw-detect cdrom-detect/detect_progress_title || true
+
+ log "Searching for Debian installation media..."
+
+ mkdir /cdrom 2>/dev/null || true
+
+ # Need to wait for the usb device scan to complete
+ if [ "$OS" = "linux" ]; then
+ for count in 1 2 3 4 5 6 8 9 10; do
+ devices="$(list-devices cd; list-devices maybe-usb-floppy)"
+ log "Devices: '$devices'"
+ if [ -n "$devices" ]; then
+ break 2
+ else
+ sleep 1
+ fi
+ done
+ fi
+
+ while true; do
+ WRONG=
+
+ devices="$(list-devices cd; list-devices maybe-usb-floppy)"
+ for device in $devices; do
+ if try_mount $device $CDFS; then
+ return 0
+ fi
+ done
+
+ devices="$(list-devices usb-partition)"
+ for device in $devices; do
+ if try_mount $device $CDFS; then
+ db_set cdrom-detect/hybrid true
+ return 0
+ fi
+ if try_mount $device $FATFS; then
+ db_set cdrom-detect/usb-hdd true
+ return 0
+ fi
+ done
+
+
+ if [ "$WRONG" ]; then
+ db_input critical cdrom-detect/wrong-cd || [ $? -eq 30 ]
+ db_go
+ fail
+ fi
+
+ # If a device was detected but the mount failed, ask for the CD.
+ if [ -n "$devices" ]; then
+ db_input critical cdrom-detect/retry || [ $? -eq 30 ]
+ db_go
+ db_get cdrom-detect/retry
+ if [ "$RET" = "true" ]; then
+ log "Unmounting CD just to be sure"
+ umount /cdrom 2>/dev/null || true
+ continue
+ else
+ fail
+ fi
+ fi
+
+ # If no device was detected, perhaps a driver floppy is needed.
+ if [ -e /usr/lib/debian-installer/retriever/media-retriever ]; then
+ db_input critical cdrom-detect/load_media
+ db_go
+ db_get cdrom-detect/load_media
+ if [ "$RET" = true ]; then
+ anna media-retriever
+ hw-detect cdrom-detect/detect_progress_title || true
+ continue
+ fi
+ fi
+
+ # Otherwise manual configuration may be needed
+ db_input critical cdrom-detect/manual_config || [ $? -eq 30 ]
+ db_go
+ db_get cdrom-detect/manual_config
+
+ if [ "$RET" = true ]; then
+ case "$OS" in
+ linux)
+ modules=none
+ for i in $(ls -1 /lib/modules/*/kernel/drivers/cdrom/ | \
+ sed 's/\.ko$//' | sed 's/\.o$//'); do
+ modules="$modules, $i"
+ done
+
+ db_subst cdrom-detect/cdrom_module choices "$modules"
+ db_input critical cdrom-detect/cdrom_module || [ $? -eq 30 ]
+ db_go
+
+ db_get cdrom-detect/cdrom_module
+ if [ "$RET" != none ]; then
+ modprobe $RET
+ fi
+ ;;
+ kfreebsd)
+ modules=none
+ for i in $(ls -1 /lib/modules/$(uname -r)/ | \
+ sed 's/\.ko$//'); do
+ modules="$modules, $i"
+ done
+
+ db_subst cdrom-detect/cdrom_module choices "$modules"
+ db_input critical cdrom-detect/cdrom_module || [ $? -eq 30 ]
+ db_go
+
+ db_get cdrom-detect/cdrom_module
+ if [ "$RET" != none ]; then
+ kldload $RET
+ fi
+ ;;
+ esac
+
+ db_input critical cdrom-detect/cdrom_device || [ $? -eq 30 ]
+ db_go
+
+ db_get cdrom-detect/cdrom_device
+ device="$RET"
+
+ if mount -t $CDFS -o $OPTIONS $device /cdrom; then
+ log "CD-ROM mount succeeded: device=$device fstype=$CDFS"
+ db_set cdrom-detect/cdrom_fs $CDFS
+ return 0
+ else
+ log "CD-ROM mount failed: device=$device fstype=$CDFS"
+ fail
+ fi
+ else
+ fail
+ fi
+ done
+}
+
OS=$(udpkg --print-os)
case "$OS" in
kfreebsd)
@@ -59,152 +203,9 @@ case "$OS" in
*)
log "Unknown OS '$OS', exiting"
exit 0
-
-esac
-
-detect_and_mount_cdrom() {
-# Is a cdrom already mounted? If so, assume it's the right one.
-mount | grep -q 'on /cdrom' && return 0
-if [ -e /cdrom/.disk/info ]; then
- CDNAME=$(cat /cdrom/.disk/info)
- log "Detected CD '$CDNAME'"
- return 0
-fi
-
-hw-detect cdrom-detect/detect_progress_title || true
-
-log "Searching for Debian installation media..."
-
-mkdir /cdrom 2>/dev/null || true
-
-# Need to wait for the usb device scan to complete
-if [ "$OS" = "linux" ]; then
- for count in 1 2 3 4 5 6 8 9 10; do
- devices="$(list-devices cd; list-devices maybe-usb-floppy)"
- log "Devices: '$devices'"
- if [ -n "$devices" ]; then
- break 2
- else
- sleep 1
- fi
- done
-fi
-while true; do
- WRONG=
-
- devices="$(list-devices cd; list-devices maybe-usb-floppy)"
- for device in $devices; do
- if try_mount $device $CDFS; then
- return 0
- fi
- done
-
- devices="$(list-devices usb-partition)"
- for device in $devices; do
- if try_mount $device $CDFS; then
- db_set cdrom-detect/hybrid true
- return 0
- fi
- if try_mount $device $FATFS; then
- db_set cdrom-detect/usb-hdd true
- return 0
- fi
- done
-
-
- if [ "$WRONG" ]; then
- db_input critical cdrom-detect/wrong-cd || [ $? -eq 30 ]
- db_go
- fail
- fi
-
- # If a device was detected but the mount failed, ask for the CD.
- if [ -n "$devices" ]; then
- db_input critical cdrom-detect/retry || [ $? -eq 30 ]
- db_go
- db_get cdrom-detect/retry
- if [ "$RET" = "true" ]; then
- log "Unmounting CD just to be sure"
- umount /cdrom 2>/dev/null || true
- continue
- else
- fail
- fi
- fi
-
- # If no device was detected, perhaps a driver floppy is needed.
- if [ -e /usr/lib/debian-installer/retriever/media-retriever ]; then
- db_input critical cdrom-detect/load_media
- db_go
- db_get cdrom-detect/load_media
- if [ "$RET" = true ]; then
- anna media-retriever
- hw-detect cdrom-detect/detect_progress_title || true
- continue
- fi
- fi
-
- # Otherwise manual configuration may be needed
- db_input critical cdrom-detect/manual_config || [ $? -eq 30 ]
- db_go
- db_get cdrom-detect/manual_config
-
- if [ "$RET" = true ]; then
- case "$OS" in
- linux)
- modules=none
- for i in $(ls -1 /lib/modules/*/kernel/drivers/cdrom/ | \
- sed 's/\.ko$//' | sed 's/\.o$//'); do
- modules="$modules, $i"
- done
-
- db_subst cdrom-detect/cdrom_module choices "$modules"
- db_input critical cdrom-detect/cdrom_module || [ $? -eq 30 ]
- db_go
-
- db_get cdrom-detect/cdrom_module
- if [ "$RET" != none ]; then
- modprobe $RET
- fi
- ;;
- kfreebsd)
- modules=none
- for i in $(ls -1 /lib/modules/$(uname -r)/ | \
- sed 's/\.ko$//'); do
- modules="$modules, $i"
- done
-
- db_subst cdrom-detect/cdrom_module choices "$modules"
- db_input critical cdrom-detect/cdrom_module || [ $? -eq 30 ]
- db_go
-
- db_get cdrom-detect/cdrom_module
- if [ "$RET" != none ]; then
- kldload $RET
- fi
- ;;
- esac
-
- db_input critical cdrom-detect/cdrom_device || [ $? -eq 30 ]
- db_go
-
- db_get cdrom-detect/cdrom_device
- device="$RET"
+esac
- if mount -t $CDFS -o $OPTIONS $device /cdrom; then
- log "CD-ROM mount succeeded: device=$device fstype=$CDFS"
- db_set cdrom-detect/cdrom_fs $CDFS
- return 0
- else
- log "CD-ROM mount failed: device=$device fstype=$CDFS"
- fail
- fi
- else
- fail
- fi
-done
-}
detect_and_mount_cdrom
# Check for unetbootin files
--
2.1.4
Reply to: