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...@gmail.com>
From 13904ed6c79d18dbb32673b2c2f1f95c48e4fadc Mon Sep 17 00:00:00 2001 From: Hiroshi Ohkubo <ohkubo...@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...@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...@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...@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...@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...@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