LiveUSB에서 Linux용 /cow는 어디에 부팅됩니까?

LiveUSB에서 Linux용 /cow는 어디에 부팅됩니까?

LiveUSB Linux를 실행할 때 ISO 9660 위에 어떤 파일이 추가되는지 확인하고 싶습니다. 시작 시 USB 드라이브의 persistence upper폴더가 work명확하게 표시됩니다. 나는 mountLiveUSB에서 "일반적인 방법"(w/out persistence)으로 부팅된 Linux에서 실행 중이며 통과 및 /마운트를 확인합니다. 하지만 주어졌습니다.overlayfsupperdir=/cow/uppersudo ls /cowno such file or directory

/cow내용은 어디서 , 어떻게 볼 수 있나요?

initrd추가 1: 통과 할 수 있었습니다 unmkinitramfs(참조https://unix.stackexchange.com/a/495524/446998)

$ find . -type f -exec bash -c 'cat {} | grep "/cow/upper" && ls -l {}' \;
    if [ ! -d /cow/upper ]; then
        mkdir -p /cow/upper
            /cow/lost+found|/cow/upper|/cow/log|/cow/crash|/cow/install-logs-*)     continue ;;
            mv "$cow_content" /cow/upper
    mount -t overlay -o "upperdir=/cow/upper,lowerdir=$mounts,workdir=/cow/work" "/cow" "$rootmnt" || panic "overlay mount failed"
-rw-r--r-- 1 alex alex 33834 Jun 24  2020 ./main/scripts/casper  

내가 구상하는 다음 단계는 /cow콘텐츠에 표시되지 않으므로 만드는 방법을 이해하는 것입니다.initrd

답변1

// kubuntu 22 lts livecd의 경험을 바탕으로

루트 이후

램디스크의 마지막 단계(/cdrom/casper/initrd)는 다음과 같습니다.
run-init {rootmnt}" "${init}" "$@"

비슷한 일을하는
chroot {rootmnt}" "${init}" "$@"

이 단계는 나중에 원래 마운트 지점의 관찰에 영향을 미칠 수 있습니다.

chroot 전에

다행스럽게도 루트를 시작하기 전에 대화형 셸에서 일시 중지할 수 있는 방법이 있습니다(계속하려면 Ctrl+D를 누르거나 종료하세요).

커널 부팅 cmdline args를 사용하면
break=top,premount,mount,mountroot,bottom,init
이 문제를 해결할 수 있습니다.

//BTW: (동일 ) 또는 manjaro 22만 지원하며 여러 값 조합은 지원하지 않습니다.break=premountbreak=ybreak=postmount,


또한 다른 명령줄 인수가 도움이 될 수도
debug있고, debug=y
램디스크가 실행되는 동안 자세한 로그를 켜는 것도 도움이 될 수 있습니다.

// boot args는 grub 메뉴에서 다음을 눌러 편집할 수 있습니다. e
// 이 정보는 ramdisk 스크립트를 읽어서 나옵니다.

가상 디스크에서

casper-rw 지속성을 처리하는 방법을 찾았습니다 unmkinitramfs. scripts/casper

./스크립트/캐스퍼

setup_overlay() {
    image_directory="$1"
    rootmnt="$2"

    # Mount up the writable layer, if it is persistent then it may well
    # tell us what format we should be using.
    mkdir -p /cow
    cowdevice="tmpfs"
    cow_fstype="tmpfs"
    cow_mountopt="rw,noatime,mode=755"

    # Looking for "$(root_persistence_label)" device or file
    if [ -n "${PERSISTENT}" ]; then
        cowprobe=$(find_cow_device "$(root_persistence_label)")
        if [ -b "${cowprobe}" ]; then
            cowdevice=${cowprobe}
            cow_fstype=$(get_fstype "${cowprobe}")
            cow_mountopt="rw,noatime"
        else
            [ "$quiet" != "y" ] && log_warning_msg "Unable to find the persistent medium"
        fi
    fi

    mount -t ${cow_fstype} -o ${cow_mountopt} ${cowdevice} /cow || panic "Can not mount $cowdevice on /cow"

여기의 코드는 영구 파티션을 결정하고 이를 마운트합니다.

chroot 뒤에 /cow를 유지하세요.

램디스크 셸에서 /cow /root가 준비된 후

mkdir /root/_cow
mount -o bind /cow /root/_cow

그런 다음 시스템으로 루트를 변경한 후 /_cow는 원래 외부 레이어인 /cow에 액세스할 수 있습니다.

답변2

LiveUSB 스틱은 오버레이 파일 시스템을 사용합니다.파일 시스템 덮어쓰기. 몇 가지 다른 것들이 있어서 어떤 것을 사용하는지 잘 모르겠지만 각각의 원리는 거의 동일합니다.

당신이 보는 루트 파일 시스템은 레이어로 구성됩니다. LiveUSB의 경우 이는 다음과 같습니다.

  • 쓰기 가능한 상위 레이어
  • 일반적으로 squashfs 파일에 저장되는 운영 체제 이미지의 읽기 전용 하위 계층을 포함합니다.

처음에는 상위 레이어(쓰기 가능)가 비어 있기 때문에 하위 레이어의 파일만 볼 수 있습니다. 새 파일을 쓰면 상위 레이어에 기록됩니다. 그러나 파일 이동, 파일 편집 등과 같은 다른 변경 사항으로 인해 실제로 파일이 하위 레이어에서 상위 레이어로 복사됩니다.

상위 레이어는 뭔가가 될 수 있습니다. LiveUSB에 지속성이 없으면 일반적으로 RAM에만 저장되는 임시 파일 시스템입니다. 하지만 지속성이 있다면 다를 수도 있고... 아마도 EXT4로 포맷된 쓰기 가능한 파일일 수도 있습니다.

쓰기 가능한 파일인 경우 파일을 찾아 overlayfs에 별도로 마운트하여 내부 내용을 확인할 수 있습니다.


/cow 내용을 어디서 어떻게 볼 수 있나요?

이것이 이 질문에서 가장 어려운 부분입니다. 사실, 적어도 그 이름으로는 더 이상 존재하지 않을 수도 있습니다.

initramfs 실행 중에 존재합니다. 그런데 initramfs가 호출되었습니다.피벗 루트이렇게 하면 이동되고... 마운트 해제를 시도할 가능성이 높으므로 이제 더 이상 사용자 영역 프로세스에서 실제로 볼 수 없습니다. 그래도 커널은 논리적으로 이를 설치해야 합니다.

계속해서 설치한다면 /cow그것이 무엇인지 정확히 찾아내어 다른 곳에 다시 설치할 수도 있습니다.

답변3

나는 마지막에 아이디어를 준 @yurenchen에 답변하기 전에 이것을 발견했습니다.

아래의 특정 명령은 캐스퍼 스크립트를 편집하여 번들 설치에 부팅 옵션을 추가합니다 shownmounts. initrd이렇게 하려면 initramfs(Linux Mint 21용 파일)의 압축을 풀고 다시 패키지해야 합니다. 나중에 liveUSO 시스템 부팅이 완료되면 /cow레이어가 표시됩니다./casper/cow

# add mount of /cow
sudo sed --in-place --regexp-extended -- 's|(if [[] -n "[$][{]SHOWMOUNTS[}]" []]; then)|\1\n\n        mkdir -p "${rootmnt}/${LIVE_MEDIA_PATH}/cow"\n        mount --bind /cow "${rootmnt}/${LIVE_MEDIA_PATH}/cow"\n|' $work_path/initrd/main/scripts/casper

# change mount option from "move" to "bind".
sudo sed --in-place --regexp-extended -- 's|(mount )-o move( "[$][{]d[}]" "[$][{]rootmnt[}]/[$][{]LIVE_MEDIA_PATH[}]/[$][{]d[#][#][*]/[}]")|\1--bind\2|' $work_path/initrd/main/scripts/casper

또한 보너스로 두 번째 명령은 마운트 유형을 변경합니다. 어떤 이유로 부팅된 시스템에 /caspersquashfs 폴더가 표시되지만 비어 있습니다. with 명령을 사용하면 내용이 채워지지 않고 채워집니다. PS 에서도 같은 일이 발생 /rofs하지만 상위 레이어가 하나만 있으면 배포판의 ISO에 여러 개의 squashfs 파일이 있을 수 있습니다.

관련 정보