近几年持续研究本地存储及分布式存储,好多东西学了忘,忘了再学走了一些弯路,总结一下,权作记录,也期望对同样对存储有浓厚兴趣的同学有所借鉴。
存储系统与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测试
欢迎转载,请说明出处