mips SoC에 작은 임베디드, 완전 자체 크로스 컴파일 설치가 있습니다.
SoC는 Mediatek MT7628을 기반으로 하며 Wi-Fi 인터페이스(2.4MHz만 해당), 100Mbps 이더넷 MAC 및 내부 5포트 이더넷 스위치(포트 중 하나는 MAC에 연결됨)를 갖추고 있습니다.
이더넷 장치 드라이버(mtk-eth.ko)를 설치 가능한 모듈로 컴파일했습니다.
내가 시작하면아니요이 모듈(실제로는 udevd
"자동으로" 설치될 수 없도록 이름을 바꿨습니다)에는 예상한 대로 이더넷 장치가 없습니다.
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue qlen 1000
link/ether b8:d8:12:64:b9:a0 brd ff:ff:ff:ff:ff:ff
inet 192.168.7.130/24 brd 192.168.7.255 scope global noprefixroute wlan0
valid_lft forever preferred_lft forever
지금까지는 놀라운 것이 없습니다. 다음으로 모듈을 수동으로 설치했습니다.
# modprobe mtk-eth
[ 6591.429607] mtk_soc_eth 10100000.ethernet: generated random MAC address 0a:90:77:c7:1d:f3
[ 6591.461683] mtk_soc_eth 10100000.ethernet eth0: mediatek frame engine at 0xb0100000, irq 5
[ 6591.659810] libphy: dsa slave smi: probed
[ 6591.674778] mt7628-esw 10110000.esw: nonfatal error -122 setting MTU on port 0
[ 6591.693746] mt7628-esw 10110000.esw lan (uninitialized): PHY [dsa-0.0:00] driver [Generic PHY] (irq=POLL)
[ 6591.728356] mt7628-esw 10110000.esw: configuring for fixed/mii link mode
[ 6591.736381] DSA: tree 0 setup
[ 6591.751095] mt7628-esw 10110000.esw: Link is Up - 100Mbps/Full - flow control off
[ 6595.094324] mt7628-esw 10110000.esw: port 0 link changed 0x1
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue qlen 1000
link/ether b8:d8:12:64:b9:a0 brd ff:ff:ff:ff:ff:ff
inet 192.168.7.130/24 brd 192.168.7.255 scope global noprefixroute wlan0
valid_lft forever preferred_lft forever
4: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
link/ether 0a:90:77:c7:1d:f3 brd ff:ff:ff:ff:ff:ff
5: lan@eth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop qlen 1000
link/ether 0a:90:77:c7:1d:f3 brd ff:ff:ff:ff:ff:ff
이것은 나에게 준다둘장치: 예상했지만 eth0
예상치 못했지만 lan@eth0
여전히 연결되지 않았습니다. DHCP 클라이언트를 실행하고 있지 않기 때문에 이는 맞습니다(WiFi는 IWD에 의해 별도로 처리됩니다).
연결하려면 DHCP 클라이언트를 시작하세요.
# dhcpcd -b eth0
dhcpcd-9.4.0 starting
sandbox unavailable: seccomp
DUID 00:01:00:01:c7:92:bc:8f:b8:d8:12:64:b9:a2
dhcp_vendor: No such process
sandbox unavailable: seccomp
forked to background, child pid 850
[ 6671.439622] mtk_soc_eth 10100000.ethernet eth0: configuring for fixed/mii link mode
[ 6671.447753] mtk_soc_eth 10100000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue qlen 1000
link/ether b8:d8:12:64:b9:a0 brd ff:ff:ff:ff:ff:ff
inet 192.168.7.130/24 brd 192.168.7.255 scope global noprefixroute wlan0
valid_lft forever preferred_lft forever
5: lan@if4: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop qlen 1000
link/ether 0a:90:77:c7:1d:f3 brd ff:ff:ff:ff:ff:ff
6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 9a:cf:60:d9:2e:a1 brd ff:ff:ff:ff:ff:ff
inet 192.168.7.106/24 brd 192.168.7.255 scope global dynamic noprefixroute eth0
valid_lft 43191sec preferred_lft 37791sec
"표준"만 eth0
실제로 IP 주소를 가져오는 반면 "보조" 인터페이스는 이름을 변경합니다 lan@eth0
-> lan@if4
.
두 번째 "장치"는 무엇입니까? 그 목적은 무엇이며 어떻게 사용해야 할까요(IFF를 사용해야 할까요?). 또한 종료는 eth0
실제로 "보조" 장치에서 작동하는 것처럼 보입니다.
# ip l set eth0 down
[ 8558.176702] mtk_soc_eth 10100000.ethernet eth0: Link is Down
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue qlen 1000
link/ether b8:d8:12:64:b9:a0 brd ff:ff:ff:ff:ff:ff
inet 192.168.7.130/24 brd 192.168.7.255 scope global noprefixroute wlan0
valid_lft forever preferred_lft forever
5: lan@if4: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop qlen 1000
link/ether 0a:90:77:c7:1d:f3 brd ff:ff:ff:ff:ff:ff
6: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast qlen 1000
모듈을 제거하려고 하면 mtk-eth
커널 오류가 발생합니다.
# rmmod mtk-eth
[ 6634.791361] ------------[ cut here ]------------
[ 6634.796077] WARNING: CPU: 0 PID: 841 at drivers/net/phy/phylink.c:1151 0x80302674
[ 6634.809938] RTNL: assertion failed at drivers/net/phy/phylink.c (1151)
[ 6634.819931] Modules linked in: mtk_eth(-) des_generic libdes cbc ecb algif_skcipher hmac sha512_generic sha1_generic md5 md4 algif_hash af_alg mt7603e mt76 mac80211 sha256_generic libsha256 ehci_platform ohci_platform ohci_hcd ehci_hcd cfg80211 rfkill usbcore libarc4 usb_common
[ 6634.848585] CPU: 0 PID: 841 Comm: rmmod Not tainted 5.8.0 #2
[ 6634.857694] Stack : 80450000 80410e8c 804493fc 864d1d24 00000000 00000000 00000000 00000000
[ 6634.869806] 00000000 00000000 00000000 00000000 00000000 00000001 864d1cd0 80490000
[ 6634.881851] 864d1d68 00000000 00000000 ffff00fe 00000038 8025e724 00000006 876d5e58
[ 6634.890364] 7fca7028 7fca706c 7fca7070 7fca7074 8041e310 80490000 80000000 00000009
[ 6634.905154] 80467cc0 7fc3e284 00420000 004f0950 80495220 32cc152e 08072098 80500000
[ 6634.917055] ...
[ 6634.919556] Call Trace:
[ 6634.919579] [<8025e724>] 0x8025e724
[ 6634.931103] [<8000abf4>] 0x8000abf4
[ 6634.934661] [<8000abfc>] 0x8000abfc
[ 6634.938196] [<8001d990>] 0x8001d990
[ 6634.955157] [<80302674>] 0x80302674
[ 6634.958716] [<80302674>] 0x80302674
[ 6634.968796] [<80302674>] 0x80302674
[ 6634.975843] [<8001da04>] 0x8001da04
[ 6634.979408] [<80302674>] 0x80302674
[ 6634.989141] [<80158110>] 0x80158110
[ 6634.996066] [<c00b10c4>] 0xc00b10c4
[ 6634.999625] [<c00b12c4>] 0xc00b12c4
[ 6635.009387] [<802c9c5c>] 0x802c9c5c
[ 6635.016419] [<802c991c>] 0x802c991c
[ 6635.019974] [<802c9dc0>] 0x802c9dc0
[ 6635.029705] [<802c86e0>] 0x802c86e0
[ 6635.036620] [<8007849c>] 0x8007849c
[ 6635.040176] [<800bc5a4>] 0x800bc5a4
[ 6635.049933] [<8002ec50>] 0x8002ec50
[ 6635.056920] [<8000f14c>] 0x8000f14c
[ 6635.060492]
[ 6635.068472] ---[ end trace a60217f8a7ca79c8 ]---
[ 6635.076697] ------------[ cut here ]------------
[ 6635.084835] WARNING: CPU: 0 PID: 841 at drivers/net/phy/phylink.c:1030 0x80301a4c
[ 6635.095828] RTNL: assertion failed at drivers/net/phy/phylink.c (1030)
[ 6635.105831] Modules linked in: mtk_eth(-) des_generic libdes cbc ecb algif_skcipher hmac sha512_generic sha1_generic md5 md4 algif_hash af_alg mt7603e mt76 mac80211 sha256_generic libsha256 ehci_platform ohci_platform ohci_hcd ehci_hcd cfg80211 rfkill usbcore libarc4 usb_common
[ 6635.134359] CPU: 0 PID: 841 Comm: rmmod Tainted: G W 5.8.0 #2
[ 6635.145331] Stack : 80450000 80410e80 804493fc 864d1d14 00000000 00000000 00000000 00000000
[ 6635.157222] 00000000 00000000 00000000 00000000 00000000 00000001 864d1cc0 80490000
[ 6635.169427] 864d1d58 00000000 00000000 ffff00fe 00000038 8025e724 00000006 876d5e58
[ 6635.181471] 7fca7028 7fca706c 7fca7070 7fca7074 8041e310 80490000 80000000 00000009
[ 6635.190097] 80467cc0 0000007c 00420000 004f0950 80495220 32cc152e 08072098 80500000
[ 6635.204965] ...
[ 6635.207470] Call Trace:
[ 6635.207493] [<8025e724>] 0x8025e724
[ 6635.221955] [<8000abf4>] 0x8000abf4
[ 6635.225509] [<8000abfc>] 0x8000abfc
[ 6635.229045] [<8001d990>] 0x8001d990
[ 6635.241166] [<80301a4c>] 0x80301a4c
[ 6635.244725] [<80301a4c>] 0x80301a4c
[ 6635.248258] [<80301a4c>] 0x80301a4c
[ 6635.262154] [<8001da04>] 0x8001da04
[ 6635.265718] [<c00af0c0>] 0xc00af0c0
[ 6635.269251] [<80406134>] 0x80406134
[ 6635.282048] [<80301a4c>] 0x80301a4c
[ 6635.285608] [<80302690>] 0x80302690
[ 6635.289142] [<80158110>] 0x80158110
[ 6635.301514] [<c00b1120>] 0xc00b1120
[ 6635.305074] [<c00b12c4>] 0xc00b12c4
[ 6635.308611] [<802c9c5c>] 0x802c9c5c
[ 6635.321116] [<802c991c>] 0x802c991c
[ 6635.324673] [<802c9dc0>] 0x802c9dc0
[ 6635.328209] [<802c86e0>] 0x802c86e0
[ 6635.341418] [<8007849c>] 0x8007849c
[ 6635.344976] [<800bc5a4>] 0x800bc5a4
[ 6635.348511] [<8002ec50>] 0x8002ec50
[ 6635.361159] [<8000f14c>] 0x8000f14c
[ 6635.364729]
[ 6635.366243] ---[ end trace a60217f8a7ca79c9 ]---
[ 6635.380166] ------------[ cut here ]------------
[ 6635.385575] WARNING: CPU: 0 PID: 841 at lib/refcount.c:28 0xc00b1258
[ 6635.397959] refcount_t: underflow; use-after-free.
[ 6635.406183] Modules linked in: mtk_eth(-) des_generic libdes cbc ecb algif_skcipher hmac sha512_generic sha1_generic md5 md4 algif_hash af_alg mt7603e mt76 mac80211 sha256_generic libsha256 ehci_platform ohci_platform ohci_hcd ehci_hcd cfg80211 rfkill usbcore libarc4 usb_common
[ 6635.434814] CPU: 0 PID: 841 Comm: rmmod Tainted: G W 5.8.0 #2
[ 6635.445430] Stack : 80450000 80410e80 804493fc 864d1d44 00000000 00000000 00000000 00000000
[ 6635.457327] 00000000 00000000 00000000 00000000 00000000 00000001 864d1cf0 80490000
[ 6635.469233] 864d1d88 00000000 00000000 ffff00fe 00000038 8025e724 00000006 876d5e58
[ 6635.481410] 7fca7028 7fca706c 7fca7070 7fca7074 8041e310 80490000 80000000 00000009
[ 6635.489923] 8043f744 0000007c 00420000 004f0950 80495220 32cc152e 08072098 80500000
[ 6635.504762] ...
[ 6635.507267] Call Trace:
[ 6635.507290] [<8025e724>] 0x8025e724
[ 6635.521960] [<8000abf4>] 0x8000abf4
[ 6635.525515] [<8000abfc>] 0x8000abfc
[ 6635.529050] [<8001d990>] 0x8001d990
[ 6635.541211] [<c00b1258>] 0xc00b1258
[ 6635.544767] [<c00b1258>] 0xc00b1258
[ 6635.548302] [<c00b1258>] 0xc00b1258
[ 6635.562011] [<8001da04>] 0x8001da04
[ 6635.565574] [<c00af0c0>] 0xc00af0c0
[ 6635.569108] [<80406134>] 0x80406134
[ 6635.579120] [<c00b1258>] 0xc00b1258
[ 6635.588795] [<c00b12c4>] 0xc00b12c4
[ 6635.593036] [<802c9c5c>] 0x802c9c5c
[ 6635.596590] [<802c991c>] 0x802c991c
[ 6635.600126] [<802c9dc0>] 0x802c9dc0
[ 6635.615364] [<802c86e0>] 0x802c86e0
[ 6635.618920] [<8007849c>] 0x8007849c
[ 6635.628652] [<800bc5a4>] 0x800bc5a4
[ 6635.635599] [<8002ec50>] 0x8002ec50
[ 6635.639157] [<8000f14c>] 0x8000f14c
[ 6635.649356]
[ 6635.650891] ---[ end trace a60217f8a7ca79ca ]---
하지만 시스템은 제대로 작동하는 것 같고 이더넷도 작동합니다(모듈을 다시 로드하면).
무슨 일이 일어나고 있는지 더 잘 이해하고 싶습니다.
문서 지침과 설명을 환영합니다.
답변1
유사한 구조는 foo@eth0
일반적으로 802.11q VLAN의 가상 인터페이스입니다. 이름 오른쪽에는 물리적 인터페이스가 있습니다. 이름 왼쪽에는 VLAN이 있습니다. 커널은 물리적 장치에서 적절한 VLAN 태그가 있는 프레임을 선택하여 마치 별도의 인터페이스인 것처럼 IP 계층에 제공합니다. 그런 다음 VLAN 인터페이스에서 IP 주소 등을 구성할 수 있습니다.
설명하는 소비자 인터넷 게이트웨이 장치 유형의 경우 일반적으로 모든 외부 RJ-45 이더넷 포트가 단일 스위치 ASIC에 연결됩니다. Linux를 실행하는 프로세서는 동일한 스위치 ASIC의 "내부" 포트에도 연결됩니다. (모두 동일한 SoC의 일부일 수 있지만 논리적으로는 별도의 구성 요소입니다.) VLAN 할당은 물리적 포트를 "WAN", "LAN" 또는 기타 포트로 지정하고 이를 개별적으로 Linux 커널로 가져오는 데 사용됩니다.
왜 이런 일이 발생하는지에 대해서는 실행 중인 소프트웨어에 대한 추가 정보가 필요합니다. 소프트웨어 환경(배포, NetworkManager와 같은 사용자 공간 구성 자동화 등)을 전혀 설명하지 않았습니다. OpenWrt와 같은 소비자 게이트웨이용 소프트웨어 패키지 중 다수는 ISP와 LAN 간에 NAT를 구축한다는 가정을 자동으로 설정합니다.
커널 오류는 거의 확실히 관련 없는 문제입니다. 먼지 자전거 운전자처럼 들립니다. assertion failed
즉, 코드가 내부 검사를 수행한 후 상황이 예상과 다르다는 사실을 발견하여 프로세스/스레드를 중단했습니다. refcount_t: underflow; use-after-free
커널이 일부 리소스에 대한 참조 횟수를 기록하고 있으며 일부 리소스가 해제된 후 해당 리소스를 사용하려고 함을 나타냅니다. (구체적으로 이것은 커널이 드라이버 코드의 참조 카운트가 커널의 생각보다 높다는 것을 발견했다는 것을 의미한다고 생각하지만 100% 확신할 수는 없습니다.)