루트 볼륨이있는 볼륨 그룹의 이름을 바꾸고 싶습니다. 어떻게해야합니까?
루트 볼륨이있는 볼륨 그룹의 이름을 바꾸고 싶습니다. 어떻게해야합니까?
답변:
참고 : 배포판에서 /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
깃발을 제거하십시오 .
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
"
이름을 변경 한 후에는 모두를 편집해야 /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