
Estou escrevendo uma instalação automatizada personalizada usando AIF (Arch Installation Framework) e preciso encontrar o sistema de arquivos em uma partição determinada.
Até agora eu tenho isso:
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}
}
Isso funcionou bem na minha máquina com apenas um disco rígido, mas falhou (obviamente) ao executar na minha VM em execução em um LiveCD (o LiveCD estava sendo selecionado como outra unidade,/dev/sr0).
Pensei em alguns hacks que poderia tentar:
mount $partition; grep $partition /etc/mtab | awk ...
- use
parted -mls
, mas retire a partição que me interessa com scripts inteligentes e analise como já faço no scriptt
Existe uma maneira melhor e mais simples de fazer isso? Já tenho as partições nas quais estou interessado e só preciso encontrar seus sistemas de arquivos (bem como encontrar os swaps disponíveis).
Responder1
Acho que encontrei a resposta:blkid
Na página de manual:
O programa blkid é a interface de linha de comando para trabalhar com a biblioteca libblkid(3). Ele pode determinar o tipo de conteúdo (por exemplo, sistema de arquivos ou swap) que um dispositivo de bloco contém e também atributos (tokens, pares NOME=valor) dos metadados de conteúdo (por exemplo, campos LABEL ou UUID).
Aparentemente, ele imprime o nome do dispositivo junto com o tipo de sistema de arquivos (junto com outras informações úteis). Para obter uma lista de todos os dispositivos com seus tipos:
blkid | sed 's!\(.*\):.*TYPE="\(.*\)".*!\1: \2!'
Para encontrar todos /dev/sd*/
os dispositivos, basta adicionar um grep:
blkid | grep "/dev/sd.*" | sed 's!\(.*\):.*TYPE="\(.*\)".*!\1: \2!'
Então é só cut
ou awk
para conseguir o que você precisa.
Responder2
file -s /path/to/device
identificará o sistema de arquivos em um disco/partição/fatia.
À la:
[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)
pelo menos no Linux sim.
Responder3
Mostre apenas a tag TYPE do dispositivo de bloco e produza apenas seu valor:
blkid -s TYPE -o value "$device"
Exemplo:
$ blkid -s TYPE -o value /dev/mapper/vg_svelte-home
btrfs
Responder4
Uma opção secundária que funciona com muitos sistemas de arquivos e tem a vantagem de funcionar mesmo com sistemas de arquivos que possuem estruturas danificadas é o testdisk
. (Você pode executar sudo apt install testdisk
para instalá-lo em sistemas baseados em Debian.)
Faça um script para retornar apenas o tipo de sistema de arquivos como este:
$ testdisk /list "$path_to_partition" | awk '$1 == "P" {print $2}'