TL;TR

TL;TR

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

参考

答案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

成功启动到未缓存的根并准备好进行下一次试验。

相关内容