从脚本中查找已卸载分区的文件系统

从脚本中查找已卸载分区的文件系统

我正在使用 AIF(Arch 安装框架)编写自定义自动安装,并且我需要在给定分区的分区上查找文件系统。

到目前为止我有这个:

grok_partitions () {
    local partitions=
    for label in `ls /dev/disk/by-label | grep "Arch"`
    do
        if [ $label == "Arch" ]
        then
            mount_point="/"
        else
            IFS="-" read base mount <<< "${label}"
            mount_point="/${mount}"
        fi

        local partition=$(readlink -f /dev/disk/by-label/${label})
        local part_no=$(echo ${partition} | grep -Po '\d+')
        local fs=$(parted -mls | grep "^${part_no}" | cut -d: -f5)
        partitions+="${partition} raw ${label} ${fs};yes;${mount_point};target;no_opts;${label};no_params\n"
    done

    # do the swap
    if [ -e /dev/disk/by-label/swap ]
    then
        local partition=$(readlink -f /dev/disk/by-label/swap)
        partitions+="$partition raw swap swap;yes;no_mountpoint;target;no_opts;swap;no_params"
    else
        # if there's no labeled swap, use the first one we find
        local partition=$(fdisk -l | grep -m1 swap | awk '{ print $1 }')
        if [ ! -e $partition ]
        then
            echo "No swap detected. Giving up."
            exit 1
        fi
        partitions+="$partition raw no_label swap;yes;no_mountpoint;target;no_opts;no_label;no_params"
    fi

    echo -n ${partitions}
}

这在我只有一个硬盘的机器上工作得很好,但是当我在 LiveCD 上运行的虚拟机中运行时(LiveCD 被选为另一个驱动器 /dev/sr0),它就失败了(显然)。

我想到了一些可以尝试的技巧:

  • mount $partition; grep $partition /etc/mtab | awk ...
  • 使用parted -mls,但通过巧妙的脚本提取我关心的分区,然后像我在脚本中所做的那样进行解析

有没有更好、更简单的方法来做到这一点?我已经有了我感兴趣的分区,我只需要找到它们的文件系统(以及找到可用的交换)。

答案1

我想我找到了答案:blkid

从手册页:

blkid 程序是使用 libblkid(3) 库的命令行界面。它可以确定块设备保存的内容类型(例如文件系统或交换),以及内容元数据(例如 LABEL 或 UUID 字段)中的属性(令牌、NAME=值对)。

显然它会打印设备名称以及文件系统类型(以及一些其他有用的信息)。要获取所有设备及其类型的列表:

blkid | sed 's!\(.*\):.*TYPE="\(.*\)".*!\1: \2!'

要查找所有/dev/sd*/设备,只需添加 grep:

blkid | grep "/dev/sd.*" | sed 's!\(.*\):.*TYPE="\(.*\)".*!\1: \2!'

然后只是cut为了awk得到你需要的东西。

答案2

file -s /path/to/device将识别磁盘/分区/切片上的文件系统。

啦啦:

[root@node2 ~]# file -s /dev/mapper/VolGroup00-LogVol00
/dev/mapper/VolGroup00-LogVol00: Linux rev 1.0 ext3 filesystem data (needs journa recovery) (large files)
[root@node2 ~]# file -s /dev/mapper/coraid--pool-coraid--lv1 
/dev/mapper/coraid--pool-coraid--lv1: Linux GFS2 Filesystem (blocksize 4096, lockproto lock_dlm)
[root@node2 ~]# file -s /dev/mapper/coraid--pool-coraid--lv2 
/dev/mapper/coraid--pool-coraid--lv2: SGI XFS filesystem data (blksz 4096, inosz 256, v2 dirs)

至少在 Linux 上是这样。

答案3

仅显示块设备的 TYPE 标记,并仅输出其值:

blkid -s TYPE -o value "$device"

例子:

$ blkid -s TYPE -o value /dev/mapper/vg_svelte-home 
btrfs

答案4

可以与许多文件系统一起使用并且具有甚至可以与结构损坏的文件系统一起使用的优点的第二个选项是testdisk。 (您可以sudo apt install testdisk在基于 Debian 的系统上运行安装它。)

编写脚本以仅返回文件系统类型,如下所示:

$ testdisk /list "$path_to_partition" | awk '$1 == "P" {print $2}'

相关内容