我正在尝试获取 Azure 云 Ubuntu 14.04 映像(带有 / 的单个分区)并重新组织它,以便/var
和/srv
位于由根驱动器上的文件支持的逻辑卷上。
(为什么,你可能会问?我正在制作一个带有自定义和预加载数据的打包映像,以便当真实服务器启动时,数据可以移动到数据磁盘而不是操作系统磁盘上)
我正在执行以下操作:
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 /
然后做一个lostuplocal-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 期间设置环回设备,在此期间根文件系统仍然是只读的。因此,循环设备尝试写入后备文件的更改会失败。
将根文件系统重新挂载为读写的责任属于 upstart/systemd/etc.,因此我需要添加以下内容才能/etc/init/lvmloop.conf
使其正常工作。
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
如果我可以把它放在一个地方,这样我就不需要手动执行这些步骤,那感觉会“更好”,但至少它可以工作。