准备环境

升级内核

  • 升级完成后需要重启 ```bash

__kernel_update() {

  1. #导入公钥
  2. rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
  3. #添加YUM源
  4. yum install -y https://www.elrepo.org/elrepo-release-7.0-5.el7.elrepo.noarch.rpm
  5. #安装更新长期支持版内核
  6. yum install -y --enablerepo=elrepo-kernel kernel-lt kernel-lt-devel
  7. #更新GRUB配置使用新内核启动
  8. #查看配置中的所有内核版本
  9. awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
  10. _modify=$(awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg | head -1 | grep "$(uname -r)" -c)
  11. if ((_modify != 1)); then
  12. #设置新内核为默认启动项,默认情况下新内核序号为0
  13. grub2-set-default 0
  14. #更新配置
  15. grub2-mkconfig -o /boot/grub2/grub.cfg
  16. # 设置开机免输入密码
  17. sed -i 's,^ExecStart=.*$,ExecStart=-/sbin/agetty --autologin root --noclear %I,' /etc/systemd/system/getty.target.wants/getty@tty1.service
  18. # 修改系统启动等待时间
  19. sed -i 's,timeout=5$,timeout=2,' /boot/grub2/grub.cfg 2>/dev/null
  20. sed -i 's,timeout=5$,timeout=2,' /boot/efi/EFI/centos/grub.cfg 2>/dev/null
  21. sync
  22. # reboot
  23. echo "安装完成, 手动执行 reboot 重启设备"
  24. fi

} __kernel_update

  1. <a name="r5XXe"></a>
  2. ## 安装 bcache 模块
  3. - 执行就完事了
  4. ```bash
  5. __install_bcache() {
  6. yum -y install git gcc make automake autoconf libtool libuuid libuuid-devel libblkid-devel
  7. if (($(which docker | grep 'docker$' -c) != 1)); then
  8. git clone http://evilpiepirate.org/git/bcache-tools.git
  9. else
  10. docker run -it --rm -v "$(pwd)/bcache-tools":/dest --pull=always registry.cn-hangzhou.aliyuncs.com/lwmacct/file:bcache-tools-t2022012901
  11. fi
  12. _this_path=$(pwd)
  13. cd bcache-tools || exit 0
  14. make
  15. sudo make install
  16. modprobe bcache
  17. if (("$(lsmod | grep '^bcache' -c)" == 1)); then
  18. echo "bcache 模块已安装"
  19. else
  20. echo "bcache 模块不存在"
  21. fi
  22. cd "$_this_path" || exit
  23. rm -rf bcache-tools
  24. # 开机加载模块
  25. cat >/etc/sysconfig/modules/bcache.modules <<"EOF"
  26. #!/usr/bin/env bash
  27. /sbin/modinfo -F filename bcache > /dev/null 2>&1
  28. if [ $? -eq 0 ]; then
  29. /sbin/modprobe bcache
  30. fi
  31. EOF
  32. chmod +x /etc/sysconfig/modules/bcache.modules
  33. }
  34. __install_bcache

设置 bcache 加速磁盘

指定 SSD加速盘 和 被加速的机械盘

  • 这一步需要手动按需要进行

使用 lsblk 命令查看磁盘列表

  1. [root@vm ~]# lsblk
  2. NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  3. nvme0n1 259:0 0 510G 0 disk
  4. sdd 8:48 0 1.3T 0 disk
  5. sdb 8:16 0 1.1T 0 disk
  6. nvme0n2 259:1 0 520G 0 disk
  7. sde 8:64 0 1.4T 0 disk
  8. sdc 8:32 0 1.2T 0 disk
  9. sda 8:0 0 32G 0 disk
  10. ├─sda2 8:2 0 500M 0 part /boot
  11. ├─sda3 8:3 0 31.5G 0 part /
  12. └─sda1 8:1 0 2M 0 part
  13. [root@vm ~]#

从以上命令的反馈可以看得出, 我们有 两块 SSD, 分别是 nvme0n1 nvme0n2
现在我要使用
nvme0n1 给机械盘 ssd 和 ssb 加速
nvme0n2 给机械盘 sde 和 sdc 加速
命令示范

  1. make-bcache -B /dev/sdd /dev/sdb -C /dev/nvme0n1
  2. make-bcache -B /dev/sde /dev/sdc -C /dev/nvme0n2

好了, 以上命令仅仅是为了,让你了解 bcache 加速对应关系,
使用以下脚本来自动完成吧, 均匀分配机械盘和ssd

  • 如果只有 1 块 ssd, 那么这块 ssd 将会给所有机械盘加速
  • 如果有 4 块 hhd, 2块ssd, 那么, 每块 ssd 将会加速, 2块机械
  • 如果有 6 块 hhd, 2块ssd, 那么, 每块 ssd 将会加速, 3块机械

以此类推, 如不符合需求,再手动进行, 指派

  1. __bcache_disk() {
  2. _rootfs_disk=$(lsblk 2>/dev/null | grep '\s/$' -B10 | tac | grep '\sdisk' | head -1 | awk '{print $1}')
  3. _blkid=$(blkid)
  4. _disk_sdx=$(lsblk | grep '\sdisk\s' | grep 'sd[a-z]{1,2}' -P | grep -v "$_rootfs_disk" | awk '{print $1}')
  5. _disk_nvme=$(lsblk | grep '\sdisk\s' | grep 'nvme' -P | grep -v "$_rootfs_disk" | awk '{print $1}')
  6. _nvme_array=(x ${_disk_nvme//\S/ })
  7. _num=$(echo "${#_nvme_array[@]}")
  8. # 自动 make_bcache
  9. _path_make_bcache_tmp="/data/kuaicdn/conf/bcache/make_bcache.tmp"
  10. _path_make_bcache_sh="/data/kuaicdn/conf/bcache/make_bcache.sh"
  11. mkdir -p ${_path_make_bcache_sh%/*}
  12. rm -rf $_path_make_bcache_tmp $_path_make_bcache_sh
  13. i=1
  14. _count=0
  15. for _hhd in $_disk_sdx; do
  16. # wipefs -a "/dev/$_hhd"
  17. if ((i >= _num)); then i=1; fi
  18. _ssd=${_nvme_array[i]}
  19. _cmd="$_hhd $_ssd"
  20. echo "$_cmd" >>$_path_make_bcache_tmp
  21. ((i++))
  22. ((_count++))
  23. done
  24. # _disk_nvme=$(lsblk | grep '\sdisk\s' | grep 'nvme' -P | grep -v "$_rootfs_disk" | awk '{print $1}')
  25. _str=$(cat "$_path_make_bcache_tmp")
  26. for _ssd in $_disk_nvme; do
  27. _cmd=$(echo "$_str" | grep "$_ssd" | awk '{print "/dev/" $1}' | xargs -n99 | xargs -I{} echo "make-bcache -B {} -C /dev/$_ssd --wipe-bcache")
  28. # _cmd=$(echo "$_str" | grep "$_ssd" | awk '{print "/dev/" $1}' | xargs -n99)
  29. echo "$_cmd" >>$_path_make_bcache_sh
  30. done
  31. # make-bcache -B /dev/$_hhd -C /dev/$_ssd --wipe-bcache
  32. rm -rf $_path_make_bcache_tmp
  33. bash $_path_make_bcache_sh
  34. echo "bcache 加速规则位于文件 $_path_make_bcache_sh"
  35. }
  36. __bcache_disk

格式化 bcache 块, 并挂载

  • 每次 “指定 SSD加速盘 和 被加速的机械盘”, 后执行一遍命令, 可重复执行不影响 ```bash __mkfs_bcache() {

    格式化 bcache, 已格式化的不会重复格式化

    _bcache=$(lsblk | grep ‘bcache[0-9]{1,3}’ -Po | sort -u) _blkid=$(blkid) for item in $_bcache; do
    1. if (($(echo "$_blkid" | grep "$item" -c) == 0)); then
    2. mkfs.xfs -f "/dev/$item"
    3. xfs_admin -L data "/dev/$item" >/dev/null 2>&1
    4. fi
    done } __mkfs_bcache

__mount() {

  1. # 挂载磁盘并写入开机挂载
  2. sed -in-place -e '\/disk.*/d' /etc/fstab
  3. sed -in-place -e '\/data[0-9]\{1,2\}.*/d' /etc/fstab
  4. blkid -s "LABEL" -s "UUID" -s 'TYPE' | grep -E "kuaicdn|data" | grep -Eo '[0-9a-z-]{36}.*' | sed 's/"//g' | sed 's/TYPE=//g' | awk -F "-| " '{print "echo \"UUID=" $1"-"$2"-"$3"-"$4"-"$5 " /disk/"$1" "$6" defaults,noatime,nodiratime 0 0\" >> /etc/fstab; mkdir -p /disk/"$1}' | sh
  5. mount -a

} __mount

```