Bagaimana Anda mengganti nama grup volume yang berisi volume root di LVM?

20

Saya ingin mengganti nama grup volume tempat volume root saya aktif. Bagaimana saya bisa melakukan ini?

flickerfly
sumber
Hanya ingin tahu: Mengapa saya ingin melakukan ini?
guntbert
2
Kasus penggunaan saya adalah bahwa saya memiliki template VMWare yang saya instal dengan "template" nama host. Setelah saya menggunakan template itu, saya lebih suka vgname tidak menjadi "template-vg" untuk semua mesin itu. Berpegang teguh pada gagasan umum bahwa vgname terkait dengan nama host, saya minta skrip setup saya untuk template mengganti nama vg dengan nama host. Ini juga memungkinkan saya untuk dengan mudah memastikan saya sedang mengerjakan vg yang benar dan tidak dalam sesi ssh yang salah.
flickerfly

Jawaban:

25

CATATAN: Distro Anda dapat mencegah pengeditan /boot/grub/grub.cfg. Jika itu masalahnya, skrip ini mungkin ide yang buruk. Sebagai alternatif, Anda mungkin dapat menjalankan grub-mkconfig untuk memperbaikinya. Saya belum menguji distro-distro itu, jadi periksa situasi Anda.

Pertama, Anda perlu tahu nama grup volume yang memiliki tanda hubung di dalamnya. Jika ya, daripada penggunaan / dev / mapper / referensi apa pun perlu memiliki dua tanda hubung. Di 16.04, defaultnya adalah "-vg" ditambahkan ke nama jadi ini harus diasumsikan.

Kedua, Anda harus tahu bahwa mengacaukan ini dapat menyebabkan sistem Anda tidak dapat di-boot dan mengakibatkan harus boot dari disk penyelamat dan memperbaiki hal-hal yang menyebabkan waktu henti. (alias: Jangan lakukan ini dalam produksi. )

Untuk melakukan penggantian nama sebenarnya gunakan lvrename oldname newname.

Setelah mengganti nama, Anda harus mengedit keduanya /etc/fstabdan /boot/grub/grub.cfgmemperbarui penggunaan nama untuk referensi ke root Anda dan mungkin juga lokasi swap Anda.

Selain itu, Anda perlu menjalankan perintah ini untuk memperbarui initramfs untuk semua kernel.

update-initramfs -c -k all

Saya menggunakan skrip berikut untuk menangani ini ketika menggunakan templat baru. Sekali lagi, jangan lakukan ini dalam produksi kecuali Anda memiliki toleransi tinggi untuk downtime.

#!/bin/bash

# Must be run with root permissions 
# sudo will be sufficient

if [ "$(id -u)" != "0" ]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

#Ask for new hostname $newhost
read -p "Enter new hostname: "
newhostname=$REPLY
oldhostname=$(cat /etc/hostname)

echo "Changing LVM names"
# ${var//-} syntax removes all dashes from the name simplifying the 
# requirement to use a double-dash in some places to escape the dash
newvg=${newhostname//-}

# Find the volume group that root is in 
vg=`lvdisplay -C|awk '$1=="root" {print $2}'`
if [[ ${vg} == *"-"* ]]; then
    #has dashes in current name
    vgrename ${vg} ${newhostname//-}
    vg=`echo $vg|sed "s/-/--/g"`
    sed -i "s/${vg}/${newvg}/g" /etc/fstab
    sed -i "s/${vg}/${newvg}/g" /boot/grub/grub.cfg
  else
    #no dashes in current name
    vgrename ${vg} ${newvg}
    sed -i "s/${vg}/${newvg}/g" /etc/fstab
    sed -i "s/${vg}/${newvg}/g" /boot/grub/grub.cfg
fi

update-initramfs -c -k all

Jika Anda memiliki perbaikan skrip ini, silakan bagikan. Saya selalu mencari cara untuk meningkatkan dan memperhitungkan berbagai kasus tepi.

flickerfly
sumber
Jika Anda menjalankan sed -itanpa file input, itu kesalahan sed: no input files. Hapus -ibendera.
wjandrea
Ah, baiklah. Itu masuk akal. Bertanya-tanya apakah versi sed saya ditangani secara berbeda. Juga, sepertinya @Diego Souza menariknya tanpa sed sepenuhnya dalam komentar lain.
flickerfly
2
Saya percaya maksud Anda vgrenamelebih daripada itu lvrename, dan karena /boot/grub/grub.cfgdihasilkan dari entri /etc/grub.d, Anda perlu menjalankan update-grubsetelah mengganti nama daripada mengeditnya secara langsung.
Eric Streeper
Tidak, maksud saya grup volume. Juga, mungkin distro Anda berbeda dengan saya dalam konfigurasi grub.
flickerfly
3
Tampaknya update-grubtidak dapat berjalan dengan benar sebelum reboot - gagal dengan kesalahan /usr/sbin/grub-probe: error: failed to get canonical path of '/dev/mapper/ubuntu--vg-root'untuk saya. Untuk sistem yang /boot/grub/grub.cfgdihasilkan secara otomatis, mungkin opsi paling aman adalah memperbarui secara manual, seperti dalam skrip ini, lalu reboot, lalu jalankan update-grub, lalu reboot lagi.
Michael Firth
1

File /boot/grub/grub.cfgtidak boleh diedit secara manual.

Ada header file di bawah ini:

"
 DO NOT EDIT THIS FILE

 It is automatically generated by grub-mkconfig using templates
 from /etc/grub.d and settings from /etc/default/grub

BEGIN /etc/grub.d/00_header
"
Tomasz Dobrzycki
sumber
Yap, jawaban saya menjadi sedikit tua dan kasus penggunaan saya untuk ini tidak lagi berarti. Saya mendorong Anda untuk berkontribusi apa pun yang Anda pelajari agar selalu diperbarui. Distribusi dan versi apa yang Anda lihat ini?
flickerfly
1

Ini menangkap saya di ubuntu 18.04.1 LTS - apakah vgrename dan boot gagal. Saya juga mencatat bahwa shutdown terhenti karena swap (referensi nama vg lama) gagal.

Saya mengganti nama vg kembali ke apa yang menggunakan lvm ke prompt initramfs. Belum melakukan ulang vgrename "dengan benar" sesuai instruksi di atas.

Neil
sumber
0

Setelah mengganti nama, Anda harus mengedit keduanya /etc/fstabdan /boot/grub/grub.cfgmemperbarui penggunaan nama untuk referensi ke root Anda dan mungkin juga lokasi swap Anda. /etc/initramfs-tools/conf.d/resumediperlukan juga.

Jadi, tambahkan kode ini:

sed -i "s/${vg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume
MIX YuG
sumber
Saya tidak perlu melakukan ini di Ubuntu. 'update-initramfs -c -k all' sudah cukup. Distro apa yang Anda gunakan yang menunjukkan kebutuhan ini? Apakah itu tidak memiliki alat pembaruan-initramfs? Saya melakukan reboot segera setelah menjalankan skrip yang menyertakan ini sehingga mungkin juga menjadi faktor dalam hasil saya yang berbeda.
flickerfly
0

Ini adalah versi yang direvisi, diperbaiki pada penggantian string vg dan juga mencetak file yang diperbarui.

#!/bin/bash

# Must be run with root permissions
# sudo will be sufficient
if [ "$(id -u)" -ne 0 ]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

# Ask for new hostname $newhost
read newhostname -p "Enter new hostname: "
#oldhostname=$(cat /etc/hostname)

echo "Changing LVM names"
# ${var//-} syntax removes all dashes from the name simplifying the
# requirement to use a double-dash in some places to escape the dash
newvg=${newhostname//-}

# Find the volume group that root is in
vg=$(lvdisplay -C | awk '$1=="root" {print $2}')
echo "old vg name: " $vg
echo "new vg name: " $newvg
if [[ ${vg} == *"-"* ]]; then
    # has dashes in current name
    vgrename ${vg} ${newhostname//-}
    vg=${vg//-/--}
    sed -i "s/${vg}/${newvg}/g" /etc/fstab
    sed -i "s/${vg}/${newvg}/g" /boot/grub/grub.cfg
    sed -i "s/${vg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume
else
    # no dashes in current name
    vgrename ${vg} ${newvg}
    sed -i "s/${vg}/${newvg}/g" /etc/fstab
    sed -i "s/${vg}/${newvg}/g" /boot/grub/grub.cfg
    sed -i "s/${vg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume
fi

#check files
echo fstab update:
grep ${newvg} /etc/fstab

echo grub.cfg update:
grep ${newvg} /boot/grub/grub.cfg

echo resume update:
grep ${newvg} /etc/initramfs-tools/conf.d/resume

update-initramfs -c -k all

Saat menggunakan skrip ini, mesin mungkin tidak mati dengan benar karena mencoba "menghentikan" pemetaan. Bergantung pada konfigurasi Anda, ini mungkin tampak seperti mesin dalam keadaan boot sementara pada kenyataannya itu bahkan tidak mematikan terlebih dahulu.

Sangat membantu untuk menghapus "splash tenang" dari GRUB_CMDLINE_LINUX_DEFAULT saat Anda melihat pesan.

Diego Souza
sumber
0

Saya melakukan sedikit modifikasi pada skrip untuk juga mengubah nama host.

#!/bin/bash

# Must be run with root permissions
# sudo will be sufficient

if [ "$(id -u)" != "0" ]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

#Ask for new hostname $newhost
read -p "Enter new hostname: "
newhostname=$REPLY
oldhostname=`cat /etc/hostname`

# ${var//-} syntax removes all dashes from the name simplifying the
# requirement to use a double-dash in some places to escape the dash
newvg=${newhostname//-}

# Find the volume group that root is in
vg=`lvdisplay -C|awk '$1=="root" {print $2}'`
echo
echo "old hostname          : " $oldhostname
echo "old vg name           : " $vg
echo "new hostname / vg name: " $newvg

echo
echo "Changing LVM names..."
vgrename ${vg} ${newvg}
if [[ ${vg} == *"-"* ]]; then
    #has dashes in current name
    vg=`echo $vg|sed "s/-/--/g"`
fi
sed -i "s/${vg}/${newvg}/g" /etc/fstab
sed -i "s/${vg}/${newvg}/g" /boot/grub/grub.cfg
sed -i "s/${vg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume

echo
echo "Changing Hostname..."
sed -i "s/${oldhostname}/${newvg}/g" /etc/hostname
sed -i "s/${oldhostname}/${newvg}/g" /etc/hosts

#check files
echo
echo fstab update:
grep ${newvg} /etc/fstab

echo grub.cfg update:
grep ${newvg} /boot/grub/grub.cfg

echo resume update:
grep ${newvg} /etc/initramfs-tools/conf.d/resume

echo hostname update:
grep ${newvg} /etc/hostname

echo hosts update:
grep ${newvg} /etc/hosts

update-initramfs -c -k all
Pedro R. Sánchez A.
sumber
0

Menu boot juga perlu diedit di Ubuntu 18 (dan mungkin yang lain). Jadi - disederhanakan untuk hanya mengubah nama vg dan mempertahankan penggunaan tanda hubung dalam nama:

#!/bin/bash

oldvg="ubu16svr-vg"
oldvgdash="ubu16svr--vg"
newvg="ubusvr-vg"
newvgdash="ubusvr--vg"

if [ "$(id -u)" != "0" ]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

vgrename ${oldvg} ${newvg}
sed -i "s/${oldvg}/${newvg}/g" /etc/fstab
sed -i "s/${oldvgdash}/${newvgdash}/g" /etc/fstab
sed -i "s/${oldvg}/${newvg}/g" /boot/grub/grub.cfg
sed -i "s/${oldvgdash}/${newvgdash}/g" /boot/grub/grub.cfg
sed -i "s/${oldvg}/${newvg}/g" /boot/grub/menu.lst
sed -i "s/${oldvgdash}/${newvgdash}/g" /boot/grub/menu.lst
sed -i "s/${oldvg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume
sed -i "s/${oldvgdash}/${newvgdash}/g" /etc/initramfs-tools/conf.d/resume
update-initramfs -c -k all
Larry R. Irwin
sumber