システムがライブUSBで動作しているかBASHで確認する方法

システムがライブUSBで動作しているかBASHで確認する方法

私はUSBデバイスにライブシステムで焼くことができるISOイメージを作成しています。ライブUSBを起動するシステムの内部ドライブにインストールするために、デスクトップにインストーラを実行できるアイコンがあります。

インストール後にアイコンを削除したいです。そのために、システムがライブUSBで実行されているのか、実際にインストールされているのかを検出するスクリプトを作成します。 BASHでこれを検出する方法はありますか?

ありがとうございます!

答え1

でルートファイルシステムエントリを確認できます/proc/mounts。 CDから起動する場合は、ファイルシステムとしてiso9660を使用してください/dev/sr0

もちろん、インストール中にどこかにファイルを作成し、そのファイルの存在をインジケータとして使用できます。

答え2

Linuxライブオペレーティングシステム(USBまたはCD)はファイルシステムをRAMに保存しますが、通常のオペレーティングシステムはデータをディスクのパーティションに保存します。 bashでこれらの違いを検出するには、2つのコマンドを使用できます。

  1. ホームディレクトリを含むファイルシステムに関する情報を取得できます。

    df ~
    

これにより、「overlay」、「aufs」、または「/dev/sda1」(何よりも)などの情報が提供されます。

  1. 次のコマンドを使用してパーティションのリストをインポートできます。

    cat /proc/partitions
    

したがって、最初のコマンドで報告されたファイルシステムが2番目のコマンドのパーティションリストに含まれていない場合は、ライブオペレーティングシステムを実行しています。

一緒に入れてください:

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オペレーティングシステムを区別する必要がある場合は、もう1つの条件を追加する必要があります。

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が起動したときにのみ表示されます。

関連情報