LVMでルートボリュームを含むボリュームグループの名前を変更するにはどうすればよいですか?


20

ルートボリュームが存在するボリュームグループの名前を変更したい。これどうやってするの?


好奇心が強い:なぜこれをしたいのですか?
-guntbert

2
私のユースケースは、ホスト名「template」でインストールしたVMWareテンプレートがあることです。そのテンプレートを展開したら、これらのすべてのマシンのvgnameを「template-vg」にしないでください。vgnameはホスト名に関連しているという一般的な考えに固執して、テンプレートのセットアップスクリプトでホスト名を使用してvgの名前を変更します。また、間違ったsshセッションではなく、正しいvgで作業していることを簡単に保証できます。
フリッカーフライ

回答:


25

注:ディストリビューションは、/ boot / grub / grub.cfgの編集を推奨しない場合があります。その場合、このスクリプトは悪い考えかもしれません。あるいは、単にgrub-mkconfigを実行して修正することもできます。これらのディストリビューションではテストしていませんので、状況を確認してください。

まず、ボリュームグループ名にダッシュが含まれている可能性があることを知る必要があります。その場合、/ dev / mapper /参照を使用するには2つのダッシュが必要です。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なしでそれを実行したように見えます。
フリッカーフライ

2
私はあなたがvgrenameむしろを意味したと信じてlvrenameおり、の/boot/grub/grub.cfgエントリから生成されるため、直接編集するのではなく、名前を変更/etc/grub.dしたupdate-grub後に実行する必要があります。
エリックストリーパー

いいえ、ボリュームグループを意味しました。また、恐らくあなたのディストリビューションはgrubの設定が私のディストリビューションとは異なります。
フリッカーフライ

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、再度再起動することです。
マイケルファース

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
"

うん、私の答えは少し古くなっており、これに対する私のユースケースはもはや問題ではありません。学んだことを最新のものにするために貢献してください。これはどのディストリビューションとバージョンで見られますか?
フリッカーフライ

1

これはubuntu 18.04.1 LTSで私を捕まえました-vgrenameとブートは失敗しましたか?また、スワップ(古いvg名を参照)umountが失敗したため、シャットダウンが停止したことにも注意しました。

vgの名前を、initvmfsプロンプトでlvmを使用していたものに戻しました。上記の手順に従って、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」で十分でした。この必要性を示すどのディストリビューションを使用していますか?update-initramfsツールはありませんか?これを含むスクリプトを実行した直後に再起動するので、結果が異なる場合があります。
フリッカーフライ

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名のみを変更し、名前にダッシュを使用することを維持するために単純化されました。

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