LVM에서 루트 볼륨이 포함 된 볼륨 그룹의 이름을 어떻게 바꾸나요? 볼륨 그룹의 이름을 바꾸고 싶습니다.

루트 볼륨이있는 볼륨 그룹의 이름을 바꾸고 싶습니다. 어떻게해야합니까?



답변

참고 : 배포판에서 /boot/grub/grub.cfg 편집을 방해 할 수 있습니다. 이 경우이 스크립트는 나쁜 생각 일 수 있습니다. 또는 grub-mkconfig를 실행하여 문제를 해결할 수도 있습니다. 나는 그 배포판을 테스트하지 않았으므로 상황을 확인하십시오.

먼저 볼륨 그룹 이름에 대시가있을 수 있음을 알아야합니다. 그렇다면 / dev / mapper / 참조를 사용하는 것보다 두 개의 대시가 필요합니다. 16.04에서는 기본적으로 이름에 “-vg”가 추가되므로이를 가정해야합니다.

둘째,이 문제를 해결하면 시스템을 부팅 할 수 없어 복구 디스크로 부팅하여 다운 타임을 유발하는 문제를 해결해야합니다. (일명 : 프로덕션에서는이 작업을 수행하지 마십시오. )

실제 이름 바꾸기를 수행하려면을 사용하십시오 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

이 스크립트가 개선 된 경우 공유하십시오. 저는 항상 다양한 엣지 사례를 개선하고 설명하는 방법을 찾고 있습니다.


답변

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

답변

이것은 우분투 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에서 “quiet splash”를 제거하면 도움이됩니다.


답변

호스트 이름도 변경하기 위해 스크립트를 약간 수정했습니다.

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

답변

부팅 메뉴는 우분투 18 (및 아마도 다른 것)에서도 편집해야했습니다. 따라서 vg 이름을 변경하고 이름에 대시 사용을 유지하기 위해 단순화되었습니다.

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