
Azure Cloud Ubuntu 14.04 イメージ (/ を含む単一のパーティション) をインポートし、ルート ドライブ上のファイルがサポートする論理ボリュームに/var
なるように再構成しようとしています。/srv
(質問があるかもしれません。実際のサーバーが起動したときにOSディスクではなくデータディスクにデータを移動できるように、カスタムデータとプリロードされたデータでパッケージイメージを作成しています。)
私は次のことをしています:
dd bs=16384 count=1048576 if=/dev/zero of=/.img-loop0
sync
losetup /dev/loop0 /.img-loop0
pvcreate /dev/loop0
vgcreate data /dev/loop0
lvcreate -l 100%FREE data -n var
mkfs.ext4 -L var -E nodiscard /dev/data/var
echo "/dev/data/var /var ext4 defaults 1 1" >> /etc/fstab
cd /var
mount /var
echo Moving old /var to new /var
mv * /var
echo Moving /srv to /var/srv
mv /srv /var/
ln -s var/srv /
それから台無しにlocal-bottom
#!/bin/sh
PREREQ=""
prereqs()
{
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
log_begin_msg losetup beginning
if [ -f /root/.img-loop0 ]; then
#mount /root -o remount,nodiscard
losetup /dev/loop0 /root/.img-loop0
else
log_warning_msg No /root/.img-loop0
fi
log_end_msg losetup finished
すべてが正常に戻ったときに再起動するまで、すべてうまくいきました。
答え1
私が犯した間違いは、ルートファイルシステムがまだ読み取り専用であったinitramfsの間にループバックデバイスを設定したことでした。そのため、ループデバイスからバックアップファイルに変更を書き込もうとする試みは失敗します。
/etc/init/lvmloop.conf
読み取り/書き込みでルートファイルシステムを再マウントする責任はupstart / systemd / etcに属しているため、これを機能させるには以下を追加する必要がありました。
description "custom local LVM loopback device and setup"
start on mounted MOUNTPOINT=/
task
console output
script
LOOP0=/.img-loop0
if [ -f $LOOP0 ]; then
losetup /dev/loop0 $LOOP0 # set up loop device...
vgscan # scan for new PVs
vgchange -ay # activate VGs
vgmknodes -v # makes missing device nodes in /dev
mount /var # for some reason mountall fails to do this...
fi
end script
手順を手動で実行する必要がないように1つの場所に配置できる場合は、「より良い」ようですが、少なくとも機能します。