私はUSBデバイスにライブシステムで焼くことができるISOイメージを作成しています。ライブUSBを起動するシステムの内部ドライブにインストールするために、デスクトップにインストーラを実行できるアイコンがあります。
インストール後にアイコンを削除したいです。そのために、システムがライブUSBで実行されているのか、実際にインストールされているのかを検出するスクリプトを作成します。 BASHでこれを検出する方法はありますか?
ありがとうございます!
答え1
でルートファイルシステムエントリを確認できます/proc/mounts
。 CDから起動する場合は、ファイルシステムとしてiso9660を使用してください/dev/sr0
。
もちろん、インストール中にどこかにファイルを作成し、そのファイルの存在をインジケータとして使用できます。
答え2
Linuxライブオペレーティングシステム(USBまたはCD)はファイルシステムをRAMに保存しますが、通常のオペレーティングシステムはデータをディスクのパーティションに保存します。 bashでこれらの違いを検出するには、2つのコマンドを使用できます。
ホームディレクトリを含むファイルシステムに関する情報を取得できます。
df ~
これにより、「overlay」、「aufs」、または「/dev/sda1」(何よりも)などの情報が提供されます。
次のコマンドを使用してパーティションのリストをインポートできます。
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が起動したときにのみ表示されます。