使用环回设备作为 LVM 的 PV 时出现无法解释的错误

使用环回设备作为 LVM 的 PV 时出现无法解释的错误

我正在尝试获取 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

如果我可以把它放在一个地方,这样我就不需要手动执行这些步骤,那感觉会“更好”,但至少它可以工作。

相关内容