鳥哥的 Linux 私房菜

特殊問題解決彙整

最近更新日期:2017/03/06

很多時候,我們玩 Linux 會遇到很多軟體或者是硬體的問題,尤其是硬體的問題最奇怪了!因為擔心未來鳥哥自己還會遇到相同的狀況, 所以,將自身遇到的狀況給他寫下來~希望大家如果有遇到相同的問題時,可以很快速的解決呦!

關於加密 shell script 的方式 (2017/03/06)

最近在寫一些 Linux 作業系統基礎訓練的腳本,這些腳本有製作環境的、設定環境的、傳輸結果的、分析學生執行結果的等等部份。 以前都直接提供明碼給學生,曾經有學生會分析腳本,直接做出對的答案...雖然這樣的結果是,訓練到這個厲害的學生。但是, 其他學生可能就會直接跟這個厲害的同學要求破解的方法,直接取得正確的結果,而沒有實做....那就煩惱了!

在使用 google 查詢了一下 shell script encryption 的結果,發現到底下的兩個超連結:

主要的思考方式很簡單,就是將 shell script 透過相對應的轉換,將腳本變成可以直接執行的 binary program 這樣!鳥哥下載的是 shc-3.8.9b.tgz 這個版本! 然後開始安裝的動作!

[root@study ~]# yum install gcc glibc-static
[root@study ~]# tar -zxvf shc-3.8.9b.tgz
[root@study ~]# cd shc-3.8.9b
[root@study shc-3.8.9b]# make
[root@study shc-3.8.9b]# ll shc
-rwxr-xr-x. 1 root root 36057 2017-03-06 10:08 shc

[root@study shc-3.8.9b]# echo -e '#!/bin/bash\necho "This is a testing"' > zzz.sh
[root@study shc-3.8.9b]# cat zzz.sh
#!/bin/bash
echo "This is a testing"

[root@study shc-3.8.9b]# file zzz.sh
zzz.sh: Bourne-Again shell script text executable

[root@study shc-3.8.9b]# CFLAGS="-static " ./shc -v -r -f zzz.sh
shc shll=bash
shc [-i]=-c
shc [-x]=exec '%s' "$@"
shc [-l]=
shc opts=
shc: cc -static  zzz.sh.x.c -o zzz.sh.x
shc: strip zzz.sh.x
shc: chmod go-r zzz.sh.x

[root@study shc-3.8.9b]# ll zzz*
-rw-r--r--. 1 root root     37 2017-03-06 10:12 zzz.sh
-rwx--x--x. 1 root root 726584 2017-03-06 10:13 zzz.sh.x  <==注意這個!
-rw-r--r--. 1 root root   9396 2017-03-06 10:13 zzz.sh.x.c

[root@study shc-3.8.9b]# ./zzz.sh.x
This is a testing

[root@study shc-3.8.9b]# file zzz*
zzz.sh:     Bourne-Again shell script text executable
zzz.sh.x:   ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, 
            for GNU/Linux 2.6.18, stripped
zzz.sh.x.c: ASCII C program text

你就會取得一個 zzz.sh.x 的執行檔~最後將這個執行檔更名為 zzz ,並將 zzz 放置到 /bin 或 /sbin 底下,嘿嘿!就能夠被執行而不被查詢到程式碼! 之後鳥哥就可以輕鬆的放一些偵測腳本,而不被學生直接分析,導致被攻破囉!


關於 DRBL 還原之後,Linux 核心出錯的問題!(2017/03/06)

鳥哥所服務的單位是在崑山科大資傳系,系上的學生相當貼心,每個學期都會主動的協助鳥哥進行全系電腦的復原!我們的 PC 系統上面都會安裝多重作業系統, 提供多個不同的作業系統,以利各種教學所需要的特別環境。使用的復原系統為 DRBL 以及 Clonzilla !

最近學生反應,五間教室裡面,有兩間復原 Linux 沒問題,有三間復原就出事!鳥哥覺得很納悶~去瞧了瞧,發現到:

  • 開機可以順利出現 grub 的選單
  • 按下選單後,可以順利的載入核心進行開機,但是等待大約 3 分鐘左右,會出現 WARNING, dracut error 等字樣
  • 之後系統丟一個 dracut 的 shell 畫面提供登入與處理

因為最終出現 dracut ,而最新的 CentOS 使用的 initramfs 確實是在安裝核心時才開始打包,並非一開始就直接提供的! 所以直覺上,鳥哥覺得應該是 initramfs 出錯了!所以解決的方案是這樣的:

  1. 使用原版 CentOS 7 的 USB 開機磁碟開機,選擇『 Rescue 』選項,並進入救援模式中
  2. 系統會主動抓到 CentOS 的已安裝系統,並且加掛在 /mnt/sysimage 當中!
  3. 使用 chroot /mnt/sysimage 來切換主系統,取得一個 root 的 shell 環境中。
  4. 進入 /boot ,將有問題的 initramfs 更名
  5. 透過『 dracut -v /boot/initramfs...(原本檔名) $(uname -r) 』其中 uname -r 是因為這個系統為全新的系統,並沒有更新過! 如果你需要不同核心,就得要查詢一下 /lib/modules 的核心版本才行。
  6. 下達 restorecon -Rv /boot 稍微處理一下 SELinux 可能會有的錯誤!
  7. 重新開機測試新的 initramfs 的結果!

鳥哥比較偷懶,不想要更改檔名,所以所建立的 initramfs 使用的是原本的檔名,這樣就不用修改 /boot/grub2/grub.cfg 檔案! 重新開機後就正常了! ^_^


關於 DNS 查詢的問題解析!(專題伺服器組所導致的問題)(2017/03/06)

三月初剛剛放假回到系上,立刻接到訊息,說我們系上管理的一個 IP 一直對學校的 DNS 主機進行攻擊!查了一下該 IP 的所在, 原來是系上提供給所有大三、大四進行專題實務的 Linux 伺服器組!一開始鳥哥以為是整個系統被攻破了!非常緊張! 來到實體電腦實際使用 tcpdump 去抓封包,確實會對外查詢學校的 DNS 系統!我是這樣查詢的:

  1. 使用 tcpdump -i eth0 -nn ,這個 eth0 假設是對外的網卡。從分析當中,確實發現到有本機對學校的 DNS IP 發起 port 53 的查詢要求!
  2. 因為這個 IP 是 NAT 的功能,還有內部的四部實體主機 (主要提供學生虛擬化機器的 host) 是透過這個 IP 連外的!因此,鳥哥開始使用 tcpdump -i eth1 -nn, 這個 eth1 假設是內部連線的網卡。然後發現到 4 部內部主機有 3 部確實對 DNS IP 發起連線需求。
  3. 嘗試登入內部主機中,那有問題的 3 部中的其中一部,發現到『登入非常的慢,大約要等 30 ~ 60 秒,但是登入後就一切順暢!』
  4. 之後在該內部主機使用『 netstat -antup 』查詢一下連線資料,卻發現到『有從 NAT 主機來的連線,然後這條連線會發起 DNS IP 解析的需求』。 問了一下管理該系統的研究生,他說為了碩士論文的研究,確實有在 NAT 主控系統上面對內部四部主機進行資料收集, 但是該資料收集的腳本僅是針對主機內的資源 (如 CPU 使用率、磁碟使用率、記憶體使用狀況等等),完全沒有發起網路的功能! 鳥哥查看一下 shell script,確實如此!完全沒有動到網路喔!
  5. 有一部主機是正常的,鳥哥比對一下兩部主機之間的差異,竟然發現到 /etc/resolv.conf 內容不一致!原本這套系統預設的 DNS 設定為內部的私有 IP, 但是後來系統改版 (從 CentOS 6 升級到 CentOS 7),可能安裝的時候沒有注意到,因此內部主機的 DNS 設定直接指向學校的 DNS server 去了。
  6. 最後將 DNS 設定改為我們自己的內部 IP 就直接 OK 了!

讀者可能會問,那奇怪了!為啥之前都沒問題,現在才發生問題呢?這是因為這樣的情況:

  1. 前幾個禮拜 meeting 後,對研究生下答要去收集虛擬機器所在的主機的資源統計,所以這個腳本是最近才放上去的;
  2. 這個腳本是由 NAT 主控系統直接發派給四部內部提供虛擬化服務的主機,主要是透過 ssh 的方式來達成腳本傳遞的任務
  3. 內部主機使用預設的 ssh 設定,因此連線時,會反查連線者的 IP 反查
  4. 整套系統原本設有內部 DNS 私有 IP 的 domain 設定,但因為系統重灌,結果沒有指向正確的 private IP,又沒有更新 /etc/hosts, 所以每次傳遞 shell script (每 5 秒傳一次),就會產生 DNS 的查詢要求!
  5. 二月底全校停電,復電後計中的 DNS 系統據說被 DDoS 了!計中人員查詢連線者 IP,發現到我們這個 IP 很頻繁的對 DNS 主機發出查詢要求, 但是卻都查詢失敗 (因為是 private IP 啊!),所以誤判為我們的系統對人家攻擊了!

為了避免產生問題,所以鳥哥這樣處理過後,應該就不會有其他狀況的發生!

  • 將內部主機的 /etc/resolv.conf 設定,指向內部的 DNS server
  • 將內部的 private IP 通通寫入 /etc/hosts ,提供內部查詢 (與前一步驟雙管齊下)
  • 將 sshd_config 加入『 UseDNS no 』的設定,讓連線時不會反查 IP 來源了

bnx2x 網路卡經常反覆斷線的問題 (2017/02/17)

近年來因為雲端的關係,鳥哥跟夥伴們買了不少的 10G 網卡以及 10G 少數 port 的 switch 來在雲伺服器內部加速。 不過,經常會看到 log 裡面出現這樣的訊息呢:

[root@study ~]# tail /var/log/messags
Feb 17 06:40:35 host kernel: bnx2x 0000:05:00.0: eth4: NIC Link is Down
Feb 17 06:40:40 host kernel: bnx2x 0000:05:00.0: eth4: NIC Link is Up, 10000 Mbps full duplex, Flow control: none
Feb 17 07:11:12 host kernel: bnx2x 0000:05:00.0: eth4: NIC Link is Down
Feb 17 07:11:17 host kernel: bnx2x 0000:05:00.0: eth4: NIC Link is Up, 10000 Mbps full duplex, Flow control: none

很奇怪,每隔幾個小時就會自動的斷線再開~雖然不會影響到原本的系統運作 (沒有持續性掛載的資料放在該網卡上), 不過就是心裡不舒服~後來查了一下,似乎是網卡與 switch 之間溝通的 bug 所致,而且目前如果你沒有更新 switch 韌體的話, 應該是沒有辦法解決的,詳情可查閱:

其實解決方案還挺簡單的耶!就將網卡與 switch 之間的自動判斷網路速度功能 (auto negotiation) 設定為不啟用 (off) 即可。 設定方式如下:

[root@study ~]# ethtool -s eth4 autoneg off

測試個幾天,如果問題解決了,將上述的指令寫入 /etc/rc.d/rc.local 並將該檔案權限改成正確,就 OK 了!


Windows 10 透過 KVM 與 spice 的顯示問題 (2016/10/06)

一直以來教學測試的 VM 都是以 windows 7 為主,還沒有安裝過 windows10 在 VM 裡面。因為考慮到未來的使用情況, 所以安裝了 windows 10 的環境在 VM 底下,為了要加速,所以也使用了 KVM 建議使用的 spice (QXL) 顯示卡環境。

奇怪了! windows 10 的 VM 環境顯示效果奇差無比!根據 netman 大大提供的意見,找到了底下這兩篇文件:

看起來是 driver 的問題!然後跑到上面網站的連結,也就是底下的網站:

鳥哥安裝的是 qxlwddm-0.16-flexvdi.zip 這個檔案,結果竟然顯示的效果就好很多了!真是奇怪奇怪奇奇怪怪!鳥哥也不知道為何會這樣~ 真的是無奇不有~為了擔心這個檔案日後不見去,我把這個檔案複製一份到 這裡來 了, 單純備份而已,不做其他應用!


插上 PCI-E 擴充卡在個人電腦主機上,原本主機板上面的記憶體竟然消失不見了(2013/04/19)

在 2013 年初,鳥哥買了幾片 10G 的 PCI-E 8x 的網卡在進行一些研究,我的主機板上面原本有 8Gx4=32G 的記憶體在。插上 10G 的網卡後,竟然發現記憶體插槽第三槽 (slot 3) 上面的記憶體無法抓到了!拔掉 10G 網卡就恢復正常~很怪。更新了 BIOS 以及相關的 BIOS 內設定,都沒有辦法解決這個問題~困擾了一個多月啊!!

查詢了很多資料,都沒有人說到解決方案。最終詢問一些常常幫客戶作客制化的硬體廠商,他們的經驗是,因為個人電腦製造商根本不會想到一般用戶會拿主機板安裝這些高階擴充卡, 所以,當插了這些擴充卡之後,BIOS 恐怕會誤判硬體,導致記憶體就憑空消失!這在他們的經驗中,還挺常發現的!鳥哥的問題是 10G 網卡, 他們的問題則是發生在 RAID card 上頭~因為他們經常幫客戶組裝白牌的 RAID 機器設備。

怎麼解決呢?非常有趣!廠商跟我說,只要將 PCI-E 金手指,那個 pin 5, pin 6 腳位使用膠帶黏起來,讓它不會過電,一切問題就解決了! 鳥哥原本是半信半疑,後來跑去查 wiki 的 PCI-E 腳位定義,發現到 pin 5, pin 6 主要是定義 PCI-E 擴充卡匯流排的時脈 (SMBus) ,除此之外,並沒有其他特殊的功能! 也不是負責傳輸的 LANE~於是乎,鳥哥就很開心的請會作手工藝的學生將兩個腳位貼起來膠帶。

效果驚人!立刻抓到消失的記憶體!太開心了!提供給大家參考!如果有發現同樣問題的話,可以這樣解決看看!相當有趣喔! ^_^!原本鳥哥會擔心這樣會不會造成效能方面的困擾 趕緊實測一下~竟然沒有任何問題!運作上也很順暢!真是開心又愉快啊! ^_^

不過,廠商說的也有道理,既然主機板原本的設計就不是給這些設備用的,還是買高階的 server 設備來安裝這些卡使用比較好~這...鳥哥也知道啊! 不過,窮老師有窮老師的苦處啊~~



2013/04/19:將遇到的問題寫下來,做為未來可能發生問題的解決方案:
   http://linux.vbird.org is designed by VBird during 2001-2015.