通过脚本查找已卸载分区的文件系统


16

我正在使用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上的VM中运行时失败了(显然,LiveCD被作为另一个驱动器/ dev / sr0拾取了)。

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

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

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


3
@Mikel不,这个问题着眼于已挂载的文件系统。虽然可以挂载文件系统,然后看看有什么键入的作为搭载,这会比较慢,不稳健,不用于交换的工作,只适用于由正在运行的内核支持的文件系统......
吉尔“SO-停止作恶”

Answers:


16

我想我找到了答案: 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!'

然后只是cutawk获得您所需要的。


11
blkid可以自行过滤您需要的内容-不需要sed / grep / awk魔术:blkid -s TYPE -o value /dev/sda3
Petr Uzel

@PetrUzel-太棒了!那正是我想要的!
Beatgammit

2
sudo如果您不是root用户,请记住与它一起运行!这个人让我失望了,因为blkid它不打印任何错误消息,并且如果它不能访问块设备,则以状态代码0退出……
Asfand Qazi 2015年

有很少需要管grepsedgrep foo | sed 's/pattern/repl/'写得更干净sed '/foo/s/pattern/repl/'
威廉·普塞尔

9

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上确实如此。


有没有办法从脚本中可靠地过滤掉文件系统类型?
Beatgammit

取决于您是否认为已过滤的文件系统全名是否足够| cut -d: -f2 | cut -d( -f1blkid可以肯定,它不如。:)
蒂姆·肯尼迪

2

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

blkid -s TYPE -o value "$device"

例:

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

0

第二个选项可用于许多文件系统,并且即使在结构损坏的文件系统中也可使用testdisk。(您可以运行sudo apt install testdisk以安装它。)

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

$ testdisk /list "$path_to_partition" | grep " P " | awk '{print $2}'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.