Ubuntu

systemtap 未在 Ubuntu 12 上正確初始化(精確)

  • August 15, 2014

我在一家擁有一定數量遺留批處理的公司工作。

當涉及到數據庫連接時,其中一些東西真的很容易洩漏。

  • 我需要記錄系統中的每個程序,這會打開一個數據庫連接。

strace 不是一個選項,程序太多,它們的壽命太短,我需要審核多個框。

IPtables 不是一個選項,您可以匹配程序路徑/使用者,但您無法記錄該資訊(據我所知)

lsof/netstat 等常用工具僅包含有關處於活動狀態的程序以及它們正在使用的連接的資訊。

另一方面,這些批處理作業已經死了 - 所以我無法將程序與套接字關聯起來。

因此,這是學習 systemtap 的最佳時機。或者編寫一個自定義核心模組。但是我沒有開始侵入系統呼叫表的專業知識/時間,此外,我想學習 systemtap,因為它似乎是非常有用的工具。

我的最終目標是編寫一個探針——

  • 列印出盡可能多的資訊,關於本地連接到 MySQL 的每個程序。

但魔鬼在細節中..我無法將它安裝在 Debian (wheezy) 上(根本),而且我在 Ubuntu 12 (Precise) 上遇到了奇怪的錯誤。

在 Ubuntu 上,一個基本的 systemtap 探針可以正常工作(這些是基本的複制和粘貼範例)。

#! /usr/bin/env stap
probe begin { println("hello world") exit () }

它產生預期的輸出。

sudo stap -v stapinit.stp
Pass 1: parsed user script and 76 library script(s) using 22792virt/13512res/2224shr kb, in 90usr/0sys/93real ms.
Pass 2: analyzed script: 1 probe(s), 1 function(s), 0 embed(s), 0 global(s) using 23056virt/14000res/2304shr kb, in 10usr/0sys/2real ms.
Pass 3: translated to C into "/tmp/stap2ntfcM/stap_32acf6b6a3f643d9444c9c8339e390d8_687.c" using 23056virt/14332res/2584shr kb, in 0usr/0sys/0real ms.
Pass 4: compiled C into "stap_32acf6b6a3f643d9444c9c8339e390d8_687.ko" in 1290usr/390sys/1902real ms.
Pass 5: starting run.
hello world
Pass 5: run completed in 10usr/40sys/596real ms.

但是更複雜的探針會死掉,例如:

# Show sockets setting options

# Return enabled or disabled based on value of optval
function getstatus(optval)
{
   if ( optval == 1 )
       return "enabling"
   else
       return "disabling"
}

probe begin
{
       print ("\nChecking for apps setting socket options\n")
}

# Set a socket option
probe tcp.setsockopt
{
   status = getstatus(user_int($optval))
       printf ("  App '%s' (PID %d) is %s socket option %s... ", execname(), pid(), status, optstr)
}

# Check setting the socket option worked
probe tcp.setsockopt.return
{
   if ( ret == 0 )
       printf ("success")
   else
       printf ("failed")
   printf ("\n")
}

probe end
{
       print ("\nClosing down\n")
}

生產——

Pass 1: parsed user script and 76 library script(s) using 22812virt/13660res/2224shr kb, in 90usr/10sys/120real ms.
semantic error: missing i386 kernel/module debuginfo under '/lib/modules/3.2.0-27-generic-pae/build' while resolving probe point kernel.function("tcp_setsockopt")
semantic error: no match while resolving probe point tcp.setsockopt
semantic error: missing i386 kernel/module debuginfo under '/lib/modules/3.2.0-27-generic-pae/build' while resolving probe point kernel.function("tcp_setsockopt").return
semantic error: no match while resolving probe point tcp.setsockopt.return
Pass 2: analyzed script: 2 probe(s), 1 function(s), 0 embed(s), 0 global(s) using 23136virt/14424res/2540shr kb, in 70usr/580sys/1255real ms.
Pass 2: analysis failed.  Try again with another '--vp 01' option.

似乎我缺少一個依賴項,但我幾乎安裝了廚房水槽。

sudo apt-get install elfutils
sudo apt-get install linux-headers-generic gcc libcap-dev
sudo apt-get install systemtap-sdt-dev
sudo apt-get install systemtap systemtap-doc linux-image linux-headers-generic-pae
  • 更新 1

apt-get install systemtap 建議的軟體包可能有些誤導。

linux-headers-virtual 、 linux-image 、 linux-source 和 linux-tools 是虛擬包,因此將跟踪目前升級到的任何核心。

sudo apt-get install linux-headers-virtual linux-image linux-source linux-tools 

為了更好地衡量,我還安裝了 fdutils 和 kernel-package

sudo apt-get install fdutils kernel-package

將嘗試這個並報告回來。

  • 更新 2

仍然壞了,同樣的錯誤,這實際上是我嘗試安裝它的第三個系統。

我還發現了以下 Ubuntu 錯誤,可能是包壞了?

https://bugs.launchpad.net/ubuntu/+source/systemtap/+bug/824105

  • 更新 3

Ubuntu 上的問題似乎是他們沒有建構核心調試符號包,或者至少以標準方式分發它。我的結論是 systemtap 包在 Ubuntu 上被破壞了,因為它沒有安裝關鍵的依賴項。

https://bugs.launchpad.net/ubuntu/+source/systemtap/+bug/106957

在我的 Debian 機器上,我有一個不同的問題,啟用了測試 - 因此 gcc 已升級到 4.6,而 linux-headers 包需要 gcc 4.3

root@datasift:~# apt-get install systemtap linux-image-`uname -r`-dbg linux-headers-`uname -r`
Reading package lists... Done
Building dependency tree       
Reading state information... Done
systemtap is already the newest version.
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 linux-headers-2.6.32-5-amd64 : Depends: gcc-4.3 but it is not going to be installed
E: Broken packages
root@datasift:~# uname -a
Linux datasift.sentimentmetrics.com 2.6.32-5-amd64 #1 SMP Sun May 6 04:00:17 UTC 2012 x86_64 GNU/Linux
  • 結論

所以,總而言之 - systemtap 可能在 Debian 上工作正常,在 Ubuntu 上工作的可能性很小,而且我沒有時間繼續。我希望我執行的是 BSD/Solaris 或帶有標準儀器介面的東西,但不管你喜不喜歡,Linux 都是商品之神。

更新 4

同時,受以下文章的啟發,我設法使用了 Linux 審計框架:

我如何確定哪個程序在 linux 上進行 UDP 流量?

我的審計命令:

auditctl -a exit,always -F arch=b64 -F a0=2 -S socket

生成以下格式的日誌消息:

 type=SYSCALL msg=audit(1344346149.672:1670): arch=c000003e syscall=41 success=yes exit=5 a0=2 a1=1 a2=6 a3=1999999999999999 items=0 ppid=1 pid=29674 auid=0 uid=1003 gid=1003 euid=1003 suid=1003 fsuid=1003 egid=1003 sgid=1003 fsgid=1003 tty=(none) ses=124 comm="php5" exe="/usr/bin/php5" key=(null)

這很好,但最終沒用,因為它們不包含程序參數。

我真正需要的(至少)是可以捕捉論點的東西,例如:

exe="/usr/bin/php5" args="/Administraitor/learn-to-code-hehe.php"   

理想情況下,我也希望能夠按主機和埠進行過濾。

我已經設法讓它在 Ubuntu 上執行,Debian 是另一回事。

我已經使用安裝/監控腳本創建了儲存庫

https://bitbucket.org/sentimental/poc_stap

這些腳本還提供程序參數,因此對於一個頑皮的 PHP 腳本,現在可以辨識出不法分子。

與其說是一個答案,不如說是一個警告:SystemTap 可能會令人困惑,有時甚至只是簡單的錯誤,有時甚至是不直覺的。儘管如此,它仍然是一個很好的工具,只需小心使用它並與其他工具交叉檢查您的結果。

Brendan Gregg 的這篇部落格文章對 SystemTap 的怪異世界進行了非常深入的分析。當然,由於部落格作者通常使用dtrace,他的觀點可能會有偏見。不管怎樣,這篇文章寫得非常好,讓我再次想到了 SystemTap 的可靠性。該部落格文章還包含一些程式碼範例,可以幫助您解決問題。

這是部落格文章的引述:

在使用 SystemTap 時,我一直在記錄我一直在做的事情,包括哪些有效,哪些無效,以及我是如何解決問題的。它被證明是一個方便的參考。

在最近一些關於 DTrace 的文章中,人們詢問它與 SystemTap 的比較——有些人評論說他們也沒有時間研究。我被鼓勵發布我的經歷,這很容易從我的筆記中做到。我也可以(並且可能應該)將其中的一些放入 SystemTap 錯誤數據庫中。

我分享的是使用 SystemTap 的各種經驗,包括我因為不知道自己在做什麼而犯錯誤的時候。我將從一個關於跟踪磁碟 I/O 的敘述開始,它將各種經驗聯繫在一起。之後它變得有點不連續,從各種音符中剪下來。我會盡量保持這種技術性、積極性和建設性。也許這將有助於 SystemTap 項目本身,以了解使用者(具有強大的動態跟踪和核心工程背景)正在努力解決什麼問題。

引用自:https://serverfault.com/questions/414943