TL;TR
无法使用 lvm2 的新默认缓存池设置 cache-policy-smq 进行启动
问题
我已经在 ubuntu 16.04 上的 SSD 驱动器上创建了一个带有 lvmcache 的 lvm 磁盘按照此,但重启服务器后无法挂载我的根卷。
我可以启动 16.04 live CD 并/dev/mapper/vg0-root
成功挂载(使用引导修复、mdadm、精简配置工具)。
经过一番挖掘,似乎 lvmcache 的新策略dm-cache-smq
在某些地方缺失/不受支持,但我不知道下一步该怎么做。
我怎样才能解决这个问题?
启动时出现错误消息
错误消息重复显示,直到挂载等待超时,然后控制台删除一个(initramfs)
shell。
Begin: Running /scripts/local-block . . . lumetad is not active yet, using direct activation during sysinit
/sbin/nodprobe failed: 1
device-mapper: cache: You have created a cache device with a lot of individual cache blocks (7600000)
All these mappings can consume a lot oF kernel memory, and take some time to read/write
Please consider increasing the cache block size to reduce the overall cache block count
device-mapper: cache-policy: unknown policy type
device-mapper: table: 252:4: cache: Error creating cache's policy
device-napper: ioctl: error adding target to table
device-mapper: reload ioctl on (252:4) failed: Invalid argument
done.
我现在的设置
/etc/initramfs-tools/模块
dm_cache
dm_cache_mq
dm_cache_smq
dm_persistent_data
dm_bufio
/etc/initramfs-tools/hooks/lvmcache
#!/bin/sh
PREREQ="lvm2"
prereqs()
{
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
if [ ! -x /usr/sbin/cache_check ]; then
exit 0
fi
. /usr/share/initramfs-tools/hook-functions
copy_exec /usr/sbin/cache_check
manual_add_modules dm_cache dm_cache_mq dm_cache_smq dm_persistent_data dm_bufio
解决方法
我将 lvmcache 改回 mq 策略以使我的服务器暂时上线,但仍在寻找使用 smq 策略的缓存解决方案。
lvremove vg0/cachedata
lvcreate -L 480M -n cachemeta vg0 /dev/sde
lvcreate -L 475000M -n cachedata vg0 /dev/sde
# Use mq here
lvconvert --type cache-pool --cachepolicy mq --chunksize 8192 --poolmetadata vg0/cachemeta --cachemode writeback vg0/cachedata --yes
lvconvert --type cache --cachepool vg0/cachedata vg0/root
参考
- 如何安装具有磁盘加密和 SSD 缓存的 Ubuntu
- 启动修复
- Bug 1247386 - lvcreate 和 lvchange 需要 '--cachepolicy' 有效性检查
答案1
这可能回答得有点晚,但我按照你帖子中的方法做了(但安装了 ubuntu 16.04.1),并且它与 smq-policy 配合使用。看来你遇到的问题已经解决了。
这是我按照命令执行的。
首先,我在 /dev/sda 上有一个大硬盘,在 /dev/sdb 上有一个 SSD。
我将 /dev/sda 格式化为一开始有 10MB 可用空间,然后是 1GB ext4 主分区,该分区将在安装中用于 /boot(您无法缓存内核,因此内核可以放在那里)。/dev/sda 的其余部分被清除为 sda2。
sudo pvcreate /dev/sda2
sudo pvcreate /dev/sdb
sudo vgcreate VG /dev/sda2 /dev/sdb
sudo lvcreate -L 3.5T -n lv VG /dev/sda2
sudo lvcreate -L 450G -n lv_cache VG /dev/sdb
sudo lvcreate -L 4.5G -n lv_cache_meta VG /dev/sdb
sudo lvconvert --type cache-pool --cachemode writeback --poolmetadata VG/lv_cache_meta VG/lv_cache
sudo lvs -a
sudo lvconvert --type cache --cachepool VG/lv_cache VG/lv
sudo lvs -a
sudo lvdisplay
sudo mkfs.ext4 /dev/VG/lv
在这一点上,我将 ubuntu 作为 / 安装在 /dev/VG/lv 分区上,并将 /boot 安装在 /dev/sda1 上。
安装后,需要重新编译此新安装的内核并进行一些修改(以 ubuntu 16.04.1 为例)
#### mount existing installation
sudo chmod 777 /var/cache/app-info/xapian/default -R
sudo add-apt-repository universe
sudo apt-get update
sudo apt-get install thin-provisioning-tools
sudo vgchange -a y VG
sudo mkdir /new
sudo nano /etc/fstab
###add this line to fstab: /dev/VG/lv /new ext4 defaults 0 0
sudo mount /dev/VG/lv
### We will need to install some new packages in the chroot, so fix internet
sudo mount --bind /dev /new/dev
sudo mount --bind /proc /new/proc
sudo mount --bind /sys /new/sys
sudo cp /etc/resolv.conf /new/etc/resolv.conf
sudo chroot /new
echo 'nameserver 8.8.4.4' | sudo tee -a /etc/resolv.conf
sudo add-apt-repository universe
sudo apt-get update
sudo apt-get install thin-provisioning-tools
#### recompile kernel with additional hook for dm_cache_smq
echo "dm_cache" >> /etc/initramfs-tools/modules
echo "dm_cache_mq" >> /etc/initramfs-tools/modules
echo "dm_cache_smq" >> /etc/initramfs-tools/modules
echo "dm_persistent_data" >> /etc/initramfs-tools/modules
echo "dm_bufio" >> /etc/initramfs-tools/modules
nano /etc/initramfs-tools/hooks/cache_hook
内容来自这里:http://forums.debian.net/viewtopic.php?f=5&t=119644 最后一行已修改,以便 smq 可以正常工作
#!/bin/sh
PREREQ="lvm2"
prereqs()
{
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
if [ ! -x /usr/sbin/cache_check ]; then
exit 0
fi
. /usr/share/initramfs-tools/hook-functions
copy_exec /usr/sbin/cache_check
manual_add_modules dm_cache dm_cache_mq dm_cache_smq dm_persistent_data dm_bufio
然后我们继续下面的操作来编译内核并且把它放到正确的位置。
chmod +x /etc/initramfs-tools/hooks/cache_hook
mkdir /realboot
mount /dev/sda1 /realboot
update-initramfs -v -u -k all -b /realboot
现在重启,它就成功了。我已经在 2 台机器上尝试过了,接下来还会有更多。
答案2
让情况更有趣一点的是,我的根文件系统位于 md raid 5 阵列上的 lvm 卷上。在 ssd 磁盘上对根卷进行写回缓存导致系统无法启动,并在 busybox 中停止,我需要仔细阅读上述解决方案来修复此问题。为了恢复启动,我使用 Ubuntu 启动 USB 棒启动了系统,安装了 mdadm 以启动 md 阵列,将 universe 添加到 /etc/apt/sources.list 以便能够安装 thin-provisioning-tools,并删除了根卷上的缓存:
Boot from Ubuntu USB startup stick
# sudo edit /etc/apt/sources.list # add "universe" to all deb lines
# sudo apt update
# sudo apt install -y mdadm
# sudo mdadm --assemble /dev/md0
# sudo apt install -y thin-provisioning-tools
# sudo lvm
lvm> lvconvert --splitcache vg/root
Logical volume vg/root is not cached and cache pool vg/CacheRoot is unused.
# exit
# reboot
成功启动到未缓存的根并准备好进行下一次试验。