Hyper-V + debian8 + udev

  • 投稿者:
  • 投稿カテゴリー:debian

Hyper-Vでudevが利用できなかったため、ネットワーク周りについて調査した
まだ解決していない

結論(というかこれから調べる&試すこと)として
・udevにudevadmの情報を利用する(udevadm testでチェック)
・udevの動きを調べる(bus-infoを参照している?起動後にチェックさせる?)
・レガシネットワークを利用(「DEC DC21140A」をエミュレーションする?)
・debian7のudev設定など確認

ネットワークドライバはhv_netvsc

bus-infoがとれていないことがわかる

root@debian9:/home/shimizu# ethtool -i eth0
driver: hv_netvsc
version:
firmware-version: N/A
expansion-rom-version:
bus-info:
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no

root@debian9:/home/shimizu# udevadm info -a --path=/sys/class/net/eth0

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:07/VMBUS:01/vmbus_16/net/eth0':
    KERNEL=="eth0"
    SUBSYSTEM=="net"
    DRIVER==""
    ATTR{addr_assign_type}=="0"
    ATTR{addr_len}=="6"
    ATTR{address}=="00:0d:3a:50:39:a9"
    ATTR{broadcast}=="ff:ff:ff:ff:ff:ff"
    ATTR{carrier}=="1"
    ATTR{carrier_changes}=="3"
    ATTR{dev_id}=="0x0"
    ATTR{dev_port}=="0"
    ATTR{dormant}=="0"
    ATTR{flags}=="0x1003"
    ATTR{gro_flush_timeout}=="0"
    ATTR{ifalias}==""
    ATTR{ifindex}=="2"
    ATTR{iflink}=="2"
    ATTR{link_mode}=="0"
    ATTR{mtu}=="1500"
    ATTR{netdev_group}=="0"
    ATTR{operstate}=="up"
    ATTR{tx_queue_len}=="1000"
    ATTR{type}=="1"

  looking at parent device '/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:07/VMBUS:01/vmbus_16':
    KERNELS=="vmbus_16"
    SUBSYSTEMS=="vmbus"
    DRIVERS=="hv_netvsc"
    ATTRS{class_id}=="{f8615163-df3e-46c5-913f-f2d2f965ed0e}"
    ATTRS{client_monitor_conn_id}=="65552"
    ATTRS{client_monitor_latency}=="1000"
    ATTRS{client_monitor_pending}=="0"
    ATTRS{device_id}=="{000d3a50-39a9-000d-3a50-39a9000d3a50}"
    ATTRS{id}=="16"
    ATTRS{in_intr_mask}=="0"
    ATTRS{in_read_bytes_avail}=="0"
    ATTRS{in_read_index}=="262528"
    ATTRS{in_write_bytes_avail}=="520192"
    ATTRS{in_write_index}=="262528"
    ATTRS{monitor_id}=="4"
    ATTRS{out_intr_mask}=="0"
    ATTRS{out_read_bytes_avail}=="0"
    ATTRS{out_read_index}=="428120"
    ATTRS{out_write_bytes_avail}=="520192"
    ATTRS{out_write_index}=="428120"
    ATTRS{server_monitor_conn_id}=="9"
    ATTRS{server_monitor_latency}=="1000"
    ATTRS{server_monitor_pending}=="0"
    ATTRS{state}=="3"

  looking at parent device '/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:07/VMBUS:01':
    KERNELS=="VMBUS:01"
    SUBSYSTEMS=="acpi"
    DRIVERS==""
    ATTRS{hid}=="VMBUS"
    ATTRS{path}=="\_SB_.PCI0.SBRG.VMB8"
    ATTRS{power_state}=="D0"
    ATTRS{status}=="15"
    ATTRS{uid}=="0"

  looking at parent device '/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:07':
    KERNELS=="device:07"
    SUBSYSTEMS=="acpi"
    DRIVERS==""
    ATTRS{adr}=="0x00070000"
    ATTRS{path}=="\_SB_.PCI0.SBRG"

  looking at parent device '/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00':
    KERNELS=="PNP0A03:00"
    SUBSYSTEMS=="acpi"
    DRIVERS==""
    ATTRS{adr}=="0x00000000"
    ATTRS{hid}=="PNP0A03"
    ATTRS{path}=="\_SB_.PCI0"
    ATTRS{uid}=="0"

  looking at parent device '/devices/LNXSYSTM:00/LNXSYBUS:00':
    KERNELS=="LNXSYBUS:00"
    SUBSYSTEMS=="acpi"
    DRIVERS==""
    ATTRS{hid}=="LNXSYBUS"
    ATTRS{path}=="\_SB_"

  looking at parent device '/devices/LNXSYSTM:00':
    KERNELS=="LNXSYSTM:00"
    SUBSYSTEMS=="acpi"
    DRIVERS==""
    ATTRS{hid}=="LNXSYSTM"
    ATTRS{path}=="\"

root@debian9:/home/shimizu# cat /lib/systemd/network/99-default.link
[Link]
NamePolicy=kernel database onboard slot path
MACAddressPolicy=persistent

hv_netvsc

hv_vmbusに依存している

root@debian9:/home/shimizu# lsmod | grep hv
### 左からモジュール名、サイズ、参照回数、そのモジュールを利用しているモジュール名 ###
hv_utils               20480  0
hv_netvsc              36864  0
hv_storvsc             20480  2
scsi_mod              200704  4 sg,libata,sd_mod,hv_storvsc
hv_vmbus               73728  6 hyperv_keyboard,hv_netvsc,hid_hyperv,hv_utils,hyperv_fb,hv_storvsc

root@debian9:/home/shimizu# modinfo hv_netvsc
filename:       /lib/modules/4.1.0-2-amd64/kernel/drivers/net/hyperv/hv_netvsc.ko
description:    Microsoft Hyper-V network driver
license:        GPL
alias:          vmbus:635161f83edfc546913ff2d2f965ed0e
depends:        hv_vmbus
intree:         Y
vermagic:       4.1.0-2-amd64 SMP mod_unload modversions
parm:           ring_size:Ring buffer size (# of pages) (int)
parm:           debug:Debug level (0=none,...,16=all) (int)

起動時の動き

root@debian9:/home/shimizu# dmesg | grep "hv_netvsc"
[    1.303988] hv_vmbus: registering driver hv_netvsc
[    1.334760] hv_netvsc: hv_netvsc channel opened successfully
[    1.478279] hv_netvsc vmbus_16: Send section size: 6144, Section count:2560
[    1.482204] hv_netvsc vmbus_16: Device MAC 00:0d:3a:xx:xx:xx link state up

udev動作

Debian vs Ubuntu: ネットワークインタフェースの名前より
・カーネルがデバイスを検出すると、ユーザーランドの udevd は /lib/udev/rules.d/ および /etc/udev/rules.d/ に格納された
 rules スクリプトを 名前の辞書順で順次実行していく
・どの実装も自分が呼び出されるより先にネットワークインタフェースの名前が決定していた場合にはそれを上書きしない
・Debian8についてsystemd/udev の予測可能な名前の機能はデフォルトで無効にしており、独自でeth*と名付けるようにudevを変更している

root@debian9:/home/shimizu# systemctl status systemd-udevd.service
● systemd-udevd.service - udev Kernel Device Manager
   Loaded: loaded (/lib/systemd/system/systemd-udevd.service; static; vendor preset: enabled)
   Active: active (running) since 水 2015-12-23 21:26:54 JST; 1 weeks 1 days ago
     Docs: man:systemd-udevd.service(8)
           man:udev(7)
 Main PID: 161 (systemd-udevd)
   Status: "Processing..."
   CGroup: /system.slice/systemd-udevd.service
           └─161 /lib/systemd/systemd-udevd

12月 23 21:26:54 debian9 systemd[1]: Starting udev Kernel Device Manager...
12月 23 21:26:54 debian9 systemd[1]: Started udev Kernel Device Manager.

root@debian9:/home/shimizu# cat /lib/udev/rules.d/80-net-setup-link.rules
# do not edit this file, it will be overwritten on update

SUBSYSTEM!="net", GOTO="net_setup_link_end"

IMPORT{builtin}="path_id"

ACTION!="add", GOTO="net_setup_link_end"

IMPORT{builtin}="net_setup_link"

NAME=="", ENV{ID_NET_NAME}!="", NAME="$env{ID_NET_NAME}"

LABEL="net_setup_link_end"


参考URL

Linuxで使っているNICのドライバやバージョンを調べる方法いろいろ
udev で SCSI デバイス名を固定する
udevによるデバイスの命名の固定化