ฉันต้องการเปลี่ยนชื่อกลุ่มวอลุ่มที่ระดับเสียงรูทของฉันเปิดอยู่ ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันต้องการเปลี่ยนชื่อกลุ่มวอลุ่มที่ระดับเสียงรูทของฉันเปิดอยู่ ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
หมายเหตุ: distro ของคุณอาจไม่สนับสนุนการแก้ไข /boot/grub/grub.cfg หากเป็นกรณีนี้สคริปต์นี้อาจเป็นความคิดที่ไม่ดี อีกวิธีหนึ่งคุณอาจจะสามารถเรียกใช้ grub-mkconfig เพื่อแก้ไข ฉันยังไม่ได้ทดสอบกับ distros เหล่านั้นดังนั้นตรวจสอบสถานการณ์ของคุณ
ก่อนอื่นคุณต้องรู้ชื่อกลุ่มวอลุ่มที่อาจมีเครื่องหมายขีดกลางอยู่ ถ้าเป็นเช่นนั้นการใช้ / dev / mapper / การอ้างอิงใด ๆ จะต้องมีขีดกลางสองอัน ใน 16.04 มันเป็นค่าเริ่มต้นที่จะมี "-vg" ผนวกเข้ากับชื่อดังนั้นสิ่งนี้ควรจะถือว่า
ประการที่สองคุณควรทราบว่าการทำสิ่งนี้ล้มเหลวอาจทำให้ระบบของคุณไม่สามารถบูตได้และทำให้ต้องบูตจากดิสก์กู้ชีพและแก้ไขสิ่งที่ทำให้เกิดการหยุดทำงาน (aka: อย่าทำเช่นนี้ในการผลิต )
เพื่อทำการเปลี่ยนชื่อใช้งานlvrename oldname newname
จริง
หลังจากเปลี่ยนชื่อคุณต้องแก้ไขทั้งสอง/etc/fstab
และ/boot/grub/grub.cfg
เพื่ออัปเดตการใช้ชื่อสำหรับการอ้างอิงใด ๆ ไปยังรูทของคุณและอาจเป็นตำแหน่งการแลกเปลี่ยนของคุณ
นอกจากนี้คุณต้องเรียกใช้คำสั่งนี้เพื่ออัปเดต initramfs สำหรับเมล็ดทั้งหมด
update-initramfs -c -k all
ฉันใช้สคริปต์ต่อไปนี้เพื่อจัดการสิ่งนี้เมื่อปรับใช้แม่แบบใหม่ อีกครั้งไม่ทำเช่นนี้ในการผลิตจนกว่าคุณจะมีความอดทนสูงสำหรับการหยุดทำงาน
#!/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
หากคุณมีการปรับปรุงสคริปต์นี้โปรดแบ่งปัน ฉันมักจะมองหาวิธีในการปรับปรุงและพิจารณาคดีขอบต่างๆ
sed -i
sed: no input files
ลบ-i
ธง
vgrename
ค่อนข้างจะแล้วlvrename
และเนื่องจาก/boot/grub/grub.cfg
ถูกสร้างขึ้นจากรายการใน/etc/grub.d
คุณจะต้องทำงานupdate-grub
หลังจากเปลี่ยนชื่อแทนที่จะแก้ไขมันโดยตรง
update-grub
จะไม่สามารถทำงานได้อย่างถูกต้องก่อนรีบูต - มันล้มเหลวด้วยข้อผิดพลาดของ/usr/sbin/grub-probe: error: failed to get canonical path of '/dev/mapper/ubuntu--vg-root'
ฉัน สำหรับระบบที่/boot/grub/grub.cfg
สร้างขึ้นอัตโนมัติบางทีตัวเลือกที่ปลอดภัยที่สุดคือการอัปเดตด้วยตนเองเช่นเดียวกับในสคริปต์นี้จากนั้นรีบูตจากนั้นเรียกใช้update-grub
จากนั้นรีบูตอีกครั้ง
/boot/grub/grub.cfg
ไม่ควรแก้ไขไฟล์ด้วยตนเอง
มีส่วนหัวของไฟล์ด้านล่าง:
"
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
"
สิ่งนี้จับฉันได้กับ Ubuntu 18.04.1 LTS - vgrename และการบูตล้มเหลวหรือไม่ ฉันยังตั้งข้อสังเกตว่าการปิดเครื่องหยุดทำงานเนื่องจากการสลับ (อ้างอิงชื่อ vg เก่า) umount ล้มเหลว
ฉันเปลี่ยนชื่อ vg กลับไปเป็นสิ่งที่ใช้ lvm เป็นพรอมต์ initramfs ยังไม่ได้ทำ vgrename อีกครั้ง "อย่างถูกต้อง" ตามคำแนะนำด้านบน
หลังจากเปลี่ยนชื่อคุณต้องแก้ไขทั้งสอง/etc/fstab
และ/boot/grub/grub.cfg
เพื่ออัปเดตการใช้ชื่อสำหรับการอ้างอิงใด ๆ ไปยังรูทของคุณและอาจเป็นตำแหน่งการแลกเปลี่ยนของคุณ /etc/initramfs-tools/conf.d/resume
ก็จำเป็นเช่นกัน
ดังนั้นเพิ่มรหัสนี้:
sed -i "s/${vg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume
นี่คือรุ่นที่ได้รับการแก้ไขแก้ไขการแทนที่สตริงของ vg และพิมพ์ไฟล์ที่อัพเดต
#!/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
เมื่อใช้สคริปต์นี้เครื่องอาจปิดอย่างไม่ถูกต้องเนื่องจากพยายาม "หยุด" การแมป ทั้งนี้ขึ้นอยู่กับการกำหนดค่าของคุณนี้อาจดูเหมือนเป็นเครื่องอยู่ในสถานะบูตในขณะที่ในความเป็นจริงมันไม่ได้ปิดตัวลงก่อน
การลบ "เงียบสแปลช" ออกจาก GRUB_CMDLINE_LINUX_DEFAULT จะเป็นประโยชน์เมื่อคุณเห็นข้อความ
ฉันปรับเปลี่ยนสคริปต์เล็กน้อยเพื่อเปลี่ยนชื่อโฮสต์
#!/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
เมนูการบู๊ตจำเป็นต้องมีการแก้ไขใน Ubuntu 18 (และอื่น ๆ ) ดังนั้น - ทำให้ง่ายขึ้นสำหรับการเปลี่ยนชื่อ vg และรักษาการใช้ dash ในชื่อ:
#!/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