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


20

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


궁금한 점이 있습니다. 이렇게 하시겠습니까?
guntbert

2
사용 사례는 호스트 이름이 "template"인 VMWare 템플릿을 사용하는 것입니다. 해당 템플릿을 배포하면 vgname이 모든 해당 시스템에서 "template-vg"가되지는 않습니다. vgname이 호스트 이름과 관련이 있다는 일반적인 생각에 따라 템플릿에 대한 설정 스크립트가 vg의 이름을 호스트 이름으로 바꿉니다. 또한 올바른 vg에서 작업 중이며 잘못된 ssh 세션이 아닌지 쉽게 확인할 수 있습니다.
flickerfly

답변:


25

참고 : 배포판에서 /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

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


sed -i입력 파일없이 실행 하면 오류가 발생합니다 sed: no input files. -i깃발을 제거하십시오 .
wjandrea

아, 알았어요 말이 되네요 내 버전의 sed가 다르게 처리했는지 궁금합니다. 또한 @Diego Souza가 다른 의견에 전적으로 sed하지 않고 그것을 뽑은 것처럼 보입니다.
flickerfly

2
나는 당신이 vgrename오히려 그 의미를 가지고 있다고 생각 하고의에있는 항목에서 생성 lvrename되므로 이름을 바꾼 후 직접 편집하지 않고 실행해야합니다 . /boot/grub/grub.cfg/etc/grub.dupdate-grub
Eric Streeper 2016 년

아니요, 볼륨 그룹을 의미했습니다. 또한 그럽 구성에서 배포판이 광산과 다를 수 있습니다.
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

이것은 우분투 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

우분투에서 이것을 할 필요가 없었습니다. 'update-initramfs -c -k all'이면 충분합니다. 이 필요성을 보여준 어떤 배포판을 사용하고 있습니까? 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에서 "quiet splash"를 제거하면 도움이됩니다.


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

부팅 메뉴는 우분투 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.