Làm thế nào để bạn đổi tên nhóm âm lượng có chứa âm lượng gốc trong LVM?


20

Tôi muốn đổi tên nhóm âm lượng mà âm lượng gốc của tôi được bật. Tôi có thể làm cái này như thế nào?


Chỉ tò mò: Tại sao tôi muốn làm điều này?
guntbert

2
Trường hợp sử dụng của tôi là tôi có một mẫu VMWare mà tôi đã cài đặt với tên máy chủ "mẫu". Khi tôi triển khai mẫu đó, tôi muốn thay vì vgname không phải là "template-vg" cho tất cả các máy đó. Bám sát ý tưởng chung rằng vgname có liên quan đến tên máy chủ, tôi có tập lệnh thiết lập cho mẫu đổi tên vg với tên máy chủ. Nó cũng cho phép tôi dễ dàng đảm bảo rằng tôi đang làm việc trên vg chính xác và không phải trong phiên ssh sai.
flickerfly

Câu trả lời:


25

LƯU Ý: Bản phân phối của bạn có thể không khuyến khích chỉnh sửa /boot/grub/grub.cfg. Nếu đó là trường hợp, kịch bản này có thể là một ý tưởng tồi. Thay phiên, bạn chỉ có thể chạy grub-mkconfig để khắc phục điều đó. Tôi chưa thử nghiệm trên các bản phát hành đó, vì vậy hãy kiểm tra tình hình của bạn.

Trước tiên, bạn cần biết tên nhóm âm lượng có thể có dấu gạch ngang trong đó. Nếu có, hơn bất kỳ việc sử dụng / dev / mapper / Reference sẽ cần phải có hai dấu gạch ngang. Trong 16.04, nó mặc định có một "-vg" được gắn vào tên để điều này được giả sử.

Thứ hai, bạn nên biết rằng việc làm rối điều này có thể khiến hệ thống của bạn không thể khởi động được và dẫn đến việc phải khởi động từ đĩa cứu hộ và sửa chữa các thứ gây ra thời gian chết. (aka: Đừng làm điều này trong sản xuất. )

Để làm được việc sử dụng đổi tên thực tế lvrename oldname newname.

Sau khi đổi tên, bạn phải chỉnh sửa cả hai /etc/fstab/boot/grub/grub.cfgđể cập nhật việc sử dụng tên cho bất kỳ tham chiếu nào đến thư mục gốc của bạn và có thể cả vị trí trao đổi của bạn.

Ngoài ra, bạn cần chạy lệnh này để cập nhật initramfs cho tất cả các kernel.

update-initramfs -c -k all

Tôi sử dụng tập lệnh sau để xử lý việc này khi triển khai một mẫu mới. Một lần nữa, đừng làm điều này trong sản xuất trừ khi bạn có khả năng chịu đựng cao đối với thời gian chết.

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

Nếu bạn có bất kỳ cải tiến của kịch bản này, xin vui lòng chia sẻ. Tôi luôn tìm cách cải thiện và tính đến các trường hợp khác nhau.


Nếu bạn chạy sed -imà không có tệp đầu vào, nó sẽ bị lỗi sed: no input files. Bỏ -icờ.
wjandrea

À được rồi. Điều đó có ý nghĩa. Tự hỏi nếu phiên bản sed của tôi xử lý khác nhau. Ngoài ra, có vẻ như @Diego Souza đã lấy nó ra mà không cần sed hoàn toàn trong một bình luận khác.
flickerfly

2
Tôi tin rằng bạn có nghĩa vgrenamelà sau đó lvrename, và vì /boot/grub/grub.cfgđược tạo ra từ các mục trong /etc/grub.d, bạn sẽ cần phải chạy update-grubsau khi đổi tên thay vì chỉnh sửa trực tiếp.
Eric Streeper

Không, ý tôi là nhóm âm lượng. Ngoài ra, có lẽ bản phân phối của bạn khác với cấu hình của tôi.
flickerfly

3
Có vẻ như update-grubkhông thể chạy đúng trước khi khởi động lại - nó không thành công với lỗi của /usr/sbin/grub-probe: error: failed to get canonical path of '/dev/mapper/ubuntu--vg-root'tôi. Đối với các hệ thống /boot/grub/grub.cfgđược tạo tự động, có lẽ tùy chọn an toàn nhất là cập nhật thủ công, như trong tập lệnh này, sau đó khởi động lại, sau đó chạy update-grub, sau đó khởi động lại.
Michael Firth

1

Tập tin /boot/grub/grub.cfgkhông nên được chỉnh sửa bằng tay.

Có tiêu đề tập tin dưới đây:

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

Đúng, câu trả lời của tôi đã trở nên hơi cũ và trường hợp sử dụng của tôi cho điều này không còn nữa. Tôi khuyến khích bạn đóng góp bất cứ điều gì bạn học để đưa nó cập nhật. Phân phối và phiên bản nào bạn đang thấy điều này?
flickerfly

1

Điều này đã thu hút tôi trên Ubuntu 18.04.1 LTS - đã làm vgrename và khởi động thất bại. Tôi cũng lưu ý rằng việc tắt máy bị đình trệ vì hoán đổi (tham chiếu tên vg cũ) không thành công.

Tôi đã đổi tên vg trở lại cái mà nó đang sử dụng lvm thành dấu nhắc initramfs. Chưa thực hiện lại vgrename "đúng cách" theo hướng dẫn ở trên.


0

Sau khi đổi tên, bạn phải chỉnh sửa cả hai /etc/fstab/boot/grub/grub.cfgđể cập nhật việc sử dụng tên cho bất kỳ tham chiếu nào đến thư mục gốc của bạn và có thể cả vị trí trao đổi của bạn. /etc/initramfs-tools/conf.d/resumelà cần thiết, quá.

Vì vậy, thêm mã này:

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

Tôi không cần phải làm điều này trên Ubuntu. 'update-initramfs -c -k all' là đủ. Bạn đang sử dụng bản phân phối nào cho thấy nhu cầu này? Nó không có công cụ update-initramfs? Tôi thực hiện khởi động lại ngay sau khi chạy tập lệnh bao gồm điều này để đó cũng có thể là một yếu tố trong các kết quả khác nhau của tôi.
flickerfly

0

Đây là phiên bản sửa đổi, sửa lỗi thay thế chuỗi của vg và in các tệp đã cập nhật.

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

Khi sử dụng tập lệnh này, máy có thể không tắt chính xác vì nó cố gắng "dừng" ánh xạ. Tùy thuộc vào cấu hình của bạn, điều này thậm chí có vẻ như máy đang ở trạng thái khởi động trong khi thực tế nó thậm chí không tắt máy trước.

Sẽ rất hữu ích khi xóa "giật gân yên tĩnh" khỏi GRUB_CMDLINE_LINUX_DEFAULT khi bạn thấy các tin nhắn.


0

Tôi đã sửa đổi một chút về kịch bản để thay đổi tên máy chủ.

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

Menu khởi động cũng cần chỉnh sửa trên Ubuntu 18 (và có thể là những người khác). Vì vậy - đơn giản hóa chỉ thay đổi tên vg và duy trì việc sử dụng dấu gạch ngang trong tên:

#!/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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.