新聞中心
Linux Tap設(shè)備是Linux中一個(gè)非常重要的網(wǎng)絡(luò)設(shè)備,它允許我們在不使用物理網(wǎng)卡的情況下,創(chuàng)建虛擬網(wǎng)絡(luò)設(shè)備。它的應(yīng)用非常廣泛,如網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)、網(wǎng)橋、虛擬專用網(wǎng)絡(luò)(VPN)等等。但是,在實(shí)際應(yīng)用中,我們經(jīng)常會(huì)遇到各種問題,如網(wǎng)絡(luò)延遲、網(wǎng)絡(luò)連接失敗等等。這些問題的原因非常復(fù)雜,本文將從診斷的角度,介紹如何快速定位Linux Tap設(shè)備的問題原因。

一、檢查系統(tǒng)日志
在Linux中,系統(tǒng)日志是一個(gè)非常重要的工具。通過查看系統(tǒng)日志,我們可以了解系統(tǒng)的運(yùn)行情況,包括系統(tǒng)啟動(dòng)、網(wǎng)絡(luò)連接、程序運(yùn)行等等。對于Linux Tap設(shè)備問題的診斷,我們首先需要檢查系統(tǒng)日志,看看是否有相關(guān)的錯(cuò)誤信息。
在大多數(shù)Linux發(fā)行版中,系統(tǒng)日志通常存儲(chǔ)在/var/log/messages或/var/log/syslog文件中。我們可以使用tl或less命令查看最新的系統(tǒng)日志。例如,使用tl命令查看/var/log/messages文件:
“`
$ tl -f /var/log/messages
“`
如果我們在使用Tap設(shè)備的過程中,發(fā)現(xiàn)網(wǎng)絡(luò)連接失敗,可以使用grep命令查找相關(guān)的錯(cuò)誤信息,例如:
“`
$ grep -i ‘tap’ /var/log/messages
“`
這樣我們就可以篩選出與Tap設(shè)備相關(guān)的錯(cuò)誤信息了。在Linux中,許多錯(cuò)誤信息都會(huì)顯示在系統(tǒng)日志中,因此檢查系統(tǒng)日志是診斷Tap設(shè)備問題的一個(gè)重要步驟。
二、檢查網(wǎng)絡(luò)配置
Linux Tap設(shè)備依賴于網(wǎng)絡(luò)配置,如果網(wǎng)絡(luò)配置不正確,就會(huì)導(dǎo)致網(wǎng)絡(luò)連接失敗。因此,在診斷Tap設(shè)備問題時(shí),需要仔細(xì)檢查網(wǎng)絡(luò)配置,包括IP地址、網(wǎng)關(guān)、DNS等等。我們可以使用ifconfig命令查看Tap設(shè)備的網(wǎng)絡(luò)配置信息,例如:
“`
$ ifconfig tap0
tap0: flags=4099 mtu 1500
ether 00:11:22:33:44:55 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
“`
可以看到,該Tap設(shè)備的名稱為tap0,其IP地址、網(wǎng)關(guān)等信息并未顯示。如果我們需要查看Tap設(shè)備的詳細(xì)網(wǎng)絡(luò)配置信息,可以使用ip命令,例如:
“`
$ ip addr show tap0
3: tap0: mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global tap0
valid_lft forever preferred_lft forever
“`
可以看到,該Tap設(shè)備的IP地址為192.168.1.100,掩碼為24位,網(wǎng)關(guān)等信息并未顯示。如果我們在檢查網(wǎng)絡(luò)配置時(shí)發(fā)現(xiàn)配置錯(cuò)誤,可以使用ifconfig或ip命令進(jìn)行調(diào)整,例如:
“`
$ ifconfig tap0 192.168.1.100 netmask 255.255.255.0 up
“`
或
“`
$ ip addr add 192.168.1.100/24 dev tap0
$ ip link set dev tap0 up
“`
三、檢查路由表
在Linux中,路由表是一個(gè)非常重要的概念,它決定了網(wǎng)絡(luò)數(shù)據(jù)包的轉(zhuǎn)發(fā)方式。如果路由表配置不正確,就會(huì)導(dǎo)致網(wǎng)絡(luò)連接失敗。在診斷Tap設(shè)備問題時(shí),需要仔細(xì)檢查路由表信息,包括默認(rèn)路由、靜態(tài)路由等。我們可以使用route命令查看路由表信息,例如:
“`
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
“`
可以看到,該主機(jī)的默認(rèn)路由為192.168.1.1,靜態(tài)路由表為空。如果我們在檢查路由表時(shí)發(fā)現(xiàn)配置錯(cuò)誤,可以使用route命令進(jìn)行調(diào)整,例如:
“`
$ route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.254
“`
這樣會(huì)添加一條靜態(tài)路由,將網(wǎng)絡(luò)192.168.2.0/24的數(shù)據(jù)包通過網(wǎng)關(guān)192.168.1.254轉(zhuǎn)發(fā)。
四、檢查網(wǎng)絡(luò)流量
在Linux中,網(wǎng)絡(luò)流量是非常重要的,它決定了網(wǎng)絡(luò)質(zhì)量和性能。如果網(wǎng)絡(luò)流量異常,就會(huì)導(dǎo)致網(wǎng)絡(luò)連接失敗等問題。在診斷Tap設(shè)備問題時(shí),需要仔細(xì)檢查網(wǎng)絡(luò)流量,包括流量狀態(tài)、流量速度等。我們可以使用tcpdump命令查看網(wǎng)絡(luò)流量,例如:
“`
$ tcpdump -i tap0
“`
這樣會(huì)抓取該Tap設(shè)備的所有網(wǎng)絡(luò)數(shù)據(jù)包。如果我們在檢查網(wǎng)絡(luò)流量時(shí)發(fā)現(xiàn)異常,可以使用tcpdump或其他網(wǎng)絡(luò)監(jiān)控工具進(jìn)一步分析,找出流量異常的原因。
結(jié)語
相關(guān)問題拓展閱讀:
- 如何選擇一個(gè) Linux Tracer
- 在linux中是不是能看到設(shè)備節(jié)點(diǎn)就說明設(shè)備可以被訪問了解決思路
如何選擇一個(gè) Linux Tracer
tracer 是一個(gè)高級的性能分析和診斷工具,但是不要讓這名詞唬住你,如果你使用過 strace 和tcpdump,其實(shí)你就已經(jīng)使用過 tracer 了。系統(tǒng) tracer 可以獲取更多的系統(tǒng)調(diào)用和數(shù)據(jù)包。它們通常能跟蹤任意的內(nèi)核和應(yīng)用程序。
有太多的 linux tracer 可以選擇。每一種都有其官方的(或非官方的)的卡通的獨(dú)角獸吉祥物,足夠撐起一臺”兒童劇”了。
那么我們應(yīng)該使用哪個(gè) tracer 呢?
我會(huì)為兩類讀者回答這個(gè)問題,大部分人和性能/內(nèi)核工程師。過一段時(shí)間這些可能會(huì)發(fā)生變化,我會(huì)持續(xù)跟進(jìn)并補(bǔ)充,大概會(huì)一年更新一次。
多數(shù)人
多數(shù)人 (開發(fā)者,系統(tǒng)管理員,開發(fā)管理者,運(yùn)維人員,評測人員,等等) 不關(guān)心系統(tǒng)追蹤器的細(xì)節(jié)。下面是對于追蹤器你應(yīng)該知道和做的:
1. 使用perf_events分析CPU性能
使用 perf_events 做 CPU 性能分析。性能指標(biāo)可以使用flame graph 等工具做可視化。
git clone –depth 1
perf record -F 99 -a -g — sleep 30
perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > perf.svg
Linux perf_events (又稱 “perf”,同命令名) 是 Linux 用戶的官方追蹤器和性能分析器。內(nèi)置于內(nèi)核代碼,有很好維護(hù)(近來獲得快速增強(qiáng)),通常通過 linux 命令行工具包添加。
perf 有很多功能,如果只能推薦一個(gè),我選擇 CPU 性能分析。盡陵友管這只是采樣,而不是從技術(shù)上追蹤事件。最難的部分是獲取完整的棧和信息,我為 java 和 node.js 做的一個(gè)演講 Linux Profiling at Netflix中已經(jīng)說過這個(gè)問題
2.了解其他的Tracer
正如我一個(gè)朋友說的:“你不需要知道如何操作 X 射線機(jī)器,但是一旦你吞了一枚硬幣,你得知道這得去做 X 射線”,你應(yīng)該了解各種 tracer 都能做什么,這樣就能在你工作中真正需要 tracer 的時(shí)候,你既可以選擇稍后學(xué)習(xí)使用,也可以雇相應(yīng)的人來完成。
簡短來說:幾乎所有的東西都可以使用 tracer 來尺手槐進(jìn)行分析和跟蹤。如,文件系統(tǒng),網(wǎng)絡(luò)處理器,硬件驅(qū)動(dòng)器,全部的應(yīng)用程序??梢钥匆幌挛业膫€(gè)人網(wǎng)站上關(guān)于 ftrace的文章,還有我寫的薯螞關(guān)于perf_events 文檔介紹,可以做為一個(gè)追蹤(或者性能分析)的例子。
3. 尋求前端支持工具
如果你正想買一個(gè)能支持跟蹤 Linux 的性能分析工具(有許多賣這類工具的公司)。想像一下,只需要直接點(diǎn)擊一下界面就能“洞察”整個(gè)系統(tǒng)內(nèi)核,包括隱藏的不同堆棧位置的熱圖,我在Monitorama talk 中介紹了一個(gè)這樣帶圖形界面的工具。
我開源了一些我自己開發(fā)的前端工具,盡管只是 CLI (命令行界面)而不是(圖形界面)。這些工具也會(huì)讓人們更加快速容易的使用 tracer。比如下面的例子,用我的 perf_tool,跟蹤一個(gè)新進(jìn)程:
# ./execsnoopTracing exec()s. Ctrl-C to end.
PID PPID ARGS
man ls
preconv -e UTF-8
pager -s
nroff -mandoc -rLL=164n -rLT=164n -Tutf8
在 Netflix 上,我們創(chuàng)建了一個(gè) Vector,一個(gè)分析工具的實(shí)例同時(shí)也是 Linux 上的 tracer 的最終前端。
致性能或內(nèi)核工程師
我們的工作變的越來越困難,很多的人會(huì)問我們怎么樣去追蹤,哪種路徑可以用!為了正確理解一個(gè)路徑,你經(jīng)常需要花上至少100個(gè)小時(shí)才能做到。理解所有的 linux 路徑去做出理性的決定是一個(gè)浩大的工程。(我可能是唯一一個(gè)接近做到這件事情的人)
這里是我的建議,可以二選其一:
A) 選中一個(gè)全能的路徑,并且使它標(biāo)準(zhǔn)化,這將涉及花費(fèi)大量的時(shí)間去弄清楚它在測試環(huán)境中的細(xì)微差別和安全性。我現(xiàn)在推薦 SystemTap 的最新版本(ie,從源代碼構(gòu)建)。我知道有些公司已經(jīng)選用 LTTng,而且他們用的很好,盡管它不是非常的強(qiáng)大(雖然它更安全)。Sysdig 可以成為另一個(gè)候選如果它可以增加追蹤點(diǎn)或者 kprobes。
B) 遵循我上面提供的流程圖,它將意味著盡可能更多的使用 ftrace 或者 perf_event, eBPF 會(huì)得到整合,之后其他的路徑像 SystemTap/LTTng 會(huì)去填補(bǔ)這個(gè)空白。這就是我目前在 Netflix 做的工作。
tracer 的評論:
1. ftrace
我喜歡用 ftrace,它是內(nèi)核 hacker 的選擇,內(nèi)置于系統(tǒng)內(nèi)核,可以使用跟蹤點(diǎn)(靜態(tài)檢查點(diǎn)),能調(diào)用內(nèi)核 kprobes 和 uprobes 調(diào)試工具。并且提供幾個(gè)這樣的功能:帶可選過濾器和參數(shù)的事件追蹤功能;在內(nèi)核中進(jìn)行統(tǒng)計(jì)的事件計(jì)數(shù)和定時(shí)功能;還有函數(shù)流程遍歷的功能??梢钥匆幌聝?nèi)核代碼中 ftrace.txt 例子了解一下。ftrace 由 /sys 控制,僅支持單一的 root 用戶使用(但是你可以通過緩沖區(qū)實(shí)例破解以支持多用戶)。某些時(shí)候 Ftrace 的操作界面非常繁瑣,但是的確非?!癶ack”,而且它有前端界面。Steven Rostedt,ftace 的主要作者,創(chuàng)建了 trace-cmd 命令工具,而我創(chuàng)建了 perf 的工具集。我對這個(gè)工具更大的不滿就是它不可編程。舉例來說,你不能保存和獲取時(shí)間戳,不能計(jì)算延遲,不能把這些計(jì)算結(jié)果保存成直方圖的形式。你需要轉(zhuǎn)儲(chǔ)事件至用戶級別,并且花一些時(shí)間去處理結(jié)果。ftrace 可以通過 eBPF 變成可編程的。
2.perf_events
perf_events 是 Linux 用戶的主要跟蹤工具,它內(nèi)置在內(nèi)核源碼中,通常通過 linux-tools-commom 加入。也稱“perf”,同前端工具名稱,通常用來跟蹤和轉(zhuǎn)儲(chǔ)信息到一個(gè)叫做 perf.data 的文件中,perf.data 文件相當(dāng)于一個(gè)動(dòng)態(tài)的緩沖區(qū),用來保存之后需要處理的結(jié)果。ftrace 能做到的,perf_events 大都也可以做到,perf-events 不能做函數(shù)流程遍歷,少了一點(diǎn)兒“hack”勁兒(但是對于安全/錯(cuò)誤檢查有更好的支持)。它可以進(jìn)行 CPU 分析和性能統(tǒng)計(jì),用戶級堆棧解析,也可以使用對于跟蹤每行局部變量產(chǎn)生的調(diào)試信息。它也支持多用戶并發(fā)操作。和 ftrace 一樣也不支持可編程。如果要我只推薦一款 tracer,那一定是 perf 了。它能解決眾多問題,并且它相對較安全。
3. eBPF
extended Berkeley Packet Filter(eBPF)是一個(gè)可以在事件上運(yùn)行程序的高效內(nèi)核虛擬機(jī)(JIT)。它可能最終會(huì)提供 ftrace 和 perf_events 的內(nèi)核編程,并強(qiáng)化其他的 tracer。這是 Alexei Starovoitov 目前正在開發(fā)的,還沒有完全集成,但是從4.1開始已經(jīng)對一些優(yōu)秀的工具有足夠的內(nèi)核支持了,如塊設(shè)備I/O的延遲熱圖??蓞⒖计渲饕髡?Alexei Starovoitov 的BPF slides和eBPF samples。
4. SystemTap
SystemTap 是最強(qiáng)大的tracer。它能做所有事情,如概要分析,跟蹤點(diǎn),探針,uprobes(來自SystemTap),USDT和內(nèi)核編程等。它將程序編譯為內(nèi)核模塊,然后加載,這是一種獲取安全的巧妙做法。它也是從tree發(fā)展而來,在過去有很多問題(多的可怕)。很多不是 SystemTap 本身的錯(cuò)——它常常是之一個(gè)使用內(nèi)核追蹤功能,也是之一個(gè)碰到 bug 的。SystemTap 的最新版本好多了(必須由源代碼編譯),但是很多人仍然會(huì)被早期版本嚇到。如果你想用它,可先在測試環(huán)境中使用,并與irc.freenode.net上 的 #systemtap 開發(fā)人員交流。(Netflix 有容錯(cuò)機(jī)制,我們已經(jīng)使用了 SystemTap,但是可能我們考慮的安全方面的問題比你們少。)我更大的不滿是,它似乎認(rèn)為你有常常沒有的內(nèi)核 debug 信息。實(shí)際上沒有它也能做很多事情,但是缺少文檔和例子(我必須自己全靠自己開始學(xué)習(xí))。
5. LTTng
LTTng 優(yōu)化了事件采集,這比其他 tracers 做得好。它從 tree 發(fā)展而來,它的核心很簡單:通過一組小規(guī)模的固定指令集將事件寫入追蹤緩沖區(qū),這種方式使它安全、快速,缺點(diǎn)是它沒有內(nèi)核編碼的簡單途徑。我一直聽說這不是一個(gè)大問題,因?yàn)楸M管需要后期處理,它也已經(jīng)優(yōu)化到可以充分的度量。此外,它還首創(chuàng)了一個(gè)不同的分析技術(shù),更多對所有關(guān)注事件的黑盒記錄將稍后以 GUI 的方式進(jìn)行研究。我關(guān)心的是前期沒有考慮到要錄制的事件缺失問題如何解決,但我真正要做的是花更多時(shí)間來看它在實(shí)踐中用的怎么樣。這是我花的時(shí)間最少的一個(gè) tracer(沒有什么特殊原因)。
6. Ktap
ktap 在過去是一款前景很好的 tracer,它使用內(nèi)核中的 lua 虛擬機(jī)處理,在沒有調(diào)試信息的情況下在嵌入式設(shè)備上運(yùn)行的很好。它分為幾個(gè)步驟,并在有一段時(shí)間似乎超過了 Linux 上所有的追蹤器。然后 eBPF 開始進(jìn)行內(nèi)核集成,而 ktap 的集成在它可以使用 eBPF 替代它自己的虛擬機(jī)后才開始。因?yàn)?eBPF 仍將持續(xù)集成幾個(gè)月,ktap 開發(fā)者要繼續(xù)等上一段時(shí)間。我希??今年晚些時(shí)候它能重新開發(fā)。
7. dtrace4linux
dtrace4linux 主要是 Paul Fox 一個(gè)人在業(yè)余時(shí)間完成的,它是 Sun DTrace 的 Linux 版本。它引入矚目,還有一些 provider 可以運(yùn)行,但是從某種程度上來說還不完整,更多的是一種實(shí)驗(yàn)性的工具(不安全)。我認(rèn)為,顧忌到許可問題,人們會(huì)小心翼翼的為 dtrace4linux 貢獻(xiàn)代碼:由于當(dāng)年 Sun 開源DTrace 使用的是 CDDL 協(xié)議,而 dtrace4linux 也不大可能最終進(jìn)入 Linux kernel。Paul 的方法很可能會(huì)使其成為一個(gè) add-on。我很樂意看到 Linux 平臺上的 DTrace 和這個(gè)項(xiàng)目的完成,我認(rèn)為當(dāng)我加入 Netflix 后將會(huì)花些時(shí)間來協(xié)助完成這個(gè)項(xiàng)目。然而,我還是要繼續(xù)使用內(nèi)置的 tracers,如 ftrace 和 perf_events。
8.OL DTrace
Oracle Linux DTrace為了將 DTrace 引入 Linux,特別是 Oracle Linux,做出了很大的努力。這些年來發(fā)布的多個(gè)版本表明了它的穩(wěn)定進(jìn)展。開發(fā)者們以一種對這個(gè)項(xiàng)目的前景看好的態(tài)度談?wù)撝倪M(jìn) DTrace 測試套件。很多有用的 provider 已經(jīng)完成了,如:syscall, profile, sdt, proc, sched 以及 USDT。我很期待 fbt(function boundary tracing, 用于內(nèi)核動(dòng)態(tài)跟蹤)的完成,它是 Linux 內(nèi)核上非常棒的 provider。OL DTrace 最終的成功將取決于人們對運(yùn)行 Oracle Linux(為技術(shù)支持付費(fèi))有多大興趣,另一方面取決于它是否完全開源:它的內(nèi)核元件是開源的,而我沒有看到它的用戶級別代碼。
9. sysdig
sysdig是一個(gè)使用類tcpdump語法來操作系統(tǒng)事件的新tracer,它使用lua提交進(jìn)程。它很優(yōu)秀,它見證了系統(tǒng)跟蹤領(lǐng)域的變革。它的局限性在于它只在當(dāng)前進(jìn)行系統(tǒng)調(diào)用,在提交進(jìn)行時(shí)將所有事件轉(zhuǎn)儲(chǔ)為用戶級別。你可以使用系統(tǒng)調(diào)用做很多事情,然而我還是很希望它能支持跟蹤點(diǎn)、kprobe和uprobe。我還期待它能支持eBPF做內(nèi)核摘要。目前,sysdig開發(fā)者正在增加容器支持。留意這些內(nèi)容。
延伸閱讀
我關(guān)于 tracer 的工作包括:
ftrace:我的 perf-tools工具集(參考實(shí)例目錄);我在 lwn.net 上的 關(guān)于ftrace的文章;LISA14的發(fā)言;還有帖子:函數(shù)計(jì)數(shù), iosnoop,opensnoop,execsnoop,TCP轉(zhuǎn)發(fā), uprobes 以及USDT。
perf_evenets:我的網(wǎng)頁 perf_events實(shí)例;SCALE上的發(fā)言Netflix的Linux性能分析;還有帖子CPU采樣,靜態(tài)追蹤點(diǎn),熱點(diǎn)圖,計(jì)數(shù),內(nèi)核行追蹤,off-CPU時(shí)間圖。
eBPF:帖子eBPF:邁出一小步,和一些BPF工具(我需要發(fā)布更多)。
SystemTap:我很久以前寫了一篇有點(diǎn)過期的帖子使用SystemTap。最近,我發(fā)布了一些工具systemtap-lwtools來演示如何在沒有內(nèi)核診斷信息的情況下使用SystemTap。
LTTng:我只花了一點(diǎn)時(shí)間,還不足以發(fā)表任何內(nèi)容。
ktap:我的網(wǎng)頁ktap實(shí)例包含一些早期版本的單行小程序和腳本。
dtrace4linux:我在系統(tǒng)性能一書中給出了一些實(shí)例,并曾經(jīng)開發(fā)了一些小的修復(fù)程序,如timestamps。
OL DTrace:由于它直接由DTrace轉(zhuǎn)變而來,很多我早期關(guān)于DTrace的工作都有相關(guān)性(如果在這里給出鏈接的話就太多了,可以在我的主頁上搜索)。當(dāng)它更完善時(shí),我會(huì)開發(fā)一些特殊工具。
sysdig:我向 fileslower 和 subsecond offset spectrogram 貢獻(xiàn)了代碼。
其他:我寫了關(guān)于strace 的注意事項(xiàng)。
請不要有更多的 tracer!如果你想知道為什么 Linux 不僅僅只有一個(gè) tracer,或者只用本身的DTrace,你可以在我的演講稿從DTrace到Linux中找到答案,從28張幻燈片開始。
在linux中是不是能看到設(shè)備節(jié)點(diǎn)就說明設(shè)備可以被訪問了解決思路
Linux 中的設(shè)備有2種類型:字符設(shè)備(無緩沖且只能順序存取)、塊設(shè)備(有緩沖且磨洞桐可以隨機(jī)存取)。每個(gè)字符設(shè)備和塊設(shè)備都必須有主、次設(shè)備號,主設(shè)備號相同的設(shè)備是同類設(shè)備(使用同一個(gè)驅(qū)動(dòng)程序)。這些設(shè)備中,有些設(shè)備是對實(shí)際存在的物理硬件的抽象,而有些設(shè)備則是內(nèi)核自身提供的功能(不依賴于特定的物理硬件,又稱為”虛擬設(shè)備”)。每個(gè)設(shè)備在 /dev 目錄下都有一個(gè)對應(yīng)的文件(節(jié)點(diǎn))??梢酝ㄟ^ cat /proc/devices 命令查看當(dāng)前已經(jīng)加載的設(shè)備驅(qū)動(dòng)程序的主設(shè)備號。內(nèi)核能夠識別的所有設(shè)備都記錄在原碼樹下的 Documentation/devices.txt 文件中。在 /dev 目錄下除了字符設(shè)備和塊設(shè)備節(jié)點(diǎn)之外還通常還會(huì)存在:FIFO管道、Socket、軟/硬連接、目錄。這些東西沒有主/次設(shè)備號。
了解這些設(shè)備的最基本要求就是對 每個(gè)設(shè)備文件的含義了如指掌,下面就醫(yī)列表的形式列出常見的設(shè)備文件以及相應(yīng)的含義(比較偏僻的就省略了):
主設(shè)備號 設(shè)備類型
次設(shè)備號=文件名 簡要說明
0 未命名設(shè)備(例如:掛載的非設(shè)備)
0 = 未空設(shè)備號保留
1 char 內(nèi)存設(shè)備
1 = /dev/mem 直接存取物理瞎坦內(nèi)存
2 = /dev/kmem 存取經(jīng)過內(nèi)核虛擬之后的內(nèi)存
3 = /dev/null 空設(shè)備。任何寫入都將被直接丟棄,任何讀取都將得到EOF。
4 = /dev/port 存取 I/O 端口
5 = /dev/zero 零字節(jié)源,只能讀取到無限多的零字節(jié)。
7 = /dev/full 滿設(shè)備。任何寫入都將失敗,并把errno設(shè)為ENOSPC以表示沒有剩余空間。
8 = /dev/random 隨機(jī)數(shù)發(fā)生器。完全由用戶的輸入來產(chǎn)生隨機(jī)數(shù)。
如果用戶停止所有動(dòng)作,則停止產(chǎn)生新的隨機(jī)數(shù)。
9 = /dev/urandom 更快,但是不夠安全的隨機(jī)數(shù)發(fā)生器。盡可能由用戶的輸入來產(chǎn)生隨機(jī)數(shù),
如果用戶停止所有動(dòng)作,則把已經(jīng)產(chǎn)生的隨機(jī)數(shù)做為種子來產(chǎn)生新的隨機(jī)數(shù)。
10 = /dev/aio 異步 I/O 通知接口
11 = /dev/kmsg 任何對該文件的寫入都將作為 printk 的輸出
1 block RAM disk
0 = /dev/ram0 第1個(gè) RAM disk (initrd只能使用ram0)
1 = /dev/ram1 第2個(gè) RAM disk
…
200 = /dev/ram200 第200個(gè) RAM disk
4 char TTY(終端)設(shè)備
0 = /dev/tty0 當(dāng)前虛擬控制臺
1 = /dev/tty1 第1個(gè)虛擬控制臺
…
63 = /dev/tty63 第63個(gè)虛擬控制臺
4 block 如果根文件系統(tǒng)以是以只讀方式掛載的,那么就不可能創(chuàng)建真正的設(shè)備節(jié)顫顫點(diǎn),
此時(shí)就使用該設(shè)備作為動(dòng)態(tài)分配的主(major)設(shè)備的別名
0 = /dev/root
5 char 其他 TTY 設(shè)備
0 = /dev/tty 當(dāng)前 TTY 設(shè)備
1 = /dev/console 系統(tǒng)控制臺
2 = /dev/ptmx 所有 PTY master 的復(fù)用器
7 char 虛擬控制臺捕捉設(shè)備(這些設(shè)備既允許讀也允許寫)
0 = /dev/vcs 當(dāng)前虛擬控制臺(vc)的文本內(nèi)容
1 = /dev/vcs1 tty1 的文本內(nèi)容
…
63 = /dev/vcs63 tty63 的文本內(nèi)容
128 = /dev/vcsa 當(dāng)前虛擬控制臺(vc)的文本/屬性內(nèi)容
129 = /dev/vcsa1 tty1 的文本/屬性內(nèi)容
…
191 = /dev/vcsa63 tty63 的文本/屬性內(nèi)容
7 block 回環(huán)設(shè)備(用一個(gè)普通的磁盤文件來模擬一個(gè)塊設(shè)備)
對回環(huán)設(shè)備的綁定由 mount(8) 或 losetup(8) 處理
0 = /dev/loop0 第1個(gè)回環(huán)設(shè)備
1 = /dev/loop1 第2個(gè)回環(huán)設(shè)備
…
8 block SCSI 磁盤(0-15)
0 = /dev/sda 第1個(gè) SCSI 磁盤(整個(gè)磁盤)
16 = /dev/sdb 第2個(gè) SCSI 磁盤(整個(gè)磁盤)
32 = /dev/sdc 第3個(gè) SCSI 磁盤(整個(gè)磁盤)
…
240 = /dev/sdp 第16個(gè) SCSI 磁盤(整個(gè)磁盤)
分區(qū)表示方法如下(以第3個(gè) SCSI 磁盤為例)
33 = /dev/sdc1 第1個(gè)分區(qū)
34 = /dev/sdc2 第2個(gè)分區(qū)
…
47 = /dev/sdc15 第15個(gè)分區(qū)
對于Linux/i386來說,分區(qū)1-4是主分區(qū),5-15是邏輯分區(qū)。
9 block Metadisk(RAID)設(shè)備
0 = /dev/md0 第1組 metadisk
1 = /dev/md1 第2組 metadisk
…
metadisk 驅(qū)動(dòng)用于將同一個(gè)文件系統(tǒng)分割到多個(gè)物理磁盤上。
10 char 非串口鼠標(biāo),各種雜項(xiàng)設(shè)備和特性
1 = /dev/psaux PS/2鼠標(biāo)
131 = /dev/temperature 機(jī)器內(nèi)部溫度
134 = /dev/apm_bios APM(高級電源管理) BIOS
135 = /dev/rtc 實(shí)時(shí)時(shí)鐘(Real Time Clock)
144 = /dev/nvram 非易失配置 RAM
162 = /dev/bus 系統(tǒng)管理總線(System Management Bus)
164 = /dev/ipmo Intel的智能平臺管理(Intelligent Platform Management)接口
173 = /dev/ipmikcs 智能平臺管理(Intelligent Platform Management)接口
175 = /dev/agpgart AGP圖形地址重映射表(Graphics Address Remapping Table)
182 = /dev/perfctr 性能監(jiān)視計(jì)數(shù)器
183 = /dev/hwrng 通用硬件隨機(jī)數(shù)發(fā)生器
184 = /dev/cpu/microcode CPU微代碼更新接口
186 = /dev/atomicps 進(jìn)程狀態(tài)數(shù)據(jù)的原子快照
188 = /dev/buios Bus(系統(tǒng)管理總線) BIOS
200 = /dev/net/tun TAP/TUN 網(wǎng)絡(luò)設(shè)備(TAP/TUN以軟件的方式實(shí)現(xiàn)了網(wǎng)絡(luò)設(shè)備)
TAP模擬了以太網(wǎng)幀(第二層),TUN模擬了IP包(第三層)。
202 = /dev/emd/ctl 增強(qiáng)型 Metadisk RAID (EMD) 控制器
220 = /dev/mptctl Message passing technology (MPT) control
223 = /dev/input/uinput 用戶層輸入設(shè)備驅(qū)動(dòng)支持
227 = /dev/mcelog X86_64 Machine Check Exception driver
228 = /dev/hpet HPET driver
229 = /dev/fuse Fuse(用戶空間的虛擬文件系統(tǒng))
231 = /dev/snapshot 系統(tǒng)內(nèi)存快照
232 = /dev/kvm 基于內(nèi)核的虛構(gòu)機(jī)(基于AMD SVM和Intel VT硬件虛擬技術(shù))
11 block SCSI CD-ROM 設(shè)備
0 = /dev/scd0 第1個(gè) SCSI CD-ROM
1 = /dev/scd1 第2個(gè) SCSI CD-ROM
…
13 char 核心輸入設(shè)備
32 = /dev/input/mouse0 第1個(gè)鼠標(biāo)
33 = /dev/input/mouse1 第2個(gè)鼠標(biāo)
…
62 = /dev/input/mouse30 第31個(gè)鼠標(biāo)
63 = /dev/input/mice 所有鼠標(biāo)的統(tǒng)一
64 = /dev/input/event0 第1個(gè)事件隊(duì)列
65 = /dev/input/event1 第2個(gè)事件隊(duì)列
…
95 = /dev/input/event1 第32個(gè)事件隊(duì)列
21 char 通用 SCSI 設(shè)備(通常是SCSI光驅(qū))
0 = /dev/sg0 第1個(gè)通用 SCSI 設(shè)備
1 = /dev/sg1 第2個(gè)通用 SCSI 設(shè)備
…
29 char 通用幀緩沖(frame buffer)設(shè)備
0 = /dev/fb0 第1個(gè)幀緩沖設(shè)備
1 = /dev/fb1 第2個(gè)幀緩沖設(shè)備
…
31 = /dev/fb31 第32個(gè)幀緩沖設(shè)備
30 char iBCS-2 兼容設(shè)備
0 = /dev/socksys 套接字訪問接口
1 = /dev/spx SVR3 本地 X 接口
32 = /dev/inet/ip 網(wǎng)絡(luò)訪問接口
33 = /dev/inet/icmp
34 = /dev/inet/ggp
35 = /dev/inet/ipip
36 = /dev/inet/tcp
37 = /dev/inet/egp
38 = /dev/inet/pup
39 = /dev/inet/udp
40 = /dev/inet/idp
41 = /dev/inet/rawip
此外,iBCS-2 還需要下面的連接必須存在
/dev/ip -> /dev/inet/ip
/dev/icmp -> /dev/inet/icmp
/dev/ggp -> /dev/inet/ggp
/dev/ipip -> /dev/inet/ipip
/dev/tcp -> /dev/inet/tcp
/dev/egp -> /dev/inet/egp
/dev/pup -> /dev/inet/pup
/dev/udp -> /dev/inet/udp
/dev/idp -> /dev/inet/idp
/dev/rawip -> /dev/inet/rawip
/dev/inet/arp -> /dev/inet/udp
/dev/inet/rip -> /dev/inet/udp
/dev/nfsd -> /dev/socksys
/dev/X0R -> /dev/null
36 char Netlink 支持
0 = /dev/route 路由, 設(shè)備更新, kernel to user
3 = /dev/fwmonitor Firewall packet 復(fù)制
59 char sf 防火墻模塊
0 = /dev/firewall 與 sf 內(nèi)核模塊通信
65 block SCSI 磁盤(16-31)
0 = /dev/sdq 第17個(gè) SCSI 磁盤(整個(gè)磁盤)
16 = /dev/sdr 第18個(gè) SCSI 磁盤(整個(gè)磁盤)
32 = /dev/sds 第19個(gè) SCSI 磁盤(整個(gè)磁盤)
…
240 = /dev/sdaf 第32個(gè) SCSI 磁盤(整個(gè)磁盤)
66 block SCSI 磁盤(32-47)
0 = /dev/sdag 第33個(gè) SCSI 磁盤(整個(gè)磁盤)
16 = /dev/sdah 第34個(gè) SCSI 磁盤(整個(gè)磁盤)
32 = /dev/sdai 第35個(gè) SCSI 磁盤(整個(gè)磁盤)
…
240 = /dev/sdav 第48個(gè) SCSI 磁盤(整個(gè)磁盤)
89 char I2C 總線接口
0 = /dev/i2c-0 第1個(gè) I2C 適配器
1 = /dev/i2c-1 第2個(gè) I2C 適配器
…
98 block 用戶模式下的虛擬塊設(shè)備(分區(qū)處理方式與 SCSI 磁盤相同)
0 = /dev/ubda 第1個(gè)用戶模式塊設(shè)備
16 = /dev/udbb 第2個(gè)用戶模式塊設(shè)備
…
103 block 審計(jì)(Audit)設(shè)備
0 = /dev/audit 審計(jì)(Audit)設(shè)備
char Unix98 PTY master
這些設(shè)備不應(yīng)當(dāng)存在設(shè)備節(jié)點(diǎn),而應(yīng)當(dāng)通過 /dev/ptmx 接口訪問。
char Unix98 PTY slave
這些設(shè)備節(jié)點(diǎn)是自動(dòng)生成的(伴有適當(dāng)?shù)臋?quán)限和模式),不能手動(dòng)創(chuàng)建。
方法是通過使用適當(dāng)?shù)?mount 選項(xiàng)(通常是:mode=0620,gid=)
將 devpts 文件系統(tǒng)掛載到 /dev/pts 目錄即可。
0 = /dev/pts/0 第1個(gè) Unix98 PTY slave
1 = /dev/pts/1 第2個(gè) Unix98 PTY slave
…
153 block Enhanced Metadisk RAID (EMD) 存儲(chǔ)單元(分區(qū)處理方式與 SCSI 磁盤相同)
0 = /dev/emd/0 第1個(gè)存儲(chǔ)單元
1 = /dev/emd/0p1 第1個(gè)存儲(chǔ)單元的第1個(gè)分區(qū)
2 = /dev/emd/0p2 第1個(gè)存儲(chǔ)單元的第2個(gè)分區(qū)
…
15 = /dev/emd/0p15 第1個(gè)存儲(chǔ)單元的第15個(gè)分區(qū)
16 = /dev/emd/1 第2個(gè)存儲(chǔ)單元
32 = /dev/emd/2 第3個(gè)存儲(chǔ)單元
…
240 = /dev/emd/15 第16個(gè)存儲(chǔ)單元
180 char USB 字符設(shè)備
96 = /dev/u/hiddev0 第1個(gè)USB人機(jī)界面設(shè)備(鼠標(biāo)/鍵盤/游戲桿/手寫版等人操作計(jì)算機(jī)的設(shè)備)
…
111 = /dev/u/hiddev15 第16個(gè)USB人機(jī)界面設(shè)備
180 block USB 塊設(shè)備(U盤之類)
0 = /dev/uba 第1個(gè)USB 塊設(shè)備
8 = /dev/ubb 第2個(gè)USB 塊設(shè)備
16 = /dev/ubc 第3個(gè)USB 塊設(shè)備
…
192 char 內(nèi)核 profiling 接口
0 = /dev/profile Profiling 控制設(shè)備
1 = /dev/profile0 CPU 0 的 Profiling 設(shè)備
2 = /dev/profile1 CPU 1 的 Profiling 設(shè)備
…
193 char 內(nèi)核事件跟蹤接口
0 = /dev/trace 跟蹤控制設(shè)備
1 = /dev/trace0 CPU 0 的跟蹤設(shè)備
2 = /dev/trace1 CPU 1 的跟蹤設(shè)備
…
195 char Nvidia 圖形設(shè)備(比如顯卡)
0 = /dev/nvidia0 第1個(gè) Nvidia 卡
1 = /dev/nvidia1 第2個(gè) Nvidia 卡
…
255 = /dev/nvidiactl Nvidia 卡控制設(shè)備
202 char 特定于CPU模式的寄存器(model-specific register,MSR)
0 = /dev/cpu/0/msr CPU 0 的 MSRs
1 = /dev/cpu/1/msr CPU 1 的 MSRs
…
203 char CPU CPUID 信息
0 = /dev/cpu/0/cpuid CPU 0 的 CPUID
1 = /dev/cpu/1/cpuid CPU 1 的 CPUID
…
===================================================================
這部分詳細(xì)說明一些應(yīng)該或可能存在于 /dev 目錄之外的文件。
鏈接更好使用與這里完全相同的格式(絕對路徑或相對路徑)。
究竟是使用硬鏈接(hard)還是軟連接(symbolic)取決于不同的設(shè)備。
必須的鏈接
必須在所有的系統(tǒng)上都存在這些連接:
鏈接 目標(biāo) 鏈接類型 簡要說明
/dev/fd /proc/self/fd symbolic 文件描述府
/dev/stdin fd/0 symbolic 標(biāo)準(zhǔn)輸入文件描述府
/dev/stdout fd/1 symbolic 標(biāo)準(zhǔn)輸出文件描述符
/dev/stderr fd/2 symbolic 標(biāo)準(zhǔn)錯(cuò)誤文件描述符
/dev/nfsd socksys symbolic 僅為 iBCS-2 所必須
/dev/X0R null symbolic 僅為 iBCS-2 所必須
/dev/X0R 是 —
推薦的鏈接
推薦在所有的系統(tǒng)上都存在這些連接:
鏈接 目標(biāo) 鏈接類型 簡要說明
/dev/core /proc/kcore symbolic 為了向后兼容
/dev/ramdisk ram0 symbolic 為了向后兼容
/dev/ftape qft0 symbolic 為了向后兼容
/dev/bttv0 video0 symbolic 為了向后兼容
/dev/radio radio0 symbolic 為了向后兼容
/dev/i2o* /dev/i2o/* symbolic 為了向后兼容
/dev/scd? sr? hard 代替 SCSI CD-ROM 的名字
本地定義的鏈接
下面的鏈接很可能需要根據(jù)機(jī)器的實(shí)際硬件配置創(chuàng)建其中的一部分甚至全部。
這些鏈接僅僅是為了迎合習(xí)慣用法,它們既非必須也非推薦。
鏈接 目標(biāo) 鏈接類型 簡要說明
/dev/mouse mouse port symbolic 當(dāng)前鼠標(biāo)
/dev/tape tape device symbolic 當(dāng)前磁帶
/dev/cdrom CD-ROM device symbolic 當(dāng)前CD-ROM
/dev/cdwriter CD-writer symbolic 當(dāng)前CD-writer
/dev/scanner scanner symbolic 當(dāng)前掃描儀
/dev/modem modem port symbolic 當(dāng)前調(diào)制解調(diào)器
/dev/root root device symbolic 當(dāng)前根文件系統(tǒng)所在設(shè)備
/dev/swap swap device symbolic 當(dāng)前swap所在設(shè)備
/dev/modem 不應(yīng)當(dāng)用于能夠同時(shí)支持呼入和呼出的modem,因?yàn)橥鶗?huì)導(dǎo)致鎖文件問題。
如果存在 /dev/modem ,那么它應(yīng)當(dāng)指向一個(gè)恰當(dāng)?shù)闹?TTY 設(shè)備。
對于SCSI設(shè)備,
/dev/tape 和 /dev/cdrom 應(yīng)該分別指向”cooked”設(shè)備 /dev/st* 和 /dev/sr* ;
而 /dev/cdwriter 和 /dev/scanner 應(yīng)當(dāng)分別指向恰當(dāng)?shù)?/dev/sg* 。
/dev/mouse 可以指向一個(gè)主串行 TTY 設(shè)備、一個(gè)硬件鼠標(biāo)、
或者一個(gè)對應(yīng)鼠標(biāo)驅(qū)動(dòng)程序的套接字(例如 /dev/gpmdata)。
套接字和管道
持久套接字和命名管道可以存在于 /dev 中。常見的有:
/dev/printer socket lpd 本地套接字
/dev/log socket syslog 本地套接字
/dev/gpmdata socket gpm 鼠標(biāo)多路復(fù)用器(multiplexer)
/dev/gpmctl socket (LFS-LiveCD中出現(xiàn))
/dev/initctl fifo pipe init 監(jiān)聽它并從中獲取信息(用戶與 init 進(jìn)程交互的通道)
掛載點(diǎn)
以下名稱被保留用于掛載特殊的文件系統(tǒng)。
這些特殊的文件系統(tǒng)只提供內(nèi)核界面而不提供標(biāo)準(zhǔn)的設(shè)備節(jié)點(diǎn)。
/dev/pts devpts PTY slave 文件系統(tǒng)
/dev/shm tmpfs 提供對 POSIX 共享內(nèi)存的直接訪問
===================================================================
終端(或TTY)設(shè)備是一種特殊的字符設(shè)備。終端設(shè)備是可以在會(huì)話中扮演控制終端角色的任何設(shè)備,
包括:虛擬控制臺、串行接口(已廢棄)、偽終端(PTY)。
所有的終端設(shè)備共享一個(gè)通用的功能:line discipline,
它既包含通用的終端 line discipline 也包含SLIP和PPP模式。
所有的終端設(shè)備的命名都很相似。這部分內(nèi)容將解釋命名規(guī)則和各種類型的TTY(終端)的使用。
需要注意的是這些命名習(xí)慣包含了幾個(gè)歷史遺留包袱。
其中的一些是Linux所特有的,另一些則是繼承自其他系統(tǒng),
還有一些反映了Linux在成長過程中拋棄了原來借用自其它系統(tǒng)的一些習(xí)慣。
井號(#)在設(shè)備名里表示一個(gè)無前導(dǎo)零的十進(jìn)制數(shù)。
虛擬控制臺(Virtual console)和控制臺設(shè)備(console device)
虛擬控制臺是在系統(tǒng)視頻監(jiān)視器上全屏顯示的終端。
虛擬控制臺被命名為編號從 /dev/tty1 開始的 /dev/tty# 。
/dev/tty0 是當(dāng)前虛擬控制臺。
/dev/tty0 用于在不能使用幀緩沖設(shè)備(/dev/fb*)的機(jī)器上存取系統(tǒng)視頻卡,
注意,不要將 /dev/console 用于此目的。
/dev/console 由內(nèi)核管理,系統(tǒng)消息將被發(fā)送到這里。
單用戶模式下必須允許 login 使用 /dev/console 。
串行接口(已廢棄)
這里所說的”串行接口”是指 RS-232 串行接口和任何模擬這種接口的設(shè)備,
不管是在硬件(例如調(diào)制解調(diào)器)還是在軟件(例如ISDN驅(qū)動(dòng))中模擬。
在linux中的每一個(gè)串行接口都有兩個(gè)設(shè)備名:
主設(shè)備或呼入(callin)設(shè)備、交替設(shè)備或呼出(callout)設(shè)備。
設(shè)備類型之間使用字母的大小寫進(jìn)行區(qū)分。
比如,對于任意字母X,”tty”設(shè)備名為 /dev/ttyX# ,而”cu”設(shè)備名則為 /dev/cux# 。
由于歷史原因,/dev/ttyS# 和 /dev/ttyC# 分別等價(jià)于 /dev/cua# 和 /dev/cub# 。
名稱 /dev/ttyQ# 和 /dev/cuq# 被保留為本地使用。
偽終端(PTY)
偽終端用于創(chuàng)建登陸會(huì)話或提供其它功能,
比如通過 TTY line discipline (包括SLIP或者PPP功能)來處理任意的數(shù)據(jù)生成。
每一個(gè) PTY 都有一個(gè)master端和一個(gè)slave端。按照 System V/Unix98 的 PTY 命名方案,
所有master端共享同一個(gè) /dev/ptmx 設(shè)備節(jié)點(diǎn)(打開它內(nèi)核將自動(dòng)給出一個(gè)未分配的PTY),
所有slave端都位于 /dev/pts 目錄下,名為 /dev/pts/# (內(nèi)核會(huì)根據(jù)需要自動(dòng)生成和刪除它們)。
一旦master端被打開,相應(yīng)的slave設(shè)備就可以按照與 TTY 設(shè)備完全相同的方式使用。
master設(shè)備與slave設(shè)備之間通過內(nèi)核進(jìn)行連接,等價(jià)于擁有 TTY 功能的雙向管道(pipe)。
===============================
你可能會(huì)很奇怪,為什么沒有 /dev/hda 這樣的設(shè)備,難道不常用么?
linux tap設(shè)備 診斷的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux tap設(shè)備 診斷,Linux Tap設(shè)備診斷:快速確定問題原因,如何選擇一個(gè) Linux Tracer,在linux中是不是能看到設(shè)備節(jié)點(diǎn)就說明設(shè)備可以被訪問了解決思路的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)服務(wù)器托管擁有成都T3+級標(biāo)準(zhǔn)機(jī)房資源,具備完善的安防設(shè)施、三線及BGP網(wǎng)絡(luò)接入帶寬達(dá)10T,機(jī)柜接入千兆交換機(jī),能夠有效保證服務(wù)器托管業(yè)務(wù)安全、可靠、穩(wěn)定、高效運(yùn)行;創(chuàng)新互聯(lián)專注于成都服務(wù)器托管租用十余年,得到成都等地區(qū)行業(yè)客戶的一致認(rèn)可。
本文名稱:LinuxTap設(shè)備診斷:快速確定問題原因(linuxtap設(shè)備診斷)
文章位置:http://m.fisionsoft.com.cn/article/cccdcod.html


咨詢
建站咨詢
