Leí que montar dispositivos por nombre (/dev/sdxy) no era tan seguro porque los nombres de los dispositivos podían cambiar entre reinicios. Entonces, quiero generar un archivo fstab con UUID en lugar de nombres de dispositivos. Los tutoriales en Internet sugieren que encuentre el UUID de los dispositivos que quiero y los copie y pegue manualmente en /etc/fstab.
Creo que tiene que haber una manera de automatizar eso y estoy tratando de hacer que sed funcione desde dentro de un script. Esto es lo más cerca que pude llegar a un script de trabajo:
#!/bin/bash
function GetUUID()
{
# Arg 1 is expected to be a device (such as /dev/sdc1)
# This function calls blkid on the device and prints to stdout UUID=[uuid], without quotes, so that it can be passed out to SED.
echo -n calling GetUUID on $1
FullString=$(blkid $1 | tr -d '"')
UUID=$(echo ${FullString} | cut -d ' ' -f2)
echo $UUID
}
# Greps /etc/mtab and looks for user given disk (say, /dev/sdc)
# Changes the names of all mounted partitions of that disk (eg all /dev/sdcx) to their UUIDs, in compatible format with /etc/fstab
# Outputs results to stdout
if [[ $# -eq 0 ]]
then
# If no argument, I will not try to guess a default, that looks dangerous.
echo "Usage: RobustMtabCopy /dev/somedisk (will search mstab for all /dev/somediskX and replace the names by their UUIDS)"
exit 22
else
# Else, look for anything like /dev/somediskX, source the function that will make the output pretty, get the pretty form of UUID, and put it in place of the device name in the output.
grep $1 /etc/mtab | sed -E "s|(${1}[[:digit:]])|$(GetUUID \1)|g"
fi
La salida esperada sería algo como esto:
UUID=SOME-UUID mount-point fs options 0 0
UUID=SOME-OTHER-UUID mount-point fs options 0 0
La salida real:
./script.sh /dev/sdc
mount-point fs options 0 0
mount-point fs options 0 0
Un poco de depuración muestra que llamo a GetUUID con el parámetro "1" (por lo que blkid genera una cadena vacía). Escapar de eso \ no ayudó.
Hay un par de sugerencias excelentes que no hacen exactamente lo que quiero:
- Tengo problemas con cómo reemplazar un valor con la salida de un comando en un archivo de texto porque la función a la que llamo usa el patrón que coincidí en sed, y puedo no averiguo cómo pasar eso a mi mando;
- Leí algo en stackoverflow sobre el uso del indicador "e" para llamar a los comandos de shell desde sed; no funciona del todo para mí porque se reemplaza todo el patrón y me gustaría reemplazar solo la coincidencia (aunque no puedo poner mi mano en la referencia).
Cualquier ayuda sería muy apreciada.
Solución del problema
Con GNU sed para el e
modificador del comando sustituto:
grep "$1" /etc/mtab |
sed -E 's|(.*)('"$1"')(.*)|printf "UUID=%s %s%s\\n" "$(blkid -s UUID -o value "\2")" "\1" "\3"|e'
Pero cuidado: tendrá que pasar una expresión regular que coincida exactamente con los nombres completos de los dispositivos, ni más ni menos. Ejemplo:
$./script.sh '/dev/sdc[0-9]*'
UUID=4071fbd0-711a-477d-877a-ee4b6be261fc /tmp ext4 rw,relatime 0 0
UUID=a34227b0-bb5e-44fb-9207-dc48cf4be022 /home ext4 rw,relatime 0 0
UUID=bcfa9073-79ad-43ca-ba34-ceb8aecb23bf /var ext4 rw,relatime 0 0
Si, como en su ejemplo, ya sabe el tipo de dispositivos que tiene ( /dev/sd[a-z][0-9]+
) y desea pasar solo la raíz principal, puede adaptar el script sed:
grep "$1" /etc/mtab |
sed -E 's|(.*)('"$1"'\S+)(.*)|printf "UUID=%s %s%s\\n" "$(blkid -s UUID -o value "\2")" "\1" "\3"|e'
Y luego:
$./script.sh '/dev/sdc'
UUID=4071fbd0-711a-477d-877a-ee4b6be261fc /tmp ext4 rw,relatime 0 0
UUID=a34227b0-bb5e-44fb-9207-dc48cf4be022 /home ext4 rw,relatime 0 0
UUID=bcfa9073-79ad-43ca-ba34-ceb8aecb23bf /var ext4 rw,relatime 0 0
No hay comentarios.:
Publicar un comentario