คุณเปลี่ยนชื่อกลุ่มวอลุ่มที่มีรูตวอลุ่มใน LVM ได้อย่างไร?


20

ฉันต้องการเปลี่ยนชื่อกลุ่มวอลุ่มที่ระดับเสียงรูทของฉันเปิดอยู่ ฉันจะทำสิ่งนี้ได้อย่างไร


แค่อยากรู้อยากเห็น: ทำไมฉันต้องการทำเช่นนี้?
guntbert

2
กรณีการใช้งานของฉันคือฉันมีแม่แบบ VMWare ที่ฉันติดตั้งด้วยชื่อโฮสต์ "แม่แบบ" เมื่อฉันปรับใช้แม่แบบนั้นฉันต้องการ vgname ไม่ใช่ "template-vg" สำหรับเครื่องเหล่านั้นทั้งหมด ผสานกับแนวคิดทั่วไปที่ vgname เกี่ยวข้องกับชื่อโฮสต์ฉันมีสคริปต์การตั้งค่าของฉันสำหรับเทมเพลตเปลี่ยนชื่อ vg ด้วยชื่อโฮสต์ นอกจากนี้ยังช่วยให้ฉันมั่นใจได้อย่างง่ายดายว่าฉันกำลังทำงานกับ vg ที่ถูกต้องและไม่ได้อยู่ในเซสชัน ssh ผิด
flickerfly

คำตอบ:


25

หมายเหตุ: 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ธง
wjandrea

อ่าโอเค. นั่นทำให้รู้สึก สงสัยว่ารุ่น sed ของฉันจัดการที่แตกต่างกัน นอกจากนี้ดูเหมือนว่า @Diego Souza จะถอนออกโดยไม่มีความคิดเห็นอื่นทั้งหมด
flickerfly

2
ฉันเชื่อว่าคุณหมายถึงvgrenameค่อนข้างจะแล้วlvrenameและเนื่องจาก/boot/grub/grub.cfgถูกสร้างขึ้นจากรายการใน/etc/grub.dคุณจะต้องทำงานupdate-grubหลังจากเปลี่ยนชื่อแทนที่จะแก้ไขมันโดยตรง
Eric Streeper

ไม่ฉันหมายถึงกลุ่มวอลุ่ม นอกจากนี้ distro ของคุณอาจแตกต่างจากของฉันในการตั้งค่าด้วง
flickerfly

3
ดูเหมือนว่าupdate-grubจะไม่สามารถทำงานได้อย่างถูกต้องก่อนรีบูต - มันล้มเหลวด้วยข้อผิดพลาดของ/usr/sbin/grub-probe: error: failed to get canonical path of '/dev/mapper/ubuntu--vg-root'ฉัน สำหรับระบบที่/boot/grub/grub.cfgสร้างขึ้นอัตโนมัติบางทีตัวเลือกที่ปลอดภัยที่สุดคือการอัปเดตด้วยตนเองเช่นเดียวกับในสคริปต์นี้จากนั้นรีบูตจากนั้นเรียกใช้update-grubจากนั้นรีบูตอีกครั้ง
Michael Firth

1

/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
"

ใช่คำตอบของฉันเริ่มเก่าไปหน่อยและกรณีใช้งานของฉันสำหรับเรื่องนี้ก็ไม่เป็นไร ฉันขอแนะนำให้คุณบริจาคทุกอย่างที่คุณเรียนรู้เพื่อนำมาปรับปรุงให้ทันสมัย คุณเห็นการกระจายและรุ่นใดในเรื่องนี้
flickerfly

1

สิ่งนี้จับฉันได้กับ Ubuntu 18.04.1 LTS - vgrename และการบูตล้มเหลวหรือไม่ ฉันยังตั้งข้อสังเกตว่าการปิดเครื่องหยุดทำงานเนื่องจากการสลับ (อ้างอิงชื่อ vg เก่า) umount ล้มเหลว

ฉันเปลี่ยนชื่อ vg กลับไปเป็นสิ่งที่ใช้ lvm เป็นพรอมต์ initramfs ยังไม่ได้ทำ vgrename อีกครั้ง "อย่างถูกต้อง" ตามคำแนะนำด้านบน


0

หลังจากเปลี่ยนชื่อคุณต้องแก้ไขทั้งสอง/etc/fstabและ/boot/grub/grub.cfgเพื่ออัปเดตการใช้ชื่อสำหรับการอ้างอิงใด ๆ ไปยังรูทของคุณและอาจเป็นตำแหน่งการแลกเปลี่ยนของคุณ /etc/initramfs-tools/conf.d/resumeก็จำเป็นเช่นกัน

ดังนั้นเพิ่มรหัสนี้:

sed -i "s/${vg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume

ฉันไม่จำเป็นต้องทำสิ่งนี้บน Ubuntu 'update-initramfs -c -k all' ก็เพียงพอแล้ว คุณใช้ distro แบบใดที่แสดงให้เห็นถึงความต้องการนี้ มันไม่มีเครื่องมือ update-initramfs หรือไม่ ฉันทำการรีบูตทันทีหลังจากเรียกใช้สคริปต์ที่มีสิ่งนี้เพื่อที่จะเป็นปัจจัยในผลลัพธ์ที่แตกต่าง
flickerfly

0

นี่คือรุ่นที่ได้รับการแก้ไขแก้ไขการแทนที่สตริงของ 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 จะเป็นประโยชน์เมื่อคุณเห็นข้อความ


0

ฉันปรับเปลี่ยนสคริปต์เล็กน้อยเพื่อเปลี่ยนชื่อโฮสต์

#!/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

0

เมนูการบู๊ตจำเป็นต้องมีการแก้ไขใน 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.