如何从 BASH 判断系统是否作为实时 USB 运行

如何从 BASH 判断系统是否作为实时 USB 运行

我正在制作一个 ISO 映像,我可以将其作为实时系统刻录到 USB 设备。为了安装到启动 live USB 的系统的内部驱动器,我在桌面上有一个图标来启动安装程序。

安装后,我想删除图标。为了做到这一点,我将编写一个脚本来检测系统是作为实时 USB 运行还是实际安装。有没有办法从 BASH 中检测到这一点?

谢谢!

答案1

您可以检查 中的根文件系统条目/proc/mounts。如果您从 CD 启动,您可能会使用 iso9660 作为文件系统并拥有类似/dev/sr0.

当然,您可以在安装过程中在某处创建一个文件,并使用该文件的存在作为指示符。

答案2

Linux live 操作系统(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 实际启动时才会显示。

相关内容