Saya ingin mengganti nama grup volume tempat volume root saya aktif. Bagaimana saya bisa melakukan ini?
Saya ingin mengganti nama grup volume tempat volume root saya aktif. Bagaimana saya bisa melakukan ini?
Jawaban:
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/fstab
dan /boot/grub/grub.cfg
memperbarui 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.
sed -i
tanpa file input, itu kesalahan sed: no input files
. Hapus -i
bendera.
vgrename
lebih daripada itu lvrename
, dan karena /boot/grub/grub.cfg
dihasilkan dari entri /etc/grub.d
, Anda perlu menjalankan update-grub
setelah mengganti nama daripada mengeditnya secara langsung.
update-grub
tidak 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.cfg
dihasilkan secara otomatis, mungkin opsi paling aman adalah memperbarui secara manual, seperti dalam skrip ini, lalu reboot, lalu jalankan update-grub
, lalu reboot lagi.
File /boot/grub/grub.cfg
tidak 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
"
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.
Setelah mengganti nama, Anda harus mengedit keduanya /etc/fstab
dan /boot/grub/grub.cfg
memperbarui penggunaan nama untuk referensi ke root Anda dan mungkin juga lokasi swap Anda. /etc/initramfs-tools/conf.d/resume
diperlukan juga.
Jadi, tambahkan kode ini:
sed -i "s/${vg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume
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.
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
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