
私は AIF (Arch Installation Framework) を使用してカスタム自動インストールを作成しており、パーティションを指定してパーティション上のファイルシステムを見つける必要があります。
これまでのところ、私はこれを持っています:
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}
}
これは、ハード ドライブが 1 つしかないマシンでは正常に動作しましたが、LiveCD で実行されている VM で実行すると (当然ですが) 失敗しました (LiveCD は別のドライブ /dev/sr0 として取得されていました)。
試すことができるハックをいくつか考えました:
mount $partition; grep $partition /etc/mtab | awk ...
- を使用します
parted -mls
が、巧妙なスクリプトを使用して、関心のあるパーティションを抽出し、スクリプトで既に行っているように解析します。
これを行うための、より優れた、より簡単な方法はありますか? 関心のあるパーティションはすでにあるので、それらのファイルシステム (および使用可能なスワップ) を見つけるだけです。
答え1
答えを見つけたと思います:blkid
man ページから:
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
多くのファイルシステムで動作し、構造が破損したファイルシステムでも動作するという利点を持つ 2 番目のオプションは です。( Debian ベースのシステムでは を実行してインストールtestdisk
できます。)sudo apt install testdisk
次のようにファイルシステムの種類だけを返すようにスクリプトを作成します。
$ testdisk /list "$path_to_partition" | awk '$1 == "P" {print $2}'