Supongamos que tenemos la ruta lv:
lvpath=/dev/mapper/vg2-Music
Que me dividí lvdisplay -c
con corte:
vgname="$(lvdisplay -c "$lvpath" | cut -d ':' -f 2 )"
lvname="$(basename "$(lvdisplay -c "$lvpath" | cut -d ':' -f 1 )" )"
resultado:
$ echo VG: $vgname LV: $lvname
VG: vg2 LV: Music
pregunta:
¿Existe una forma más conveniente de hacer esto?
¿Puedo confiar en lvdisplay -c
que siempre me proporcionará el camino en forma /dev/VGname/LVname
? (En caso de que /dev/mapper/VGname-LVname
el nombre base se deba intercambiar por sed)
¿Existe una herramienta del paquete LVM2 para obtener el nombre LV de la ruta?
Respuesta1
Úselo lvs
con la -o
opción para personalizar los campos mostrados.
set $(lvs --noheadings -o lv_name,vg_name)
lv_name=$1 vg_name=$2
Tenga en cuenta que no puede simplemente escribir lv_name=$(lvs --noheadings -o lv_name)
porque lvs
coloca espacios en blanco adicionales alrededor del valor. El fragmento es seguro porque no se permite que los nombres de los volúmenes contengan caracteres especiales del shell.
Respuesta2
Son excelentes para trabajar con LVM en scripts bash.
Nombre de VG:
Esto funciona muy bien para obtener el nombre de VG (nombre del grupo de volúmenes) como un valor único sin espacios en blanco:
sudo vgs --noheadings -o vg_name | tr -d ' '
Nombre(s) del VI:
Para los nombres LV (nombres de volúmenes lógicos), "normalmente" hay más de uno Y normalmente es necesario hacer referencia a él con la sintaxis /dev/<vg_name>/<lv_name>
. No sé qué formato de salida desea. Lo siguiente le dará una lista de los nombres de LV con cada valor separado con una nueva línea "\n":
sudo lvscan | cut -d "'" -f 2
O si solo desea los nombres de LV <lv_name>
:
sudo lvs --noheadings -o lv_name | tr -d ' '
Nombre(s) del PV:
No preguntaste, pero ya que estoy en eso, así es como obtendrías los nombres de PV (nombres de volúmenes físicos):
sudo pvs --noheadings -o pv_name | tr -d ' '
Respuesta3
Otras respuestas son correctas. ¿Qué pasa si necesitas LV?camino¿Del propio nombre LV? Supongamos que el nombre del LV es único, es decir, no hay otros LV en ningún otro VG que tenga ese nombre. Como "Música". Podrías obtener el camino con un solo paso:
lvs --noheadings -o lv_path -S lv_name=Musik
Su salida será un token único (la ruta LV) que se puede usar en comandos LV posteriores.
Si lv_name
no es único, esto no funcionará sin un cuidado especial.
Respuesta4
Quizás un poco tarde, pero les dejo aquí un guión que hice:
#!/bin/bash
IFS=$'\n'
export IFS
phydis=$(pvdisplay | egrep "PV Name|VG Name|PV Size" | awk 'NR%3{printf "%s,",$0;next}{print;}' | sed 's/PV Name//g' | sed 's/VG Name//g' | sed 's/PV Size//g' | sed 's/ //g')
if [ -f /etc/redhat-release ];then
if [[ `cat /etc/redhat-release | awk -F " " '{print$4}' | awk -F "." '{print$1}'` -eq 7 ]];then
logdis=$(lvdisplay | egrep "LV Path|LV Size" | awk 'NR%2{printf "%s,",$0;next}{print;}' | sed 's/LV Path//g' | sed 's/LV Size//g' | sed 's/ //g' | sort)
else
logdis=$(lvdisplay | egrep "LV Name|LV Size" | awk 'NR%2{printf "%s,",$0;next}{print;}' | sed 's/LV Name//g' | sed 's/LV Size//g' | sed 's/ //g' | sort)
fi
else
logdis=$(lvdisplay | egrep "LV Name|LV Size" | awk 'NR%2{printf "%s,",$0;next}{print;}' | sed 's/LV Name//g' | sed 's/LV Size//g' | sed 's/ //g' | sort)
flag="norh"
fi
phyparttrans=""
echo "|--------------------------|----------------------|----------------------|----------------------|--------------------------------|----------------------|-----------------|-----------------|--------------------------------|"
echo "| PV Name | PV Size | VG Name | VG Size | LV Name | LV Size | Used | Avail | Mounted on |"
for phy in ${phydis};do
phypart1=$(echo "${phy}" | awk -F "," '{print$1}')
phypart2=$(echo "${phy}" | awk -F "," '{print$2}')
phypart3=$(echo "${phy}" | awk -F "," '{print$3}' | cut -f1 -d"/")
if [ "$phypart2" != "$phyparttrans" ];then
phyparttrans="$phypart2"
counter=1
for log in ${logdis};do
volsize=$(vgdisplay | egrep "VG Name|VG Size" | awk 'NR%2{printf "%s,",$0;next}{print;}' | sed 's/VG Name//g' | sed 's/VG Size//g' | sed 's/ //g' | grep "$phypart2" | awk -F "," '{print$2}')
logpart1=$(echo "${log}" | awk -F "," '{print$1}')
logpart2=$(echo "${log}" | awk -F "," '{print$2}')
logpartmatch=$(echo "${logpart1}" | awk -F "/" '{print$3}')
if [ $counter -eq 1 ];then
if [ "${phypart2}" == "${logpartmatch}" ];then
mountpoint1=$(echo "$logpart1" | awk -F "/" '{print$3}')
mountpoint2=$(echo "$logpart1" | awk -F "/" '{print$4}')
df_output=$(df -h /dev/mapper/${mountpoint1}-${mountpoint2} | tail -1)
Used=$(echo "$df_output" | awk -F " " '{print$2}')
Avail=$(echo "$df_output" | awk -F " " '{print$3}')
Mounted=$(echo "$df_output" | awk -F " " '{print$NF}')
echo "|--------------------------|----------------------|----------------------|----------------------|--------------------------------|----------------------|-----------------|-----------------|--------------------------------|"
printf '%1s %-24s %1s %-20s %1s %-20s %1s %-20s %1s %-30s %1s %-20s %1s %-15s %1s %-15s %1s %-30s %1s\n' "|" "$phypart1" "|" "$phypart3" "|" "$phypart2" "|" "$volsize" "|" "$logpart1" "|" "$logpart2" "|" "$Used" "|" "$Avail" "|" "$Mounted" "|"
counter=$[$counter +1]
elif [[ "${flag}" == "norh" ]];then
df_output=$(df -h /dev/${phypart2}/${logpart1} | tail -1)
Used=$(echo "$df_output" | awk -F " " '{print$2}')
Avail=$(echo "$df_output" | awk -F " " '{print$3}')
Mounted=$(echo "$df_output" | awk -F " " '{print$NF}')
echo "|--------------------------|----------------------|----------------------|----------------------|--------------------------------|----------------------|-----------------|-----------------|--------------------------------|"
printf '%1s %-24s %1s %-20s %1s %-20s %1s %-20s %1s %-30s %1s %-20s %1s %-15s %1s %-15s %1s %-30s %1s\n' "|" "$phypart1" "|" "$phypart3" "|" "$phypart2" "|" "$volsize" "|" "$logpart1" "|" "$logpart2" "|" "$Used" "|" "$Avail" "|" "$Mounted" "|"
counter=$[$counter +1]
fi
else
if [ "${phypart2}" == "${logpartmatch}" ];then
mountpoint1=$(echo "$logpart1" | awk -F "/" '{print$3}')
mountpoint2=$(echo "$logpart1" | awk -F "/" '{print$4}')
df_output=$(df -h /dev/mapper/${mountpoint1}-${mountpoint2} | tail -1)
Used=$(echo "$df_output" | awk -F " " '{print$2}')
Avail=$(echo "$df_output" | awk -F " " '{print$3}')
Mounted=$(echo "$df_output" | awk -F " " '{print$NF}')
printf '%1s %-24s %1s %-20s %1s %-20s %1s %-20s %1s %-30s %1s %-20s %1s %-15s %1s %-15s %1s %-30s %1s\n' "|" " " "|" " " "|" " " "|" " " "|" "$logpart1" "|" "$logpart2" "|" "$Used" "|" "$Avail" "|" "$Mounted" "|"
counter=$[$counter +1]
elif [[ "${flag}" == "norh" ]];then
df_output=$(df -h /dev/${phypart2}/${logpart1} | tail -1)
Used=$(echo "$df_output" | awk -F " " '{print$2}')
Avail=$(echo "$df_output" | awk -F " " '{print$3}')
Mounted=$(echo "$df_output" | awk -F " " '{print$NF}')
printf '%1s %-24s %1s %-20s %1s %-20s %1s %-20s %1s %-30s %1s %-20s %1s %-15s %1s %-15s %1s %-30s %1s\n' "|" " " "|" " " "|" " " "|" " " "|" "$logpart1" "|" "$logpart2" "|" "$Used" "|" "$Avail" "|" "$Mounted" "|"
counter=$[$counter +1]
fi
fi
done
else
printf '%1s %-24s %1s %-20s %1s %-20s %1s %-20s %1s %-30s %1s %-20s %1s %-15s %1s %-15s %1s %-30s %1s\n' "|" "$phypart1" "|" "$phypart3" "|" " " "|" " " "|" " " "|" " " "|" " " "|" " " "|" " " "|"
fi
done
echo "|--------------------------|----------------------|----------------------|----------------------|--------------------------------|----------------------|-----------------|-----------------|--------------------------------|"
Actualizar
Here is the script exit example:
[root@server01 /root/scripts]# ./lvm_display.sh
|--------------------------|----------------------|----------------------|----------------------|--------------------------------|----------------------|-----------------|-----------------|--------------------------------|
| PV Name | PV Size | VG Name | VG Size | LV Name | LV Size | Used | Avail | Mounted on |
|--------------------------|----------------------|----------------------|----------------------|--------------------------------|----------------------|-----------------|-----------------|--------------------------------|
| /dev/cciss/c0d2 | 1.64TB | VolGroup01 | 1.64TB | /dev/VolGroup01/backup_files | 50.00GB | 132M | 50G | /data/backup_files |
| | | | | /dev/VolGroup01/data | 1000.00GB | 591G | 410G | /data |
| | | | | /dev/VolGroup01/ftp | 100.00GB | 74G | 27G | /data/ftp |
| | | | | /dev/VolGroup01/dir1 | 50.00GB | 15G | 36G | /prod/app/dir1 |
| | | | | /dev/VolGroup01/nfs_test | 12.00GB | 127G | 224K | /dev |
| | | | | /dev/VolGroup01/testing | 200.00GB | 39G | 162G | /data/testing |
| | | | | /dev/VolGroup01/shared | 125.00GB | 15G | 111G | /data/shared |
|--------------------------|----------------------|----------------------|----------------------|--------------------------------|----------------------|-----------------|-----------------|--------------------------------|
| /dev/cciss/c0d0p2 | 558.78GB | VolGroup00 | 558.75GB | /dev/VolGroup00/LogVol00 | 10.00GB | 7.0G | 2.3G | / |
| | | | | /dev/VolGroup00/LogVol01 | 32.00GB | 127G | 224K | /dev |
| | | | | /dev/VolGroup00/LogVol02 | 120.00GB | 57G | 54G | /prod |
| | | | | /dev/VolGroup00/LogVol03 | 10.00GB | 160M | 9.1G | /tmp |
| | | | | /dev/VolGroup00/LogVol05 | 336.75GB | 205G | 133G | /data |
|--------------------------|----------------------|----------------------|----------------------|--------------------------------|----------------------|-----------------|-----------------|--------------------------------|
¡Cualquier mejora es bienvenida!