用qemu模拟scsi设备

简介: 用qemu模拟scsi设备

参考

实验

建立下面的PCI总线拓扑,然后来模拟scsi磁盘的添加和删除

  • PCI总线拓扑
root@ubuntu-vm:~# lspci -tv
-[0000:00]-+-00.0  Intel Corporation 440FX - 82441FX PMC [Natoma]
           +-01.0  Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
           +-01.1  Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
           +-01.3  Intel Corporation 82371AB/EB/MB PIIX4 ACPI
           +-02.0  Device 1234:1111
           +-03.0  Red Hat, Inc. Virtio filesystem
           +-04.0  Red Hat, Inc. Virtio network device
           +-05.0  Red Hat, Inc. Virtio block device
           +-06.0  Red Hat, Inc. Virtio block device
           \-07.0-[01]--+-03.0  Red Hat, Inc. Virtio SCSI
                        \-04.0  Red Hat, Inc. Virtio SCSI
  • 实验用的块设备
root@ubuntu-vm:~# ls /sys/block/ -l
lrwxrwxrwx 1 root root 0 Sep  1 16:37 sda -> ../devices/pci0000:00/0000:00:07.0/0000:01:03.0/virtio4/host0/target0:0:0/0:0:0:0/block/sda
lrwxrwxrwx 1 root root 0 Sep  1 16:34 sdb -> ../devices/pci0000:00/0000:00:07.0/0000:01:04.0/virtio5/host1/target1:0:0/1:0:0:0/block/sdb

步骤

启动虚拟机的命令

qemu-system-x86_64 \
        -m 2G \
        -smp 4 \
        --kernel "./linux-6.4/arch/x86_64/boot/bzImage" \
        --append "noinitrd rootfstype=ext4 root=/dev/vda rw console=ttyS0" \
        --nographic \
        -fsdev local,security_model=passthrough,id=fsdev0,path=./share \
        -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare \
        -netdev user,id=eth0,hostfwd=tcp::8765-:22 -device virtio-net-pci,netdev=eth0 \
        -drive if=none,file=./slave2.qcow2,format=qcow2,id=hd0 \
        -device virtio-blk-pci,drive=hd0 \
        -drive if=none,file=./test_disk.qcow2,format=qcow2,id=hd1 \
        -device virtio-blk-pci,drive=hd1,num-queues=2 \
        --enable-kvm \
        \
        -device pci-bridge,id=bridge0,chassis_nr=2 \
        -device virtio-scsi-pci,id=scsi0,bus=bridge0,addr=0x3 \
        -device scsi-hd,drive=hd2,bus=scsi0.0 \
        -drive if=none,file=./test_disk2.qcow2,format=qcow2,id=hd2 \
        -device virtio-scsi-pci,id=scsi1,bus=bridge0,addr=0x4 \
        -device scsi-hd,drive=hd3,bus=scsi1.0 \
        -drive if=none,file=./test_disk3.qcow2,format=qcow2,id=hd3 \

查看scsi磁盘

root@ubuntu-vm:~# lsscsi -v
[0:0:0:0]    disk    QEMU     QEMU HARDDISK    2.5+  /dev/sda
dir: /sys/bus/scsi/devices/0:0:0:0  [/sys/devices/pci0000:00/0000:00:07.0/0000:01:03.0/virtio4/host0/target0:0:0/0:0:0:0]
[1:0:0:0]    disk    QEMU     QEMU HARDDISK    2.5+  /dev/sdb
dir: /sys/bus/scsi/devices/1:0:0:0  [/sys/devices/pci0000:00/0000:00:07.0/0000:01:04.0/virtio5/host1/target1:0:0/1:0:0:0]

剔除和增加

方法1

  • 剔除
# echo 1 > /sys/block/sda/device/delete
# echo 1 > /sys/bus/pci/devices/0000\:00\:07.0/0000\:01\:03.0/remove

此时只剩下sdb:

# lsscsi
[1:0:0:0]    disk    QEMU     QEMU HARDDISK    2.5+  /dev/sdb
  • 添加
# echo 1 > /sys/bus/pci/devices/0000\:00\:07.0/rescan

可以看到,sda又被添加回来:

# lsscsi
[0:0:0:0]    disk    QEMU     QEMU HARDDISK    2.5+  /dev/sda
[1:0:0:0]    disk    QEMU     QEMU HARDDISK    2.5+  /dev/sdb

方法2

  • 剔除
# echo 1 > /sys/block/sda/device/delete

此时只剩下sdb:

# lsscsi
[1:0:0:0]    disk    QEMU     QEMU HARDDISK    2.5+  /dev/sdb
  • 添加
# echo 1 > /sys/class/scsi_host/host0/scan

可以看到,sda又被添加回来:

# lsscsi
[0:0:0:0]    disk    QEMU     QEMU HARDDISK    2.5+  /dev/sda
[1:0:0:0]    disk    QEMU     QEMU HARDDISK    2.5+  /dev/sdb
BASH 复制 全屏

完。

相关文章
|
存储 固态存储 Linux
BLOCK 层这么多参数都是什么意思?!
每个 request queue 会维护一个 struct queue_limits 结构来描述对应的块设备的硬件参数,这些参数描述了硬件存储单元的组织方式,会影响 block layer 的很多行为,其中部分参数在 `/sys/block//queue/` 下导出 ```c struct request_queue { struct queue_limits limits; ... } `
4247 1
|
运维 Ubuntu Linux
【树莓派4B安装18.04桌面+远程SSH】
【树莓派4B安装18.04桌面+远程SSH】
735 0
|
监控 调度 开发工具
IO神器blktrace使用介绍
## 前言 1. blktrace的作者正是block io的maintainer,开发此工具,可以更好的追踪IO的过程。 2. blktrace 结合btt可以统计一个IO是在调度队列停留的时间长,还是在硬件上消耗的时间长,利用这个工具可以协助分析和优化问题。 ## blktrace的原理 一个I/O请求的处理过程,可以梳理为这样一张简单的图: ![](http://image
19465 0
|
Java 测试技术 Go
利用 GitHub Action 自动发布 Docker
最近公司内部项目的发布流程接入了 GitHub Actions,整个体验过程还是比较美好的;本文主要目的是对于没有还接触过 GitHub Actions的新手,能够利用它快速构建自动测试及打包推送 Docker 镜像等自动化流程。
|
Linux
如何让linux显示器命令行界面不显示
若需在命令行界面快速关闭屏幕,可选方法包括:使用`setterm --blank force`立即关闭屏幕;利用`sudo vbetool dpms off`将显示器置于低功耗模式;在X server环境下执行`xset dpms force off`关闭屏幕;或是针对笔记本通过`echo 0 | sudo tee /sys/class/backlight/*/brightness`关闭背光。以上任一方法均可实现屏幕关闭,部分操作需要管理员权限,屏幕通常会在按键或移动鼠标后自动恢复。
1284 10
|
11月前
|
存储 安全 Java
jdk21的外部函数和内存API(MemorySegment)(官方翻译)
本文介绍了JDK 21中引入的外部函数和内存API(MemorySegment),这些API使得Java程序能够更安全、高效地与JVM外部的代码和数据进行互操作,包括调用外部函数、访问外部内存,以及使用不同的Arena竞技场来分配和管理MemorySegment。
355 1
jdk21的外部函数和内存API(MemorySegment)(官方翻译)
|
自然语言处理
|
API Android开发 容器
36. 【Android教程】侧滑菜单:DrawerLayout
36. 【Android教程】侧滑菜单:DrawerLayout
294 1
|
网络协议 安全 Java
python中socket关闭连接和释放资源
【4月更文挑战第6天】本教程讲解了网络通信后如何正确关闭连接和释放资源,以保证程序稳定性、性能及避免资源泄露和安全问题。内容涵盖TCP、HTTP连接关闭,数据库连接释放,以及内存、文件句柄、线程等资源管理。建议使用异常处理、遵循编程语言最佳实践,并定期审查代码以优化资源管理。

热门文章

最新文章