18.5.18. vfio-pci 커널 드라이버를 NIC에 바인딩


VFIO(가상 기능 I/O) 네트워크에 연결하는 컴퓨팅 머신에는 구성된 네트워크에 연결된 포트에 vfio-pci 커널 드라이버를 바인딩해야 합니다. 이 VFIO 네트워크에 연결하는 작업자의 머신 세트를 생성합니다.

절차

  1. 명령줄에서 VFIO 네트워크 UUID를 검색합니다.

    $ openstack network show <VFIO_network_name> -f value -c id
    Copy to Clipboard Toggle word wrap
  2. 다음 템플릿에서 클러스터에 머신 세트를 생성합니다.

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: worker
      name: 99-vhostuser-bind
    spec:
      config:
        ignition:
          version: 2.2.0
        systemd:
          units:
          - name: vhostuser-bind.service
            enabled: true
            contents: |
              [Unit]
              Description=Vhostuser Interface vfio-pci Bind
              Wants=network-online.target
              After=network-online.target ignition-firstboot-complete.service
              [Service]
              Type=oneshot
              EnvironmentFile=/etc/vhostuser-bind.conf
              ExecStart=/usr/local/bin/vhostuser $ARG
              [Install]
              WantedBy=multi-user.target
        storage:
          files:
          - contents:
              inline: vfio-pci
            filesystem: root
            mode: 0644
            path: /etc/modules-load.d/vfio-pci.conf
          - contents:
              inline: |
                #!/bin/bash
                set -e
                if [[ "$#" -lt 1 ]]; then
                    echo "Nework ID not provided, nothing to do"
                    exit
                fi
    
                source /etc/vhostuser-bind.conf
    
                NW_DATA="/var/config/openstack/latest/network_data.json"
                if [ ! -f ${NW_DATA} ]; then
                    echo "Network data file not found, trying to download it from nova metadata"
                    if ! curl http://169.254.169.254/openstack/latest/network_data.json > /tmp/network_data.json; then
                        echo "Failed to download network data file"
                        exit 1
                    fi
                    NW_DATA="/tmp/network_data.json"
                fi
                function parseNetwork() {
                    local nwid=$1
                    local pcis=()
                    echo "Network ID is $nwid"
                    links=$(jq '.networks[] | select(.network_id == "'$nwid'") | .link' $NW_DATA)
                    if [ ${#links} -gt 0 ]; then
                        for link in $links; do
                            echo "Link Name: $link"
                            mac=$(jq -r '.links[] | select(.id == '$link') | .ethernet_mac_address'  $NW_DATA)
                            if [ -n $mac ]; then
                                pci=$(bindDriver $mac)
                                pci_ret=$?
                                if [[ "$pci_ret" -eq 0 ]]; then
                                    echo "$pci bind succesful"
                                fi
                            fi
                        done
                    fi
                }
    
                function bindDriver() {
                    local mac=$1
                    for file in /sys/class/net/*; do
                        dev_mac=$(cat $file/address)
                        if [[ "$mac" == "$dev_mac" ]]; then
                            name=${file##*\/}
                            bus_str=$(ethtool -i $name | grep bus)
                            dev_t=${bus_str#*:}
                            dev=${dev_t#[[:space:]]}
    
                            echo $dev
    
                            devlink="/sys/bus/pci/devices/$dev"
                            syspath=$(realpath "$devlink")
                            if [ ! -f "$syspath/driver/unbind" ]; then
                                echo "File $syspath/driver/unbind not found"
                                return 1
                            fi
                            if ! echo "$dev">"$syspath/driver/unbind"; then
                                return 1
                            fi
    
                            if [ ! -f "$syspath/driver_override" ]; then
                                echo "File $syspath/driver_override not found"
                                return 1
                            fi
                            if ! echo "vfio-pci">"$syspath/driver_override"; then
                                return 1
                            fi
    
                            if [ ! -f "/sys/bus/pci/drivers/vfio-pci/bind" ]; then
                                echo "File /sys/bus/pci/drivers/vfio-pci/bind not found"
                                return 1
                            fi
                            if ! echo "$dev">"/sys/bus/pci/drivers/vfio-pci/bind"; then
                              return 1
                            fi
                            return 0
                        fi
                    done
                    return 1
                }
    
                for nwid in "$@"; do
                    parseNetwork $nwid
                done
            filesystem: root
            mode: 0744
            path: /usr/local/bin/vhostuser
          - contents:
              inline: |
                ARG="be22563c-041e-44a0-9cbd-aa391b439a39,ec200105-fb85-4181-a6af-35816da6baf7" 
    1
    
            filesystem: root
            mode: 0644
            path: /etc/vhostuser-bind.conf
    Copy to Clipboard Toggle word wrap
    1
    이 값을 VFIO 네트워크 UUID의 쉼표로 구분된 목록으로 바꿉니다.

    이 세트에 속하는 머신의 부팅 시 포트의 MAC 주소가 PCI 버스 ID로 변환됩니다. vfio-pci 모듈은 RHOSP 네트워크 ID로 식별되는 네트워크와 함께 사용되는 모든 포트에 바인딩됩니다.

검증

  1. 컴퓨팅 노드의 명령줄에서 다음을 입력하여 노드 이름을 검색합니다.

    $ oc get nodes
    Copy to Clipboard Toggle word wrap
  2. 노드를 디버깅할 쉘을 생성합니다.

    $ oc debug node/<node_name>
    Copy to Clipboard Toggle word wrap
  3. 현재 실행 중인 프로세스의 루트 디렉터리를 변경합니다.

    $ chroot /host
    Copy to Clipboard Toggle word wrap
  4. 다음 명령을 입력하여 머신의 각 장치를 처리하는 커널 드라이버를 나열합니다.

    $ lspci -k
    Copy to Clipboard Toggle word wrap

    출력 예

    00:07.0 Ethernet controller: Red Hat, Inc. Virtio network device
    Subsystem: Red Hat, Inc. Device 0001
    Kernel driver in use: vfio-pci
    Copy to Clipboard Toggle word wrap

    명령 출력에서 VFIO 이더넷 컨트롤러는 vfio-pci 커널 드라이버를 사용합니다.

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat