bea*_*mit 18 command-line filesystems system-installation block-device
我正在使用 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}
}
Run Code Online (Sandbox Code Playgroud)
这在我只有一个硬盘驱动器的机器上运行良好,但是在我的运行在 LiveCD 上的 VM 中运行时失败(显然)(LiveCD 被选择为另一个驱动器,/dev/sr0)。
我想到了一些我可以尝试的技巧:
mount $partition; grep $partition /etc/mtab | awk ...parted -mls,但使用巧妙的脚本拉出我关心的分区,然后像我在脚本中所做的那样进行解析有没有更好,更简单的方法来做到这一点?我已经有了我感兴趣的分区,我只需要找到它们的文件系统(以及找到可用的交换)。
bea*_*mit 17
我想我找到了答案: blkid
从手册页:
blkid 程序是使用 libblkid(3) 库的命令行界面。它可以确定块设备保存的内容类型(例如文件系统或交换),以及来自内容元数据(例如标签或 UUID 字段)的属性(令牌、NAME=值对)。
显然它会打印设备名称和文件系统类型(以及其他一些有用的信息)。要获取所有设备及其类型的列表:
blkid | sed 's!\(.*\):.*TYPE="\(.*\)".*!\1: \2!'
Run Code Online (Sandbox Code Playgroud)
要查找所有/dev/sd*/设备,只需添加一个 grep:
blkid | grep "/dev/sd.*" | sed 's!\(.*\):.*TYPE="\(.*\)".*!\1: \2!'
Run Code Online (Sandbox Code Playgroud)
然后,只需cut或awk得到你所需要的。
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)
Run Code Online (Sandbox Code Playgroud)
至少,在 Linux 上是这样。
只显示块设备的 TYPE 标签,并且只输出它的值:
blkid -s TYPE -o value "$device"
Run Code Online (Sandbox Code Playgroud)
例子:
$ blkid -s TYPE -o value /dev/mapper/vg_svelte-home
btrfs
Run Code Online (Sandbox Code Playgroud)