
Estoy escribiendo una instalación automatizada personalizada usando AIF (Arch Installation Framework) y necesito encontrar el sistema de archivos en una partición determinada.
Hasta ahora tengo esto:
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}
}
Esto funcionó bien en mi máquina con un solo disco duro, pero falló (obviamente) cuando se ejecutó en mi VM con un LiveCD (el LiveCD se estaba seleccionando como otra unidad, /dev/sr0).
He pensado en un par de trucos que podría probar:
mount $partition; grep $partition /etc/mtab | awk ...
- use
parted -mls
, pero extraiga la partición que me interesa con secuencias de comandos inteligentes, luego analice como ya lo hago en la secuencia de comandos
¿Existe una forma mejor y más sencilla de hacer esto? Ya tengo las particiones que me interesan y sólo necesito encontrar sus sistemas de archivos (así como encontrar el intercambio disponible).
Respuesta1
Creo que encontré la respuesta:blkid
Desde la página de manual:
El programa blkid es la interfaz de línea de comandos para trabajar con la biblioteca libblkid(3). Puede determinar el tipo de contenido (por ejemplo, sistema de archivos o intercambio) que contiene un dispositivo de bloque, y también atributos (tokens, pares NOMBRE=valor) de los metadatos del contenido (por ejemplo, campos ETIQUETA o UUID).
Aparentemente imprime el nombre del dispositivo junto con el tipo de sistema de archivos (junto con otra información útil). Para obtener una lista de todos los dispositivos con sus tipos:
blkid | sed 's!\(.*\):.*TYPE="\(.*\)".*!\1: \2!'
Para encontrar todos /dev/sd*/
los dispositivos, simplemente agregue un grep:
blkid | grep "/dev/sd.*" | sed 's!\(.*\):.*TYPE="\(.*\)".*!\1: \2!'
Entonces solo cut
o awk
para conseguir lo que necesitas.
Respuesta2
file -s /path/to/device
identificará el sistema de archivos en un disco/partición/segmento.
A 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)
al menos, en Linux lo hace.
Respuesta3
Muestra solo la etiqueta TYPE del dispositivo de bloque y solo genera su valor:
blkid -s TYPE -o value "$device"
Ejemplo:
$ blkid -s TYPE -o value /dev/mapper/vg_svelte-home
btrfs
Respuesta4
Una opción secundaria que funciona con muchos sistemas de archivos y tiene la ventaja de funcionar incluso con sistemas de archivos que tienen estructuras dañadas es testdisk
. (Puede ejecutarlo sudo apt install testdisk
para instalarlo en sistemas basados en Debian).
Guíelo para que devuelva solo el tipo de sistema de archivos como este:
$ testdisk /list "$path_to_partition" | awk '$1 == "P" {print $2}'