USB 라이브 시스템을 안전하게 꺼내고 사용자에게 삭제를 요청하세요.

USB 라이브 시스템을 안전하게 꺼내고 사용자에게 삭제를 요청하세요.

저는 업무를 위해 Clonezilla를 사용하여 라이브 USB를 준비하고 있습니다. 사용자 정의 bash 스크립트를 실행하여 디스크를 복제합니다. 이 USB는 여러 컴퓨터에서 사용할 수 있도록 여러 다른 USB에 복제됩니다.

복제할 이미지(22G)가 USB에 있으므로 Clonezilla를 RAM에서 실행할 수 없습니다.

USB 미디어를 제거하도록 요청한 다음 Enter 키를 눌러 컴퓨터를 다시 시작하는 라이브 Linux 배포 설치 프로그램의 표준 동작을 내 스크립트에 복제하고 싶습니다.

예제 스크립트가 사용되었지만 eject이는 올바르지 않은 것 같습니다.

eject /dev/sdb
read -r -p 'Remove USB and press Enter' # not executed since the USB is no longer plugged
reboot

나는 ~가되고 싶다매우USB는 업무용으로 사용되는 USB가 많고 당연히 손상될 위험이 없으므로 안전하게 제거하십시오.

가장 좋고 안전한 방법은 무엇입니까?

자, 겉보기에 사소해 보이는 일에 왜 그렇게 많은 노력을 기울이는 걸까요? USB는 수백 대의 머신에 배포될 것입니다. 자동화할 수 있는 모든 것에는 시간을 벌고 오류를 방지하는 것이 포함됩니다. 사용자는 클론이 유효한지 확인한 후 재부팅해야 합니다. 그러나 USB가 여전히 연결되어 있으면 머신은 기본 OS 대신 USB로 부팅됩니다.

이 질문은 관련이 있습니다하지만 실시간 시스템에서는 작동하지 않는다는 것을 알고 있습니다.


다음은 filesystem.squashfsISO에서 파일의 압축을 푼 Lubuntu의 스크립트입니다. 나는 아직도 그것을 이해하려고 노력하고 있습니다. 어떤 도움이라도 주시면 감사하겠습니다.

#! /bin/sh

# Author: Mathieu Trudel-Lapierre <[email protected]>
#         Tollef Fog Heen <[email protected]>
#         Marco Amadori <[email protected]>
#

PATH=/usr/sbin:/usr/bin:/sbin:/bin
NAME=casper
SCRIPTNAME=/etc/init.d/${NAME}
DO_SNAPSHOT=/sbin/${NAME}-snapshot

# Exit if system was not booted by casper
[ -f /run/.casper-boot ] || exit 0

# Exit if the system was booted from an ISO image rather than a physical CD
grep -qs find_iso= /proc/cmdline && exit 0

# Read configuration variable file if it is present
[ -r /etc/$NAME.conf ] && . /etc/$NAME.conf

# Try to cache everything we're likely to need after ejecting.  This
# is fragile and simple-minded, but our options are limited.
cache_path() {
    path="$1"

    if [ -d "$path" ]; then
        for f in $(find "$path" -type f); do
            cache_path "$f"
        done
    elif [ -f "$path" ] && [ ! -L "$path" ]; then
        if [ -x "$path" ]; then
            if file -L "$path" | grep -q 'dynamically linked'; then
                for lib in $(ldd "$path" | awk '{ print $3 }'); do
                    cache_path "$lib"
                done
            fi
        fi
        echo -n >> "$path"
    fi
}

do_stop ()
{
    logger -t ${NAME} "resyncing snapshots and caching reboot files..."

    if [ ! -z "${ROOTSNAP}" ]; then
        $DO_SNAPSHOT --resync-string="${ROOTSNAP}"
    fi

    if [ ! -z "${HOMESNAP}" ]; then
        $DO_SNAPSHOT --resync-string="${HOMESNAP}"
    fi

    # check for netboot
    if [ ! -z "${NETBOOT}" ] || grep -qs netboot /proc/cmdline || grep -qsi root=/dev/nfs /proc/cmdline  || grep -qsi root=/dev/cifs /proc/cmdline ; then
        return 0
    fi

    # Don't prompt to eject the SD card on Babbage board, where we reuse it
    # as a quasi-boot-floppy. Technically this uses a bit of ubiquity
    # (archdetect), but since this is mostly only relevant for
    # installations, who cares ...
    if type archdetect >/dev/null 2>&1; then
        subarch="$(archdetect)"
        case $subarch in
            arm*/imx51)
                return 0
                ;;
        esac
    fi

    prompt=1
    if grep -qs noprompt /proc/cmdline || [ -e /run/casper-no-prompt ]; then
        prompt=
    fi

    for path in $(which halt) $(which reboot) /bin/chvt /etc/rc?.d /etc/default $(which stty) /bin/plymouth /lib/plymouth /lib/*/plymouth /lib/systemd /etc/systemd /lib/*/libnss_files* /etc/nsswitch.conf /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf /usr/share/fonts/truetype/ubuntu/Ubuntu-R.ttf /usr/share/fonts/truetype/ubuntu/UbuntuMono-R.ttf /etc/fonts/fonts.conf /etc/fonts/conf.d/60-latin.conf; do
        cache_path "$path"
    done

    device="$(grep " /cdrom " /proc/mounts | cut -d' ' -f1)" || device=
    # If /cdrom isn't mounted, don't try to eject it
    if [ -z "$device" ]; then
        return 0
    fi

    # If the device exists but can't be found in /sys/block, it's most likely a partition
    # so unmount it (lazy mode) and sync
    if [ -b "$device" ] && [ ! -f "/sys/block/$(basename $device)/removable" ]; then
        umount -l $device >/dev/null 2>&1
        sync
        # from now on operate on the partition's block device
        device=/dev/$(basename "$(readlink -f /sys/class/block/$(basename $device)/..)")
    fi

    # If we're still there, then we're probably a cdrom or other media
    # ship the eject if the kernel says the media isn't removable
    if [ "$(cat /sys/block/$(basename $device)/removable)" = "0" ]; then
        return 0
    fi

    # XXX - i18n
    MSG="Please remove the installation medium, then press ENTER: "
    MSG_FALLBACK="Please remove the installation medium, then reboot."

    if [ "$prompt" ]; then
        if [ -x /bin/plymouth ] && plymouth --ping; then
            chvt 63
            plymouth message --text="$MSG"
            clear > /dev/tty1
            echo $MSG_FALLBACK > /dev/tty1
        else
            stty sane < /dev/console
            echo $MSG > /dev/console
        fi
    fi

    eject -p -m $device >/dev/null 2>&1

    [ "$prompt" ] || return 0

    if [ -x /bin/plymouth ] && plymouth --ping; then
        plymouth watch-keystroke > /dev/null
    else
        read x < /dev/console
    fi
}

do_stop


관련 정보