시스템이 라이브 USB로 실행 중인지 BASH에서 확인하는 방법

시스템이 라이브 USB로 실행 중인지 BASH에서 확인하는 방법

저는 USB 장치에 라이브 시스템으로 구울 수 있는 ISO 이미지를 만들고 있습니다. 라이브 USB를 부팅하는 시스템의 내부 드라이브에 설치하기 위해 바탕 화면에 설치 프로그램을 실행할 수 있는 아이콘이 있습니다.

설치 후 아이콘을 제거하고 싶습니다. 이를 위해 시스템이 라이브 USB로 실행되고 있는지 아니면 실제로 설치되어 있는지를 감지하는 스크립트를 작성하겠습니다. BASH에서 이를 감지할 수 있는 방법이 있나요?

감사해요!

답변1

에서 루트 파일 시스템 항목을 확인할 수 있습니다 /proc/mounts. CD에서 부팅하는 경우 파일 시스템으로 iso9660을 사용하고 /dev/sr0.

물론 설치 중에 어딘가에 파일을 생성하고 해당 파일의 존재를 표시기로 사용할 수 있습니다.

답변2

Linux 라이브 운영 체제(USB 또는 CD)는 파일 시스템을 RAM에 저장하지만 일반 운영 체제는 데이터를 디스크의 파티션에 보관합니다. bash에서 이러한 차이점을 감지하기 위해 두 가지 명령을 사용할 수 있습니다.

  1. 홈 디렉터리가 포함된 파일 시스템에 대한 정보를 얻을 수 있습니다.

    df ~
    

이렇게 하면 "overlay", "aufs" 또는 "/dev/sda1"(무엇보다도)과 같은 정보가 제공됩니다.

  1. 다음 명령을 사용하여 파티션 목록을 가져올 수 있습니다

    cat /proc/partitions
    

따라서 첫 번째 명령에서 보고된 파일 시스템이 두 번째 명령의 파티션 목록에 포함되어 있지 않으면 라이브 운영 체제를 실행하고 있는 것입니다.

함께 넣어보세요:

full_fs=$(df ~ | tail -1 | awk '{print $1;}')  # /dev/sda1
fs=$(basename $full_fs)                        # sda1
if grep -q "$fs" /proc/partitions; then
  echo "regular linux install. NOT a live OS"
else
  echo "is a live OS running from RAM"
fi

고쳐 쓰다!

파일 시스템도 컨테이너의 파티션으로 나열되지 않습니다. 이는 컨테이너 내에서 보고된 파티션 테이블이 호스트 운영 체제의 파티션이 되기 때문입니다. 컨테이너와 Linux Live 운영 체제를 구별해야 하는 경우 조건을 하나 더 추가해야 합니다.

if cat /proc/1/cgroup | tail -1 | grep -q "container"; then
  echo "linux container"
else
  full_fs=$(df ~ | tail -1 | awk '{print $1;}')  # /dev/sda1
  fs=$(basename $full_fs)                        # sda1
  if grep -q "$fs" /proc/partitions; then
    echo "regular linux install"
  else
    echo "live OS running from RAM"
  fi
fi

답변3

나는 당신이 이것을 할 수 있다는 것을 알았고 lsblk | grep 'sr0'그것이 발견되면 sr0라이브 USB로 실행될 가능성이 높습니다. 실제로 라이브 USB를 꽂은 상태에서 설치하더라도 sr0실제로 라이브 USB가 부팅될 때만 표시됩니다.

관련 정보