Linux开源存储漫谈(1)环境准备篇

近几年持续研究本地存储及分布式存储,好多东西学了忘,忘了再学走了一些弯路,总结一下,权作记录,也期望对同样对存储有浓厚兴趣的同学有所借鉴。

存储系统与CPU、内存一样,是计算机不可或缺的组成部分,存储系统的重要性见:存储系统。Linux操作系统因为其开源免费、安全、稳定、可靠,成为企业服务器部署的首选之一,亦是托管平台的首选,同时在云计算领域也得到了广泛应用。我们知道,企业应用大体上可分两种负载,事务型负载及分析负载,但是无论哪一种负载,都需要有足够好的系统整体扩展性以满足急速变化的需求,CPU、内存等计算资源可以通过更换性能更优的硬件满足系统扩展性需求,但是对于存储,容量及吞吐量的同步提升就没有那么容易了,甚至需要系统级的重构。另外,相比于CPU、内存、网络等,存储更容易引起系统性风险。所以,Linux存储必然是构建高可靠企业应用的最重要的必备技能之一

Linux开源存储漫谈,将会涵盖linux IO栈、文件系统、iSCSI、spdk、IO虚拟化等相关的技术原理介绍,配合测试环境,记录并对比不同场景下的性能指标数据,逐步构建Linux存储相关技术及工具的概要认知。但是,由于存储复杂加之本人水平有限,难免有所纰漏,还望指正共同进步

Linux存储涉及的技术比较多,为了减少不必要的干扰,建议从一个全新的、干干净净的、并且内核版本比较高的系统开始

1. 硬件及操作系统信息

CPU:英特尔酷睿10代 I5-10400F,6核12线程,12M缓存
Memory:DDR4 2666 32G
主板:技嘉B460M
硬盘:2T 希捷7200转 256M SATA + 金士顿M.2固态(NVME协议) 1T NV2 PCIe 4.0
BIOS开启VT-D
操作系统:Ubuntu-live-server 22.04.2,操作系统安装于SATA硬盘,后续spdk测试用NVME盘
网络设置,使用dhcp路由器分配ip地址(强烈建议,原因:减少不必要的干扰)
执行hostnamectl set-hostname nvme.iscsi.com
建议开启root用户(后续未经说明均为root用户执行)

2. 修改Linux启动参数启用iommu

修改/etc/default/grub文件GRUB_CMDLINE_LINUX行,然后执行grub-mkconfig后重启操作系统,使修改生效。

root@nvme:~# cat /etc/default/grub | grep "^GRUB_CMDLINE_LINUX="
GRUB_CMDLINE_LINUX="quiet intel_iommu=on"
root@nvme:~# 
root@nvme:~# grub-mkconfig -o /boot/grub/grub.cfg

通过如下命令检查iommu,注意,开启iommu后/sys/kernel/iommu_groups目录是不为空

root@nvme:~# dmesg | grep "DMAR: Intel"
[    1.493774] DMAR: Intel(R) Virtualization Technology for Directed I/O
root@nvme:~# ls /sys/kernel/iommu_groups/
0  1  2  3  4  5  6  7  8
root@nvme:~#

3. 网桥

测试qemu-kvm场景下LIO iscsi target及spdk iscsi target都会用到,先运行"apt install -y uml-utilities bridge-utils lsscsi"安装网桥及tunctl相关工具包

root@nvme:~# apt install -y uml-utilities bridge-utils lsscsi
root@nvme:~# 
root@nvme:~# vim /etc/netplan/00-installer-config.yaml
  1 # This is the network config written by 'subiquity'
  2 network:
  3   ethernets:
  4     enp3s0:
  5       dhcp4: no
  6   version: 2
  7   bridges:
  8     kvmbr0:
  9       interfaces: [enp3s0]
 10       dhcp4: no
 11       addresses:
 12         - 192.168.2.111/24
 13       routes:
 14         - to: default
 15           via: 192.168.2.1
 16       nameservers:
 17         addresses: [192.168.2.1, 8.8.8.8, 114.114.114.114]

/etc/netplan/00-installer-config.yaml修改说明,第5行"      dhcp4: true"---->"      dhcp4: no",7-17行后添加内容,第9行"enp3s0"为第4行内容,第12行为操作系统所获得IP地址,第15、17行192.168.2.12为网关地址(根据自己的网络实际设置),记住第8行kvmbr0后续会用,重启使修改生效

备注:如果宿主机安装了docker,也就是说docker0网桥和kvmbr0网桥并存时,连接kvmbr0网桥的虚拟机之间网络不通,需要做额外的kvmbr0网桥设置

4. 安装qemu-kvm,targetcli-fb,cloud-image-utils

root@nvme:~# apt install -y qemu-kvm cloud-image-utils targetcli-fb

5. 下载准备VM image

下载Ubuntu jammy cloud-image到本地,如"/root"下

root@nvme:~# wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cloud-images/jammy/current/jammy-server-cloudimg-amd64.img

6.准备qemu-vm相关镜像及配置tun设备

# 调用ssh-keygen,生产ssh-rsa密钥对
root@nvme:~# ssh-keygen -t rsa -b 4096 -C "qemu-kvm@autlogin.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:XqMeBYNchdSxKLL6yyKKfgDaZm8yYfT/UUoardKqS4A qemu-kvm@autlogin.com
The key's randomart image is:
+---[RSA 4096]----+
|       .o+o.     |
|     . o....     |
|    . + + .      |
|o .  o o o       |
|Eo .. . S =      |
|.o*... * * .     |
| ++o..+ *        |
|o.++oo.. o       |
|=o+B=. .o        |
+----[SHA256]-----+
root@nvme:~#

# 创建/data/kvm 工作目录
root@nvme:~# mkdir -p /data/kvm
root@nvme:~# cd /data/kvm/
# 拷贝步骤5下载的云镜象,并重命名为iscsi-vm.img备用
root@nvme:/data/kvm# cp ~/jammy-server-cloudimg-amd64.img iscsi-vm.img 
# 扩充iscsi-vm.img +30G
root@nvme:/data/kvm# qemu-img resize iscsi-vm.img +30G

# 创建
# 创建vm metadata.yaml文件
root@nvme:/data/kvm# vim metadata.yaml
  1 #cloud-config
  2 instance-id: iid-123456789
  3 local-hostname: vmnvme.iscsi.com


# 创建vm user-data.yaml文件,第15行用ssh-rsa公钥填充(拷贝自/root/.ssh/id_rsa.pub),余下内容自行google
root@nvme:/data/kvm# vim user-data.yaml
  1 #cloud-config
  2 users:
  3   - default
  4   - name: nvme
  5     groups: [sudo]
  6     sudo: ALL=(ALL) NOPASSWD:ALL
  7     shell: /bin/bash
  8     lock_passwd: false
  9     plain_text_passwd: ubuntu
 10 password: password
 11 chpasswd:
 12   expire: False
 13 ssh_pwauth: True
 14 ssh_authorized_keys:
 15   - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCi9i5gncFAmRoNbxclloxjgvUfSf29ahRrcTVD80rqDBP8qOwDEKiB5yJ5xd1nZ5Bz0Adfrb6iQJw6d0KyqIhgCk/vDXLmLFq+X/b2VWxTZjLxi8    kTjG6evG0qHrmc13g2h7wQCDQcVtmgwnSiytysijWxu7rI/qCRD/l701Cw4C7qBUUocxTQ46qRDQlh6AaBEEyyY4v1OlBdYf/ItKRTzdkz6jW75QNXWNdiHlk//BblPytksPkI/qdTIrDub5GsHav/lBpL    U2BG5QqBJ6MdIfqr1WcayioLv34XGJYSMYAGgu+6vnqJF1YMXhdqRvB6ymB4vHr8+8SvcwseIk3Hv18CyAjGVIpNGD2n5XT88e27S4PqU1YvvVzxoJ52ZQJz+tiAut1jO15oAiwxuzsqkyEAnEtqx717K8    hgucdfHpmDq0+BOtST8AYLl643UoquDg2MGQNEAbycj23UcD4HRHQI/wN5mlVDDxfwCsttZuYJKLlcP71K+RYCQuHT0n8MhWJqVyqoL9m1TSKU9qgMm6nF9NV73MMyYPjAbEC2/ZMkdjMsMjdHphgo1S/D    jybb1k2jzRAMidYOQnbWf7Pc9d7lrNSjLHA343ZkTIuMwlOQUrSrn23AvIcqGw9zNmnh5M9Y81x8UYv/W48zTh5/q61kRV2qEaim8RFUlkp/5Q== qemu-kvm@autlogin.com

# 创建seed.img用于qemu虚拟机用户认证
root@nvme:/data/kvm# cloud-localds seed.img user-data.yaml metadata.yaml

# 创建tun设备并连接kvmbr0网桥,用于qemu-vm
root@nvme:/data/kvm# tunctl -t tap1
Set 'tap1' persistent and owned by uid 0
root@nvme:/data/kvm# brctl addif kvmbr0 tap1
root@nvme:/data/kvm# ifconfig tap1 up

7.编辑start-vm.sh并启动qemu虚拟机

root@nvme:/data/kvm# touch start.iscsivm.sh
root@nvme:/data/kvm# chmod a+x start.iscsivm.sh
root@nvme:/data/kvm# vim start.iscsivm.sh
taskset -c 2,3 qemu-system-x86_64 \
  --enable-kvm \
  -cpu host -smp 2 \
  -m 4G \
  -drive file=iscsi-vm.img,if=none,id=disk \
  -drive if=virtio,format=raw,file=seed.img \
  -device ide-hd,drive=disk,bootindex=0 \
  -device virtio-net-pci,netdev=net0 \
  -netdev tap,ifname=tap1,script=no,id=net0 \
  -nographic
# 说明,注意第5,6行iscsi-vm.img与seed.img以及第9行tap1等信息要与上一步骤保持一致

# 运行./start.iscsivm.sh启动qeme虚拟机
root@nvme:/data/kvm# ./start.iscsivm.sh
.................
[  OK  ] Finished Wait for Network to be Configured.
         Starting Initial cloud-ini… (metadata service crawler)...
[    7.512983] cloud-init[586]: Cloud-init v. 23.1.1-0ubuntu0~22.04.1 running 'init' at Wed, 10 May 2023 02:25:50 +0000. Up 7.49 seconds.
[    7.520054] cloud-init[586]: ci-info: ++++++++++++++++++++++++++++++++++++++Net device info++++++++++++++++++++++++++++++++++++++
[    7.520806] cloud-init[586]: ci-info: +--------+------+----------------------------+---------------+--------+-------------------+
[    7.521490] cloud-init[586]: ci-info: | Device |  Up  |          Address           |      Mask     | Scope  |     Hw-Address    |
[    7.522158] cloud-init[586]: ci-info: +--------+------+----------------------------+---------------+--------+-------------------+
[    7.522859] cloud-init[586]: ci-info: |  ens3  | True |       192.168.2.112        | 255.255.255.0 | global | 52:54:00:12:34:56 |
[    7.523544] cloud-init[586]: ci-info: |  ens3  | True | fe80::5054:ff:fe12:3456/64 |       .       |  link  | 52:54:00:12:34:56 |
[    7.524226] cloud-init[586]: ci-info: |   lo   | True |         127.0.0.1          |   255.0.0.0   |  host  |         .         |
[    7.524897] cloud-init[586]: ci-info: |   lo   | True |          ::1/128           |       .       |  host  |         .         |
[    7.525573] cloud-init[586]: ci-info: +--------+------+----------------------------+---------------+--------+-------------------+
.................


虚拟机成功启动后,可以使用nvme/ubuntu直接登录vm,或使用新的shell窗口使用默认ubuntu用户及user-data.yaml中注入的ssh密钥免密登录,如

root@nvme:~# ssh ubuntu@192.168.2.112
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-70-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Wed May 10 03:03:19 UTC 2023

  System load:           0.10546875
  Usage of /:            4.7% of 31.03GB
  Memory usage:          5%
  Swap usage:            0%
  Processes:             95
  Users logged in:       0
  IPv4 address for ens3: 192.168.2.112
  IPv6 address for ens3: fd28:5471:9e7e:9100:5054:ff:fe12:3456


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status


The list of available updates is more than a week old.
To check for new updates run: sudo apt update

Last login: Wed May 10 03:02:14 2023 from 192.168.2.111
ubuntu@nvme:~$ sudo su -
root@nvme:~# ip addr show ens3
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff
    altname enp0s3
    inet 192.168.2.112/24 metric 100 brd 192.168.2.255 scope global dynamic ens3
       valid_lft 85894sec preferred_lft 85894sec
    inet6 fd28:5471:9e7e:9100:5054:ff:fe12:3456/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 6766sec preferred_lft 3166sec
    inet6 fe80::5054:ff:fe12:3456/64 scope link
       valid_lft forever preferred_lft forever
root@nvme:~#

至此,环境搭建初步完成。当然,这只是能够工作的并可以继续后续IO测试的虚拟化实现之一,如果你更加精通qemu-kvm可以启用更加高级的特性完成虚拟化环境的搭建,并完成后续的IO测试

欢迎转载,请说明出处

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值