建到 ECKD DASD 直通)
虛擬化硬件仿真【免費(fèi)下載鏈接】qemuOfficial QEMU mirror. Please see https://www.qemu.org/contribute/ for how to submit changes to QEMU. Pull Requests are disabled. Please only use release tarballs from the QEMU website.項(xiàng)目地址https://gitcode.com/gh_mirrors/qe/qemu點(diǎn)擊查看免費(fèi)下載vfio-ccw 是 QEMU 在 s390x 架構(gòu)上實(shí)現(xiàn) I/O 子通道subchannel直通passthrough的機(jī)制它基于 Linux 內(nèi)核的 mediated devicemdev基礎(chǔ)設(shè)施將宿主機(jī)上特定 I/O 子通道及其后端設(shè)備直接交付給客戶機(jī)使用宿主機(jī)不再與該子通道交互。本文以 docs/system/s390x/vfio-ccw.rst 為主干完整講解從宿主機(jī)側(cè) mdev 創(chuàng)建、QEMU 命令行掛載到客戶機(jī)內(nèi)設(shè)備驗(yàn)證的全流程并深入 hw/vfio/ccw.c 源碼剖析其 region 映射、中斷通知與設(shè)備生命周期實(shí)現(xiàn)幫助你掌握 s390x 平臺(tái) DASD 等 CCW 設(shè)備直通的完整實(shí)戰(zhàn)方案。vfio-ccw 是什么vfio-ccw基于 mediated vfio device 基礎(chǔ)設(shè)施允許將某些 I/O 子通道及其上的設(shè)備提供給客戶機(jī)guest使用。一旦完成直通宿主機(jī)host將不再與該子通道/設(shè)備交互設(shè)備的控制權(quán)整體移交到客戶機(jī)側(cè)。從架構(gòu)上看vfio-ccw 屬于 CCWChannel Command Word通道體系下的設(shè)備直通方案與 vfio-pci 在 PCI 場(chǎng)景的定位類似。在 QEMU 的 s390x 支持中直通類設(shè)備vfio-pci、vfio-ccw 等與其他 CCW 設(shè)備virtio-ccw、3270一樣掛載在虛擬通道子系統(tǒng)channel subsystem之上可參考 docs/system/target-s390x.rst 中關(guān)于設(shè)備直通的總體描述以及 docs/system/s390x/css.rst 中關(guān)于虛擬通道子系統(tǒng)CSS的說(shuō)明。適用性與已知限制原文檔明確給出兩條關(guān)鍵邊界vfio-ccw 應(yīng)適用于大多數(shù)非 QDIO 設(shè)備QDIO 是 s390x 上用于網(wǎng)絡(luò)等高速 I/O 的隊(duì)列式直接 I/O 協(xié)議但只有 ECKD DASDExtended Count Key Data 直接訪問(wèn)存儲(chǔ)設(shè)備經(jīng)過(guò)實(shí)際測(cè)試。ECKD DASD 是 IBM 大型機(jī)平臺(tái)的傳統(tǒng)磁盤(pán)格式例如經(jīng)典的 3390 系列磁盤(pán)。這意味著在生產(chǎn)環(huán)境中vfio-ccw 直通的主要且經(jīng)過(guò)驗(yàn)證的用途就是把 ECKD DASD 直通給客戶機(jī)對(duì) QDIO 類設(shè)備如 OSA 網(wǎng)絡(luò)適配器則不在 vfio-ccw 的適用范圍之內(nèi)。Step 1配置宿主機(jī)設(shè)備host sidevfio-ccw 依賴內(nèi)核的 mdevmediated device框架每個(gè) mdev 都通過(guò)一個(gè) UUID 唯一標(biāo)識(shí)因此第一步是獲取一個(gè) UUID。推薦方式使用 mdevctl原文檔推薦使用mdevctl工具完成宿主機(jī)側(cè)配置而非手動(dòng)操作 sysfs因?yàn)樗梢猿志没O(shè)備定義、支持開(kāi)機(jī)自動(dòng)啟動(dòng)。生成 UUID 并定義設(shè)備的完整命令如下[roothost ~]# uuidgen 7e270a25-e163-4922-af60-757fc8ed48c6若希望讓下面配置的設(shè)備在系統(tǒng)啟動(dòng)時(shí)自動(dòng)啟用需要兩步用driverctl將子通道0.0.0313的驅(qū)動(dòng)覆蓋set-override為vfio_ccw保證開(kāi)機(jī)時(shí)該子通道直接綁定 vfio-ccw 驅(qū)動(dòng)用mdevctl define定義該 UUID 對(duì)應(yīng)的 mdev-a表示自動(dòng)啟動(dòng)auto-start[roothost ~]# driverctl -b css set-override 0.0.0313 vfio_ccw [roothost ~]# mdevctl define -u 7e270a25-e163-4922-af60-757fc8ed48c6 \ -p 0.0.0313 -t vfio_ccw-io -a其中-p指定父設(shè)備即子通道-t指定 mdev 類型vfio_ccw-io。手動(dòng)方式直接操作 sysfs如果無(wú)法使用或不想使用mdevctl可以按下面的手動(dòng)流程配置以下命令針對(duì)示例設(shè)備實(shí)際請(qǐng)?zhí)鎿Q為你的設(shè)備標(biāo)識(shí)① 定位設(shè)備的子通道。設(shè)備在客戶機(jī)里通常以其設(shè)備號(hào)如0.0.2b09被引用但在宿主機(jī)側(cè)需要找到它對(duì)應(yīng)的子通道號(hào)。使用lscss過(guò)濾并提取子通道[roothost ~]# lscss | grep 0.0.2b09 | awk {print $2} 0.0.0313這里0.0.0313就是該設(shè)備對(duì)應(yīng)的子通道。② 將子通道從標(biāo)準(zhǔn) I/O 子通道驅(qū)動(dòng)解綁改綁到 vfio-ccw 驅(qū)動(dòng)[roothost ~]# echo 0.0.0313 /sys/bus/css/devices/0.0.0313/driver/unbind [roothost ~]# echo 0.0.0313 /sys/bus/css/drivers/vfio_ccw/bind③ 創(chuàng)建由 UUID 標(biāo)識(shí)的 mediated device。在子通道的 mdev 支持類型目錄vfio_ccw-io下寫(xiě)入 UUID 即可創(chuàng)建 mdev[roothost ~]# echo 7e270a25-e163-4922-af60-757fc8ed48c6 \ /sys/bus/css/devices/0.0.0313/mdev_supported_types/vfio_ccw-io/create創(chuàng)建成功后該 mdev 會(huì)在/sys/bus/mdev/devices/7e270a25-e163-4922-af60-757fc8ed48c6下暴露這就是后續(xù) QEMU 需要引用的 sysfs 路徑。Step 2配置 QEMU 并啟動(dòng)客戶機(jī)命令行掛載 vfio-ccw 設(shè)備QEMU 側(cè)通過(guò)-device vfio-ccw掛載已創(chuàng)建的 mdev。除sysfsdev指定宿主機(jī) mdev 路徑外還可以用devno指定設(shè)備在客戶機(jī)中呈現(xiàn)的設(shè)備號(hào)-device vfio-ccw,devnofe.0.1234,sysfsdev\ /sys/bus/mdev/devices/7e270a25-e163-4922-af60-757fc8ed48c6參數(shù)說(shuō)明sysfsdev宿主機(jī)上 mdev 的 sysfs 路徑即上一步創(chuàng)建出的 mdevdevnofe.0.1234可選的設(shè)備地址指定該設(shè)備在客戶機(jī)中呈現(xiàn)的設(shè)備號(hào)。fe.0.1234在客戶機(jī)內(nèi)會(huì)顯示為0.0.1234fe表示不對(duì)通道子系統(tǒng)CSS做限制具體地址格式語(yǔ)義見(jiàn) docs/system/s390x/css.rst 對(duì)devno的解釋——cssid.ssid.devno其中fe為任意 cssid0表示子通道集 01234為設(shè)備號(hào)。在客戶機(jī)內(nèi)驗(yàn)證設(shè)備啟動(dòng)客戶機(jī)后設(shè)備此處為0.0.1234應(yīng)當(dāng)立即可用。驗(yàn)證步驟如下[rootguest ~]# lscss -d 0.0.1234 Device Subchan. DevType CU Type Use PIM PAM POM CHPID ---------------------------------------------------------------------- 0.0.1234 0.0.0007 3390/0e 3990/e9 f0 f0 ff 1a2a3a0a 00000000 [rootguest ~]# chccwdev -e 0.0.1234 Setting device 0.0.1234 online Done [rootguest ~]# dmesg -t (...) dasd-eckd 0.0.1234: A channel path to the device has become operational dasd-eckd 0.0.1234: New DASD 3390/0E (CU 3990/01) with 10017 cylinders, 15 heads, 224 sectors dasd-eckd 0.0.1234: DASD with 4 KB/block, 7212240 KB total size, 48 KB/track, compatible disk layout dasda:VOL1/ 0X2B09: dasda1lscss -d 0.0.1234確認(rèn)客戶機(jī)已識(shí)別該子通道設(shè)備類型為3390/0e即 3390 ECKD DASD控制單元類型3990/e9chccwdev -e 0.0.1234將設(shè)備置為在線onlinedmesg內(nèi)核日志顯示dasd-eckd驅(qū)動(dòng)成功接管該直通磁盤(pán)并在客戶機(jī)內(nèi)形成/dev/dasda塊設(shè)備dasda1為其分區(qū)。源碼級(jí)原理QEMU 側(cè) vfio-ccw 的實(shí)現(xiàn)理解了操作流程后再看 QEMU 內(nèi)部如何實(shí)現(xiàn) vfio-ccw能幫助你排查問(wèn)題并理解各配置項(xiàng)的真實(shí)含義。核心實(shí)現(xiàn)集中在 hw/vfio/ccw.c。設(shè)備類型與對(duì)象模型QEMU 中注冊(cè)的設(shè)備類型名為vfio-ccw定義于 include/hw/s390x/vfio-ccw.h 的TYPE_VFIO_CCW其父類是s390-ccwinclude/hw/s390x/s390-ccw.h 的TYPE_S390_CCW。父類S390CCWDevice記錄了hostid宿主設(shè)備號(hào)、mdevidmdev UUID和bootindex引導(dǎo)順序說(shuō)明 vfio-ccw 設(shè)備同樣支持作為客戶機(jī)引導(dǎo)設(shè)備參與 IPL詳見(jiàn) docs/devel/s390-dasd-ipl.rst 中與 vfio-ccw 相關(guān)的引導(dǎo)流程。VFIOCCWDevicehw/vfio/ccw.c的核心成員包括四個(gè)內(nèi)存映射 regionio_region、async_cmd_region異步命令區(qū)、schib_regionSCHIB 區(qū)、crw_region通道報(bào)告字區(qū)分別保存各自的size與offset三個(gè) event notifierio_notifier、crw_notifier、req_notifier對(duì)應(yīng)三種中斷事件布爾標(biāo)志force_orb_pfch對(duì)應(yīng)force-orb-pfch屬性。這些 region 通過(guò)vfio_ccw_get_region()hw/vfio/ccw.c在設(shè)備 realize 階段從內(nèi)核 vfio-ccw 設(shè)備讀取先校驗(yàn)設(shè)備標(biāo)志VFIO_DEVICE_FLAGS_CCW與 region 數(shù)量再分別獲取 I/O region必選以及異步命令、SCHIB、CRW region可選按VFIO_REGION_TYPE_CCW與對(duì)應(yīng) subtype 查詢。如果 region 數(shù)量不足或尺寸與內(nèi)核 ABI 結(jié)構(gòu)不匹配會(huì)直接報(bào)錯(cuò)退出。I/O 請(qǐng)求處理路徑客戶機(jī)發(fā)起 CCW 指令后QEMU 通過(guò)vfio_ccw_handle_request()hw/vfio/ccw.c將請(qǐng)求轉(zhuǎn)發(fā)給宿主機(jī)內(nèi)核若客戶機(jī) ORBOperation Request Block未設(shè)置 PFCHprefetch標(biāo)志且啟用了force-orb-pfchQEMU 會(huì)強(qiáng)制置位并發(fā)出警告將客戶機(jī)的 ORB 與 SCSW 拷貝進(jìn)io_region的orb_area/scsw_area通過(guò)pwrite()把整個(gè) region 寫(xiě)入 vfio 設(shè)備文件描述符內(nèi)核 vfio-ccw 驅(qū)動(dòng)據(jù)此執(zhí)行真實(shí)的通道程序根據(jù)返回錯(cuò)誤碼映射為通道指令的結(jié)束狀態(tài)cc-EBUSY→忙碌CC 1/BUSY、-ENODEV/-EACCES→不可操作CC 3、-EFAULT→生成單元異常并注入 I/O 中斷。與之對(duì)應(yīng)vfio_ccw_handle_store()hw/vfio/ccw.c在客戶機(jī)執(zhí)行 STSCHStore Subchannel時(shí)通過(guò)pread()讀取schib_region僅選擇性拷貝路徑相關(guān)位pnom/lpum/pam/pom與 PNO 標(biāo)志vfio_ccw_handle_clear()與vfio_ccw_handle_halt()分別對(duì)應(yīng) CSCH/HSCH則向async_cmd_region寫(xiě)入VFIO_CCW_ASYNC_CMD_CSCH/VFIO_CCW_ASYNC_CMD_HSCH命令若內(nèi)核未提供異步命令 region則回退到 QEMU 側(cè)模擬返回-ENOSYS。中斷與通道報(bào)告字CRW處理vfio-ccw 注冊(cè)三類中斷hw/vfio/ccw.cIO 中斷VFIO_CCW_IO_IRQ_INDEXI/O 操作完成vfio_ccw_io_notifier_handler()從io_region讀回 IRB中斷響應(yīng)塊將 SCSW/ESW 及 sense data單元檢查時(shí)同步回客戶機(jī)然后注入 I/O 中斷hw/vfio/ccw.cCRW 中斷VFIO_CCW_CRW_IRQ_INDEX通道報(bào)告字事件vfio_ccw_crw_read()循環(huán)讀取crw_region直至取空再調(diào)用css_crw_add_to_queue()進(jìn)入 CSS 隊(duì)列hw/vfio/ccw.c請(qǐng)求中斷VFIO_CCW_REQ_IRQ_INDEX宿主側(cè)請(qǐng)求移除設(shè)備vfio_ccw_req_notifier_handler()觸發(fā)qdev_unplug()完成設(shè)備熱移除hw/vfio/ccw.c。值得注意的是REQ 中斷的注冊(cè)失敗僅產(chǎn)生告警而不會(huì)導(dǎo)致設(shè)備啟動(dòng)失敗因?yàn)樵撝袛嗳笔Р挥绊懻Wx寫(xiě)操作??膳渲脤傩砸挥[vfio_ccw_propertieshw/vfio/ccw.c與類初始化hw/vfio/ccw.c定義了如下可配置項(xiàng)屬性類型/默認(rèn)值含義sysfsdevstring宿主機(jī)中被直通設(shè)備的 sysfs 路徑mdev 路徑必填fdstring直接傳入已打開(kāi)的 vfio 設(shè)備文件描述符vfio_ccw_set_fd支持可替代sysfsdevforce-orb-pfchbool默認(rèn)false強(qiáng)制在 I/O 請(qǐng)求上設(shè)置 unlimited prefetchPFCH標(biāo)志用于兼容某些客戶機(jī)驅(qū)動(dòng)行為iommufdlink設(shè)置宿主機(jī) IOMMUFD 后端設(shè)備TYPE_IOMMUFD_BACKEND供基于 iommufd 的直通路徑使用相關(guān)背景見(jiàn) docs/devel/vfio-iommufd.rstloadparmCCW loadparm定義可用于引導(dǎo)boot的設(shè)備用于客戶機(jī) IPL 場(chǎng)景生命周期與遷移限制設(shè)備 realize 階段vfio_ccw_realizehw/vfio/ccw.c依次完成父類 realize分配子通道、獲取設(shè)備名、vfio_device_attach()掛載 vfio 設(shè)備、獲取 region、注冊(cè)三類中斷 notifier任一環(huán)節(jié)失敗都會(huì)按逆序做資源清理。unrealize 則對(duì)稱地注銷 notifier、釋放 region、detach vfio 設(shè)備hw/vfio/ccw.c。需要特別留意的是vfio_ccw_vmstate將設(shè)備標(biāo)記為unmigratable 1hw/vfio/ccw.c即 vfio-ccw 直通設(shè)備當(dāng)前不支持 live migration規(guī)劃遷移方案時(shí)需將該設(shè)備排除在遷移場(chǎng)景之外。總結(jié)vfio-ccw 為 s390x 平臺(tái)提供了一條將 ECKD DASD 等 CCW 設(shè)備安全直通給客戶機(jī)的完整路徑宿主機(jī)側(cè)通過(guò) sysfs或更推薦的mdevctl創(chuàng)建vfio_ccw-io類型的 mdevQEMU 側(cè)以-device vfio-ccw,devno...,sysfsdev...掛載客戶機(jī)內(nèi)即可看到真實(shí)的dasd-eckd塊設(shè)備。其底層實(shí)現(xiàn)hw/vfio/ccw.c通過(guò) I/O、異步命令、SCHIB、CRW 四個(gè) region 與內(nèi)核驅(qū)動(dòng)交換 ORB/SCSW/IRB 等通道控制塊配合 IO/CRW/REQ 三類中斷完成請(qǐng)求轉(zhuǎn)發(fā)、狀態(tài)回寫(xiě)與熱移除并明確將設(shè)備聲明為不可遷移。在實(shí)際部署時(shí)請(qǐng)記住兩條邊界優(yōu)先使用 ECKD DASD唯一經(jīng)過(guò)充分測(cè)試的設(shè)備類型以及 QDIO 設(shè)備不在 vfio-ccw 的適用范圍之內(nèi)。贊分享虛擬化硬件仿真【免費(fèi)下載鏈接】qemuOfficial QEMU mirror. Please see https://www.qemu.org/contribute/ for how to submit changes to QEMU. Pull Requests are disabled. Please only use release tarballs from the QEMU website.項(xiàng)目地址https://gitcode.com/gh_mirrors/qe/qemu點(diǎn)擊查看免費(fèi)下載相關(guān)推薦QEMU s390x 直連 DASD 通道設(shè)備 IPL 引導(dǎo)全解析從硬件 Load 流程到 vfio-ccw 預(yù)取限制的軟件補(bǔ)償QEMU s390x 直連 DASD 通道設(shè)備 IPL 引導(dǎo)全解析從硬件 Load 流程到 vfio ccw 預(yù)取限制的軟件補(bǔ)償 導(dǎo)讀 本文以 QEMU 倉(cāng)庫(kù)虛擬化硬件仿真Linux/s390 vfio-ccw 深度解析基于 vfio 中介設(shè)備框架的 Channel I/O 子通道直通方案Linux/s390 vfio ccw 深度解析基于 vfio 中介設(shè)備框架的 Channel I/O 子通道直通方案 vfio ccw 是 Linux 內(nèi)核操作系統(tǒng)內(nèi)核驅(qū)動(dòng)驅(qū)動(dòng)開(kāi)發(fā)虛擬化嵌入式網(wǎng)絡(luò)存儲(chǔ)QEMU s390x zPCI 設(shè)備直通配置詳解zpci 設(shè)備與 uid、fid、target 屬性實(shí)戰(zhàn)QEMU s390x zPCI 設(shè)備直通配置詳解zpci 設(shè)備與 uid、fid、target 屬性實(shí)戰(zhàn) 導(dǎo)讀 在 s390xIBM Z / LinuxON虛擬化硬件仿真上一篇革命性離線PDF編輯器pdf-editor在瀏覽器中輕松編輯PDF的完整指南下一篇Sir Trevor最佳實(shí)踐10個(gè)提升編輯效率的技巧創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考