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.
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
"
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.
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
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.
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
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.
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.
Jika Anda memiliki perbaikan skrip ini, silakan bagikan. Saya selalu mencari cara untuk meningkatkan dan memperhitungkan berbagai kasus tepi.
sumber
sed -i
tanpa file input, itu kesalahansed: no input files
. Hapus-i
bendera.vgrename
lebih daripada itulvrename
, dan karena/boot/grub/grub.cfg
dihasilkan dari entri/etc/grub.d
, Anda perlu menjalankanupdate-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 jalankanupdate-grub
, lalu reboot lagi.File
/boot/grub/grub.cfg
tidak boleh diedit secara manual.Ada header file di bawah ini:
sumber
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.
sumber
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:
sumber
Ini adalah versi yang direvisi, diperbaiki pada penggantian string vg dan juga mencetak file yang diperbarui.
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.
sumber
Saya melakukan sedikit modifikasi pada skrip untuk juga mengubah nama host.
sumber
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:
sumber