Linux & UNIX 工作筆記

    內容表格
    1. 1. 筆記整理
      1. 1.1. 檢查目前網卡速度
      2. 1.2. 檢查 IP 衝突
      3. 1.3. 磁碟空間不足怎辦
      4. 1.4. 檢測目前系統是哪種虛擬平台
      5. 1.5. history 指令
      6. 1.6. column 指令
      7. 1.7. who 指令
      8. 1.8. du 系統指令
      9. 1.9. sosreoport 系統診斷工具
      10. 1.10. 檢查硬碟壞軌
      11. 1.11. nc 網路指令
      12. 1.12. 檢查 uptime 以及開關機的紀錄
      13. 1.13. 找出系統的對外 IP address
      14. 1.14. 系統關機 shutdown
      15. 1.15. 磁碟代號 mapper ID 查詢
      16. 1.16. 變更網卡位址 MAC Address
      17. 1.17. less +F 可以取代 tail -f
      18. 1.18. 備份/回復軟體套件(RPM & DPKG)
      19. 1.19. 快速檢查網路埠 (port) 是否開啟
      20. 1.20. 特殊檔案權限
      21. 1.21. ssh 連線指令
      22. 1.22. ip 指令
      23. 1.23. GPT/MBR 磁區
      24. 1.24. 建立超過 2TB 的磁區 (GPT)
      25. 1.25. 安裝編譯工具的開發環境
      26. 1.26. 變更系統預設語系
      27. 1.27. Swap 相關指令
      28. 1.28. Linux 郵件轉信設定
      29. 1.29. [PHP] 檢查支援項目及編譯參數
      30. 1.30. [PHP] 檢查 extension 是否載入
      31. 1.31. [PHP] 設定 timezone
      32. 1.32. 完整複製 Home 目錄
      33. 1.33. 關閉 EXT3 的 AUTO FSCK
      34. 1.34. 檢查檔案的日期
      35. 1.35. 查詢 DHCP Server IP
      36. 1.36. 檢查 Linux 開機時所使用的 kernel 參數
      37. 1.37. 數字換算工具 - bc
      38. 1.38. [CentOS] 移除預設的 Apache Test Page
      39. 1.39. 系統帳號管理 - account
      40. 1.40. SSHFS 透過 SSH 掛載遠端主機目錄
      41. 1.41. tar 使用技巧
      42. 1.42. sudo 使用技巧
      43. 1.43. Linux 的模組指令
      44. 1.44. Perl 使用技巧
      45. 1.45. rsync 備份/複製目錄
      46. 1.46. 製作目前系統的臨時開機光碟
      47. 1.47. 安裝 JRE/JDK 6
      48. 1.48. 改善硬碟 I/O 存取效能
      49. 1.49. 強制更新 partition table - partprobe
      50. 1.50. Putty 登入 Linux 執行有關 ncurses 的文字介面時會出現亂碼
      51. 1.51. 解決 btmp 紀錄檔案肥大問題
      52. 1.52. 檔案刪除技巧
      53. 1.53. 掛載 Windows 分享目錄
      54. 1.54. 關閉 SELinux
      55. 1.55. 校時(NTPD)及變更系統的時區-timezone
      56. 1.56. WGET 技巧
      57. 1.57. YUM 套件管理技巧
      58. 1.58. DNS 除錯指令 dig/host
      59. 1.59. 變更 hostname,無需重啟主機
      60. 1.60. Linux 系統作燒機/壓力測試(stress test)的工具
      61. 1.61. RedHat/CentOS 安裝時如何載入 Raid Card 驅動程式
      62. 1.62. CentOS 5 無法使用 4GB 以上 RAM
      63. 1.63. 遠端桌面管理-VNC
      64. 1.64. RPM 套件管理
      65. 1.65. 如何找出device名稱(/dev/sda)與LUN channel的對應列表?
      66. 1.66. Apache 網頁認證與  Windows Active Directory 整合
      67. 1.67. 編譯安裝 MRTG 流量監控套件
      68. 1.68. 指令 grep 的強化版
      69. 1.69. 關於 Joomla 1.5.x 網站被駭後所做的因應措施
      70. 1.70. 解開 RPM內的檔案,但不作安裝
      71. 1.71. 關閉  USB 儲存裝置的連接但不能影響 USB 鍵盤/滑鼠  
      72. 1.72. NFS 進階技巧
      73. 1.73. 如何使用 patch/diff 指令
      74. 1.74. 編輯器 VI 必學招
      75. 1.75. 比 top 還好用的工具 - htop
      76. 1.76. 指令 dd 的用法
      77. 1.77. ps 指令
      78. 1.78. 指令 ls 技巧
    2. 2. 延伸閱讀

    版本為 06:13, 30 Nov 2024

    到這個版本。

    返回到 版本存檔.

    查閱目前版本

    1. 1. 筆記整理
      1. 1.1. 檢查目前網卡速度
      2. 1.2. 檢查 IP 衝突
      3. 1.3. 磁碟空間不足怎辦
      4. 1.4. 檢測目前系統是哪種虛擬平台
      5. 1.5. history 指令
      6. 1.6. column 指令
      7. 1.7. who 指令
      8. 1.8. du 系統指令
      9. 1.9. sosreoport 系統診斷工具
      10. 1.10. 檢查硬碟壞軌
      11. 1.11. nc 網路指令
      12. 1.12. 檢查 uptime 以及開關機的紀錄
      13. 1.13. 找出系統的對外 IP address
      14. 1.14. 系統關機 shutdown
      15. 1.15. 磁碟代號 mapper ID 查詢
      16. 1.16. 變更網卡位址 MAC Address
      17. 1.17. less +F 可以取代 tail -f
      18. 1.18. 備份/回復軟體套件(RPM & DPKG)
      19. 1.19. 快速檢查網路埠 (port) 是否開啟
      20. 1.20. 特殊檔案權限
      21. 1.21. ssh 連線指令
      22. 1.22. ip 指令
      23. 1.23. GPT/MBR 磁區
      24. 1.24. 建立超過 2TB 的磁區 (GPT)
      25. 1.25. 安裝編譯工具的開發環境
      26. 1.26. 變更系統預設語系
      27. 1.27. Swap 相關指令
      28. 1.28. Linux 郵件轉信設定
      29. 1.29. [PHP] 檢查支援項目及編譯參數
      30. 1.30. [PHP] 檢查 extension 是否載入
      31. 1.31. [PHP] 設定 timezone
      32. 1.32. 完整複製 Home 目錄
      33. 1.33. 關閉 EXT3 的 AUTO FSCK
      34. 1.34. 檢查檔案的日期
      35. 1.35. 查詢 DHCP Server IP
      36. 1.36. 檢查 Linux 開機時所使用的 kernel 參數
      37. 1.37. 數字換算工具 - bc
      38. 1.38. [CentOS] 移除預設的 Apache Test Page
      39. 1.39. 系統帳號管理 - account
      40. 1.40. SSHFS 透過 SSH 掛載遠端主機目錄
      41. 1.41. tar 使用技巧
      42. 1.42. sudo 使用技巧
      43. 1.43. Linux 的模組指令
      44. 1.44. Perl 使用技巧
      45. 1.45. rsync 備份/複製目錄
      46. 1.46. 製作目前系統的臨時開機光碟
      47. 1.47. 安裝 JRE/JDK 6
      48. 1.48. 改善硬碟 I/O 存取效能
      49. 1.49. 強制更新 partition table - partprobe
      50. 1.50. Putty 登入 Linux 執行有關 ncurses 的文字介面時會出現亂碼
      51. 1.51. 解決 btmp 紀錄檔案肥大問題
      52. 1.52. 檔案刪除技巧
      53. 1.53. 掛載 Windows 分享目錄
      54. 1.54. 關閉 SELinux
      55. 1.55. 校時(NTPD)及變更系統的時區-timezone
      56. 1.56. WGET 技巧
      57. 1.57. YUM 套件管理技巧
      58. 1.58. DNS 除錯指令 dig/host
      59. 1.59. 變更 hostname,無需重啟主機
      60. 1.60. Linux 系統作燒機/壓力測試(stress test)的工具
      61. 1.61. RedHat/CentOS 安裝時如何載入 Raid Card 驅動程式
      62. 1.62. CentOS 5 無法使用 4GB 以上 RAM
      63. 1.63. 遠端桌面管理-VNC
      64. 1.64. RPM 套件管理
      65. 1.65. 如何找出device名稱(/dev/sda)與LUN channel的對應列表?
      66. 1.66. Apache 網頁認證與  Windows Active Directory 整合
      67. 1.67. 編譯安裝 MRTG 流量監控套件
      68. 1.68. 指令 grep 的強化版
      69. 1.69. 關於 Joomla 1.5.x 網站被駭後所做的因應措施
      70. 1.70. 解開 RPM內的檔案,但不作安裝
      71. 1.71. 關閉  USB 儲存裝置的連接但不能影響 USB 鍵盤/滑鼠  
      72. 1.72. NFS 進階技巧
      73. 1.73. 如何使用 patch/diff 指令
      74. 1.74. 編輯器 VI 必學招
      75. 1.75. 比 top 還好用的工具 - htop
      76. 1.76. 指令 dd 的用法
      77. 1.77. ps 指令
      78. 1.78. 指令 ls 技巧
    2. 2. 延伸閱讀

    筆記整理

    **如何快速搜尋筆記內容**
    建議使用 Firefox 為主要瀏覽器,只要輸入 / 然後在頁面最下方輸入要搜尋的關鍵字即可,往下搜尋按 F3。

    檢查目前網卡速度
    #> ethtool eth0
    
    Settings for eth0:
            Supported ports: [ TP ]
            Supported link modes:   10baseT/Half 10baseT/Full
                                    100baseT/Half 100baseT/Full
                                    1000baseT/Full
            Supports auto-negotiation: Yes
            Advertised link modes:  10baseT/Half 10baseT/Full
                                    100baseT/Half 100baseT/Full
                                    1000baseT/Full
            Advertised auto-negotiation: Yes
            Speed: 1000Mb/s
            Duplex: Full
            Port: Twisted Pair
            PHYAD: 1
            Transceiver: internal
            Auto-negotiation: on
            Supports Wake-on: g
            Wake-on: g
            Link detected: yes 
    
    檢查 IP 衝突
    #> arp-scan -I eth0 -l
    
    192.168.1.10   00:1b:a9:63:a2:4c       BROTHER INDUSTRIES, LTD.
    192.168.1.30   00:1e:8f:58:ec:49       CANON INC.
    192.168.1.33   00:25:4b:1b:10:20       Apple, Inc
    192.168.1.37   10:9a:dd:55:d7:95       Apple Inc
    192.168.1.38   20:c9:d0:27:8d:56       (Unknown)
    192.168.1.39   d4:85:64:4d:35:be       Hewlett Packard 
    192.168.1.39 00:0b:46:e4:8e:6d Cisco (DUP: 2)
    192.168.1.40 90:2b:34:18:59:c0 (Unknown) #> arp-scan -I wls1 -l | uniq -D -w 15 192.168.1.39 d4:85:64:4d:35:be Hewlett Packard 192.168.1.39 00:0b:46:e4:8e:6d Cisco (DUP: 2)
    磁碟空間不足怎辦
    列出前十大的目錄
    #> du -a /var | sort -n -r | head -n 10
    
    $ cd /path/to/some/where
    $ du -hsx * | sort -rh | head -10
    
    UNIX 系統可改用這
    for i in G M K; do du -ah | grep [0-9]$i | sort -nr -k 1; done | head -n 11
    
    用 find 指令
    #> find /path/to/dir/ -printf '%s %p\n'| sort -nr | head -10
    #> find . -printf '%s %p\n'| sort -nr | head -10
    
    #> find /path/to/search/ -type f -printf '%s %p\n'| sort -nr | head -10
    #> find /path/to/search/ -type f -iname "*.mp4" -printf '%s %p\n'| sort -nr | head -10
    
    檢測目前系統是哪種虛擬平台
    #> dmidecode -s system-manufacturer
    #> systemd-detec-virt
    #> virt-what
    history 指令

    顯示時間戳記

    #> export HISTTIMEFORMAT="%F %T "
    #> history | tail -3
       53  2016–03–02 08:27:38 nano /etc/fstab
       54  2016–03–02 08:27:38 umount /mnt/NAS
       55  2016–03–02 08:27:38 mount /mnt/NAS
    
    column 指令

    將輸出訊息以表格方式顯示

    column -ts: /etc/passwd
    mount | column -t 
    
    who 指令
    目前線上的帳號
    #> who
    #> who -H
    
    目前的 runlevel
    #> who -r
    
    最近開機時間
    #> who -b 
    
    du 系統指令

    列出 /home 目錄底下前五大的檔案及目錄

    #> du -a /home | sort -n -r | head -n 5
    

    列出目前目錄底下前五大的檔案及目錄

    #> du -a | sort -n -r | head -n 5
    
    以 KB, MB 顯示
    #> du -hs * | sort -rh | head -5
    
    搜尋所有子目錄
    #> du -Sh | sort -rh | head -5
    

     列出最大檔案清單

    #> find -type f -exec du -Sh {} + | sort -rh | head -n 5
    
     #> find /home/tecmint/Downloads/ -type f -exec du -Sh {} + | sort -rh | head -n 5
    sosreoport 系統診斷工具

    Redhat/CentOS 從 4.6 以後版本,都內建這個指令,一旦系統需要故障排除時,可以透過這指令蒐集系統的各項資訊,然後提供給專家做分析用。

    sosreport 基本用法:

    安裝 sosreport 如果沒安裝時
    #> yum install sos
    
    蒐集系統資訊
    #> sosreport
    NOTE: 過程中會耗時幾分鐘時間,而且會使用到目錄 /tmp,指令完成後會產生一個 sosreport-*.tar.bz2 檔案。
    
    指定暫存檔目錄,某些情況預設的 /tmp 空間不足時可改用此指令
    #> sosreport --tmp-dir /path/to/directory
    

    TIPS:

    sosreport 更多用法可以參閱 https://access.redhat.com/solutions/3592

    專家:如何分析這個資訊

    • 解開檔案後,目錄 sos_reports 內有一個 sosreport.html 網頁,開啟後可以透過網頁搜尋方式,快速找到各項的系統資訊。
    • xsos - Github 的專案
    檢查硬碟壞軌
    #> e2fsck -c /dev/sdb1
    
    #> badblocks -v /dev/sdb1 > badsectors.txt
    
    #> e2fsck -l badsectors.txt /dev/sdb1       ;for ext2/ext3/ext4 file-systems
    或
    #> fsck -l badsectors.txt /dev/sdb1 
    yum install smartmontools
    smartctl -H /dev/sdb1 
    
    nc 網路指令

    nc - netcat 工具
    快速檢查指定的 port 是否開啟

    > nc -vw 2 www.google.com 80
    Connection to www.google.com 80 port [tcp/http] succeeded! 
    
    檢查 uptime 以及開關機的紀錄

    uptime

    uptime
    awk '{print "up " $1 /60 " minutes"}' /proc/uptime
    w 
    

    系統開關機記錄

    who -b
    last reboot
    last shutdown 
    
    找出系統的對外 IP address
    $> dig +short myip.opendns.com @resolver1.opendns.com
    
    $> host myip.opendns.com resolver1.opendns.com
    
    $> dig TXT +short o-o.myaddr.l.google.com @ns1.google.com | awk -F'"' '{ print $2}'
    
    $> myip="$(dig +short myip.opendns.com @resolver1.opendns.com)"
    $> echo "My WAN/Public IP address: ${myip}" 
    
    系統關機 shutdown

    強制關機
    NOTE: 有些時候,因為某些原因,例如 I/O Error 狀況導致系統無法關機,可以使用這個。

    echo 1 > /proc/sys/kernel/sysrq
    echo o > /proc/sysrq-trigger              <=== 這是ㄡ
    

    強制重啟

    echo 1 > /proc/sys/kernel/sysrq
    echo b > /proc/sysrq-trigger
    

    重啟後不要執行 fsck

    shutdown -rf
    

    -r  Reboot after shutdown

    -f  Skip fsck on reboot

    磁碟代號 mapper ID 查詢
    #> dmsetup ls
    
    #> ls -l /dev/disk/by-path
    #> ls -l /dev/disk/by-id
    # > ls -l /dev/disk/by-uuid
    
    變更網卡位址 MAC Address
    先註解舊 MAC
    #> sed -i 's/HWADDR/#HWADDR/g' /etc/sysconfig/network-scripts/ifcfg-eth0
    
    在變更新的 MAC
    #> service network stop
    #> ip link set eth0 address xx:xx:xx:xx:xx:xx
    #> service network start 
    

    永久變更

    #> vi /etc/sysconfig/network-scripts/ifcfg-eth0
    
    MACADDR=12:34:56:78:90:ab 
    

    注意:不用使用 HWADDR。

    less +F 可以取代 tail -f

    監看即時 log 當中還能搜尋關鍵字

    #> less +F my.log
    
    Ctrl + c 進入 nomal mode 後,可以使用搜尋功能
    回復原有模式 shift +f (F) 
    
    備份/回復軟體套件(RPM & DPKG)

    備份已安裝的套件清單

    $ dpkg --get-selections
    $ dpkg --get-selections > /backup/installed-software.log 
    
    $ rpm -qa
    $ rpm -qa > /backup/installed-software.log
    OR remove software version number (recommended):
    $ rpm -qa --qf "%{NAME}\n" | sort > /backup/installed-software.log
    

    回復清單上的所有套件

    # dpkg --set-selections < /backup/installed-software.log
    
    Once list is imported, use the dselect command or other tools to install the packages, enter:
    # dselect
    Select 'i' for install the software. 
    
    OR use the following command:
    # apt-get dselect-upgrade
    
    # LIST="$( cat /backup/installed-software.log )"
    
    If you are using the yum command, type the following bash for loop to install all software:
    # for s in $LIST; do yum -y install $s; done
    
    Or try out the following command (HT to gt):
    # yum -y install $(cat /backup/installed-software.log) 
    

    A Note About RHEL version 4

    If you are using RHEL/CentOS v4.x or older, enter:
    # for s in $LIST; do up2date -i $s; done
    
    Alternatively, you can use the following up2date command:
    # up2date -i $(cat /backup/installed-software.log) 
    
    快速檢查網路埠 (port) 是否開啟
    方法一
    telnet <IP> <port>
    
    方法二
    nc -zv <IP> <port> 
    
    特殊檔案權限

    使特定檔案無法被任何帳號刪除及變更(包含 root)

    chattr +i /etc/passwd
    lsattr /etc/passwd 
    

    TIPs:

    +i , add immutable attribute

    對整個目錄
    chattr -R +i my-dir/

    -i, remove immutable attribute

    使特定檔案的內容,只能插入新行(append mode),不可作內容刪除

    chattr +a /var/log/syslog
    
    ssh 連線指令

    本機:8888 對應至 遠端 irc.freenode.net:6667

    ssh -L 8888:irc.freenode.net:6667 myuser@randomhost.net
    

    假使 SSH port 非標準,而是 2745 時

    ssh -p2745 -L8888:irc.freenode.net:6667 myuser@randomhost.net
    
    ip 指令

    替代 ifconfig 指令

    顯示所有網卡資訊
    ip addr
    ip a
    
    顯示 eth0 網卡資訊
    ip a show eth0 
    
    開啟/關閉網卡
    ip link set eth0 { up | down }
    
    顯示所有的網路裝置
    ip link show
    ip l show
    
    設定 IP (非永久)
    ip a add 192.168.1.200/255.255.255.0 dev eth0
    
    移除 IP (非永久)
    ip a del 192.168.1.200/255.255.255.0 dev eth0
    
    顯示 default gateway 及路由表
    ip route show
    ip r show
    ip route add 10.10.20.0/24 via 192.168.50.100 dev eth0
    ip route del 10.10.20.0/24
    
    Default gateway
    ip route add default via 192.168.50.100
    
    網路即時狀態
    ip -s link 
    
    顯示 ARP 紀錄 (NOTE: 查詢連接網路設備的 MAC address 與 IP 對應表)
    ip neigh show
    ip n show
    
    清除 ARP 清單裡的某個 IP 紀錄
    ip -s -s n f <ip-address>
    
    線上求助
    ip a help
    

    在多個網路埠的主機上,如何得知哪些埠有接上網路線

    1. 列出所有網路埠
    ip link show  如果埠號顯示 DOWN 必須先啟動
    
    2. 啟動網路埠 NOTE: 啟動前要注意 IP 是否會衝突
    ip link set eth6 up
    
    3. 啟動後檢測線路
    ethtool eth6 | grep detected
    
    GPT/MBR 磁區

    Q: 如果磁碟曾經作過 GPT 磁區,之後再用舊版 Linux 安裝系統時,可能會遇到錯誤 Your boot partition is on a disk using the GPT partitioning Scheme but this machines cannot boot using GPT. ,解決方法是必須將磁碟定義為 MBR,步驟:

    在安裝 CentOS 過程,選擇語言時,按下 CTRL+ALT+F2,輸入指令

    /usr/sbin/parted -s /dev/sda mklabel msdos
    

    如果想定義磁碟為 GPT 磁區

    /usr/sbin/parted -s /dev/sda mklabel gpt
    

    補充:

    MBR 主要用來做系統開機的磁區

    MBR 的磁碟限制是 2TB,GPT 是 1024TB

    Q: 安裝 CentOS 5.x 在 > 2TB 磁碟,無法開機

    安裝 CentOS 5/6  在 > 2TB 磁碟,而且硬體是用 BIOS 開機(不是新的 UEFI),安裝後的 Linux 會無法正常開機,原因是 CentOS 的光碟安裝程序並不支援 GPT 磁區分割。

    建立超過 2TB 的磁區 (GPT)

    當磁碟容量超過 2TB 時,要新增一個 2TB 以上的磁區,工具軟體必須改用 parted。

    #> parted /dev/xvdc
    
    (parted) mklabel gpt
    (parted) print
    

    檢查磁碟總容量 4398 GB。

    Model: Xen Virtual Block Device (xvd)
    Disk /dev/xvdc: 4398GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt

    Number  Start  End  Size  File system  Name  Flags

    (parted) mkpart primary ext3 0 4398GB
    (parted) print
    

    依照總容量切割磁區

    Model: Xen Virtual Block Device (xvd)
    Disk /dev/xvdc: 4398GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt

    Number  Start   End     Size    File system  Name     Flags
     1      17.4kB  4398GB  4398GB               primary
    (parted) set 1 lvm on
    (parted) print
    

    TIPs:

    (parted) mkpart
    Partition name?  []? primary
    File system type? ext3
    Start? 0
    End? -1

    -1 最大磁碟空間

    設定磁區標籤為 lvm,1 是磁區的編號。

    Model: Xen Virtual Block Device (xvd)
    Disk /dev/xvdc: 4398GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt

    Number  Start   End     Size    File system  Name     Flags
     1      17.4kB  4398GB  4398GB               primary  lvm
    (parted) quit
    
    #> fdisk -l 
    

    ...
    WARNING: GPT (GUID Partition Table) detected on '/dev/xvdc'! The util fdisk doesn't support GPT. Use GNU Parted.


    WARNING: The size of this disk is 4.4 TB (4398046511104 bytes).
    DOS partition table format can not be used on drives for volumes
    larger than 2.2 TB (2199023255040 bytes). Use parted(1) and GUID
    partition table format (GPT).


    Disk /dev/xvdc: 4398.0 GB, 4398046511104 bytes
    255 heads, 63 sectors/track, 534698 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes

        Device Boot      Start         End      Blocks   Id  System
    /dev/xvdc1               1      267350  2147483647+  ee  EFI GPT

    安裝編譯工具的開發環境
    yum install make libtool autoconf subversion git cvs wget libogg-devel gcc gcc-c++ pkgconfig
    
    變更系統預設語系

    CentOS 6
    編輯 /etc/sysconfig/i18n

    英文
    LANG="en_US.UTF-8"
    
    繁體中文
    LANG="zh_TW.UTF-8"
    
    簡體中文
    LANG="zh_CN.UTF-8"
    
    Swap 相關指令
    // 檢查目前的 swap 配置
    > free
    > swapon -s
    
    // 關閉 swap
    > swapon /dev/sda3
    
    // 開啟 swap
    > swapoff /dev/sda3
    
    // 製作一個 swap 系統
    > mkswap /dev/sda3 
    

    make-swapfile-DO:1GB

    #!/bin/bash
    
    dd if=/dev/zero of=/swapfile bs=1024 count=1024k
    chown root:root /swapfile
    chmod 0600 /swapfile
    mkswap /swapfile
    swapon /swapfile
    echo "/swapfile          swap            swap    defaults        0 0" >> /etc/fstab
    sysctl vm.swappiness=10
    echo vm.swappiness=10 >> /etc/sysctl.conf
    free -h
    cat /proc/sys/vm/swappiness
    
    Linux 郵件轉信設定

    sendmail)

    架設寄信主機為 192.168.21.75 (smtp.my.domain)
    編輯 /etc/mail/sendmail.cf

    # "Smart" relay host (may be null)
    DS[192.168.21.75]
    
    或者是
    # "Smart" relay host (may be null)
    DSsmtp.my.domain 
    

    需重啟 sendmail 服務

    postfix)

    編輯 /etc/postfix/main.cf

    relayhost = [192.168.21.75]
    

    重啟服務

    [PHP] 檢查支援項目及編譯參數
    php -i
    
    [PHP] 檢查 extension 是否載入
    php -m | grep imagick
    
    [PHP] 設定 timezone

    編輯 /etc/php.ini

    date.timezone = 'Asia/Taipei'
    
    完整複製 Home 目錄

    由於 User 的 Home 目錄內有許多隱藏檔,若要完整複製它們,有兩個方法:

    方法一:可以複製成一個新目錄

    cd /home
    cp -a user1/ user1_new/ 
    

    方法二:複製到一個現有目錄內

    cd /home
    cp -a user1/.[^.]* user1_new/ 

    建立一個新的 Home 目錄

    cp -r /etc/skel /home/user1
    chown -R user1.group1 /home/user1
    chmod 0700 /home/user1 
    
    關閉 EXT3 的 AUTO FSCK

    原因:對於比較大的 filesystem,預設在 mount 次數 > 30 或 180 天後,系統若有重新開機,會自動作 FSCK,這會使 downtime 非常長。

    檢查檔案系統資訊

    # tune2fs -l /dev/VolGroup/LogVol

    Mount count: 1 Maximum mount count: 30 Last checked: Tue Apr 29 13:09:15 2014 Check interval: 15552000 (6 months)

    方法一:永久關閉 - tune2fs(適用於 RedHat 4.x/5.x)

    // 只關閉天數限制
    tune2fs -i 0 /dev/VolGroup/LogVol
    
    // 關閉 mount 次數與天數限制
    tune2fs -c 0 -i 0 /dev/VolGroup/LogVol

    方法二:永久關閉 - fstab(適用於 RedHat 4.x/5.x)
    編輯 /etc/fstab,在第 6 欄位修改成 0

    /dev/VolGroup00/arclogLV        /opt/oracle/arclog      ext3    defaults        1 0
    

    方法三:暫時關閉 - 重啟系統前(適用於 RedHat 4.x/5.x)
    重啟指令

    shutdown -rf
    

    -r  Reboot after shutdown

    -f  Skip fsck on reboot

    方法四:暫時關閉 - 重啟系統後(適用於 RedHat 4.x/5.x)

    在開機選單畫面,按 e > 在 kernel 行最後加上 fastboot

    檢查檔案的日期

    在 AIX 5.3 使用 ls -l 時,有時會無法顯示檔案的日期,替代方式有:

    # istat istflr.MMDB.CAPMM02.CAP.log0924.gz
    Inode 11 on device 50/6 File
    Protection: rw-r--r--
    Owner: 801(istflr)              Group: 801(db2adm)
    Link count:   1         Length 5572891 bytes
    
    Last updated:   Tue Sep 24 09:22:23 TAIST 2013
    Last modified:  Tue Sep 24 09:20:59 TAIST 2013
    Last accessed:  Thu Jan  9 14:28:05 TAIST 2014
    
    查詢 DHCP Server IP
    # dhclient eth0
    
    # grep dhcp-server-identifier /var/lib/dhclient/dhclient.leases 
    
    檢查 Linux 開機時所使用的 kernel 參數
    #> cat /proc/cmdline
    console=ttyAS0,115200 root=/dev/sdb1  rootfstype=ext3 rw  nwhwconf=device:eth0,hwaddr:24:cf:21:ba:22:46 phyaddr:0,watchdog:5000 mem=120M bigphysarea=2048
    
    數字換算工具 - bc

    // 基本運算

    #> bc
    scale=3     ;設定小數點 3 位
    239/60
    3.983
    quit 
    

    // 16 進制換算成 10 進制

    #> echo "ibase=16;A7" | bc
    167
    

    // 2 進制換算成 10 進制

    #> echo "ibase=2;11111111" | bc
    255
    
    [CentOS] 移除預設的 Apache Test Page
    cd /etc/httpd/conf.d
    mv welcome.conf welcome.conf.disabled
    service httpd restart
    系統帳號管理 - account

    // 建立系統用帳號

    CentOS/RedHat)

    groupadd -r asterisk
    useradd -r -g asterisk -d /var/lib/asterisk -M asterisk
    

    Ubuntu/Debian)

    addgroup --system asterisk
    adduser --system --ingroup asterisk --home /var/lib/asterisk --no-create-home --shell /bin/bash asterisk
    

    // 強迫使用者在第一次登入後,修改他們的登入密碼

    先將帳號鎖定
    #> usermod -L <username>
    
    強制第一次登入必須修改密碼
    #> chage -d 0 <username>
    
    解除帳號鎖定
    #> usermod -U <username>
    
    檢查帳號的期限
    #> chage -l <user-name>
    

    // 帳號使用期限

    檢查帳號期限
    #> chage -l <user-name>
    
    設定有效期限 
    #> chage -M 10 <user-name>                      ; 10 天後密碼即失效
    #> chage -E "2017-02-20" <user-name>   ; 2017-02-20 以後帳號即鎖定
    #> chage -I 10 <user-name>                         ; 如有設定密碼期限時,當密碼失效啟 10 日後自動鎖定帳號 
    
    解除期限
    #> chage -E -1 <user-name>       ; 數字 -1 解除期限設定 
    

    // 帳號鎖定與解鎖

    鎖定帳號
    #> usermod -L <user-name>
    
    解鎖帳號
    #> usermod -U <user-name>
    
    檢查帳號鎖定狀態
    #> grep <user-name> /etc/shadow
    
    dbtest:!$6$hFCW6eI1$kI9J9QrxCjnpvzFPJnxSpNvQ...  密碼欄有 ! 符號表示鎖定
    

    // 修改既有帳號的設定,如註解 Comment

    # usermod -c "John" john
    

    // 限制某帳號不可遠端登入,但可以由其他允許帳號從遠端登入後,執行 su 切換到該帳號

    情境:限制 devrpt 可以從遠端登入,但其他帳號在登入後可以 su 到 devrpt。

    方法一: 最快速且容易設定但不夠嚴謹

    刪除 devrpt 的密碼

    passwd -d devrpt
    

    方法二: 比較嚴謹的做法

    以 CentOS 為例:
    1. 編輯 /etc/security/access.conf,加上這幾行

    # The line 'cron crond' is required
    +:devrpt:cron crond tty1 tty2 tty3 tty4 tty5 tty6
    -:devrpt:ALL
    

    TIPs:

    內容格式為 permission : username: origins

    permission + 允許 或 - 拒絕
    username 帳號
    origins 來源,這可以是 tty 名稱'、主機/網域名稱、IP 。

    注意:在此例,必須加上 cron crond 這一行,否則該帳號的 crontab 會無法工作。

    2. 對於不同的登入服務,需要修改相應的安全設定檔

    • telnet : /etc/pam.d/remote
      • 修改後立即生效
    • SSH : /etc/pam.d/sshd
      • 修改後需重新載入 SSHD
    • Local 本機登入 : /etc/pam.d/login

    視需要將以下內容加入其中一項或多項檔案內

    # Limited users for remote login via telnet
    # Check the file /etc/security/access.conf
    account    required     pam_access.so
    

    // 鎖定帳號但不移除

    Lock
    #> passwd -l john
    #> chage -E 0 john
    
    Unlock
    #> passwd -u john
    #> chage -E john 
    

    TIPs:

    注意:passwd 雖然可以鎖定帳號,但仍可以用 SSH-Key 登入。

    // 重建用戶家目錄

    #> mkhomedir_helper <username>
    
    SSHFS 透過 SSH 掛載遠端主機目錄

    安裝 sshfs 套件

    for CentOS)
    先安裝 EPEL 套件庫
    yum install fuse sshfs
    modprobe fuse
    lsmod fuse
    
    for Ubuntu)
    apt-get install sshfs 
    

    使用 sshfs

    sshfs user@remote_host:/remote_directory /local_mount_point
    

    設定自動掛載

    1. 確認 module fuse 會自動啟動

    2. 編輯 /etc/fstab

    sshfs#root@10.233.10.212:/ /mnt/ssh fuse defaults 0 0
    
    tar 使用技巧
    不解開檔案的搜尋方式
    tar fzt myapp.tar.gz | grep keyword 
    
    壓縮檔案目錄時,想保留完整原始路徑,但都會出現訊息:tar: Removing leading `/' from member names
    試試這
    tar cf nagios.tar -C/ etc/nagios
    
    
    sudo 使用技巧

    必須先修改 sudoers

    以用戶 john 執行 SHELL
    sudo -u john bash -c "whoami"
    
    以用戶 john 開啟 vnc 服務,-H 可保持用戶的 HOME;否則會是 /root。
    sudo -H -u john bash -c "vncserver" 
    
    以用戶 devrpt 執行 db2_get_tbs_usage.sh -d devrptdb
    sudo -u devrpt -H -s /usr/local/bin/db2_get_tbs_usage.sh -d devrptdb
    或
    sudo -u devrpt -H bash -c "/usr/local/bin/db2_get_tbs_usage.sh -d devrptdb" 
    

    編輯 sudoers

    #> visudo
    
    alang  ALL=(devrpt) /bin/bash,/usr/local/bin/db2_get_tbs_usage.sh 
    

    TIPs:

    內容格式為
    使用者帳號  登入者的來源主機名稱=(可切換的身份)  可下達的指令

    如果要執行 SHELL Scripts,除了 scripts 路徑以外,還要加上 /bin/bash。

    不需修改 sudoers,但只能適用 root 執行

    su -l john -c "whoami"
    

    帳號 user1 需要有 root 權限,但不想讓他知道 root 密碼

    #visudo
    
    user1   ALL=(ALL)       ALL
    

    NOTEs:

    user1 登入後,執行 sudo -i 或 sudo -s ,輸入 user1 密碼後,就可以成為 root。

    Linux 的模組指令
    啟用模組
    modprobe <module name> option=<option name>
    
    列出已啟用的模組
    lsmod
    
    檢查特定模組的參數值
    cat /sys/module/<module name>/<option name>
    
    Perl 使用技巧

    列出已安裝的模組 - instmodsh

    #instmodsh
    
    cmd? l
    Installed modules are:
       Perl
       asterisk-perl
    cmd? quit
    
    rsync 備份/複製目錄

    備份或複製目錄,確保檔案及其屬性完全相同

    rsync -au --delete <source-dir> <target-dir>
    

    --delete 當 <source-dir> 裡的檔案被刪除時,<target-dir> 裡的同個檔案也會被刪除。

    複製目錄下大量檔案,但不要覆蓋原有檔案也不要出現提示(Rsync)

    rsync -avh --ignore-existing source-dir/ target-dir/
    

    複製前先用這指令列出檔案清單

    rsync -anvh --ignore-existing source-dir/ target-dir/ > files.list
    製作目前系統的臨時開機光碟
    mkbootdisk --iso --device ./boot.iso `uname -r`
    

    在 CetOS5.5 執行會出現錯誤:cp: cannot stat `/usr/lib/syslinux/isolinux.bin': No such file or directory
    Ans: 這是因為此版的 mkbootdisk script 內容有一行錯誤

    if [ -n "$isoimage" ]; then
        cfgfile=$MOUNTDIR/isolinux/isolinux.cfg
        bootmsg=$MOUNTDIR/isolinux/boot.msg
    
        # create an iso image; the directory is all we need
        [ -n "$verbose" ] && echo -n "Installing isolinux... "
        mkdir $MOUNTDIR/isolinux
        #cp /usr/lib/syslinux/isolinux.bin $MOUNTDIR/isolinux <----- 改這行
        cp /usr/share/syslinux/isolinux.bin $MOUNTDIR/isolinux
        [ -n "$verbose" ] && echo don

    ↑GO TO TOP↑

    安裝 JRE/JDK 6

    // 下載 jre-6u24-linux-i586-rpm.bin, jdk-6u24-linux-i586-rpm.bin

    RHEL/CentOS

    chmod u+x jre-6u24-linux-i586-rpm.bin
    ./jre-6u24-linux-i586-rpm.bin 
    
    ## java ##
    alternatives --install /usr/bin/java java /usr/java/jre1.6.0_45/bin/java 20000
     
    ## javaws ##
    alternatives --install /usr/bin/javaws javaws /usr/java/jre1.6.0_45/bin/javaws 20000
     
    ## Java Browser (Mozilla) Plugin 32-bit ##
    alternatives --install /usr/lib/mozilla/plugins/libjavaplugin.so libjavaplugin.so /usr/java/jre1.6.0_45/lib/i386/libnpjp2.so 20000
     
    ## Java Browser (Mozilla) Plugin 64-bit ##
    alternatives --install /usr/lib64/mozilla/plugins/libjavaplugin.so libjavaplugin.so.x86_64 /usr/java/jre1.6.0_45/lib/amd64/libnpjp2.so 20000
    

    Ubuntu/Debian

    sudo update-alternatives --install "/usr/bin/java" "java" "/opt/java/32/jre1.6.0_45/bin/java" 1
    sudo update-alternatives --set "java" "/opt/java/32/jre1.6.0_45/bin/java"
    mkdir ~/.mozilla/plugins
    ln -s /opt/java/32/jre1.6.0_45/lib/i386/libnpjp2.so ~/.mozilla/plugins
    

    確認安裝

    # java -version
    java version "1.6.0_24"
    Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
    Java HotSpot(TM) Client VM (build 19.1-b02, mixed mode, sharing)
    
    改善硬碟 I/O 存取效能

    自 2010 年起所製造的硬碟開始使用 4096-byte(4K) sector size,而 Linux 在預設安裝下仍使用 512-byte 的磁區,就網路測試的數據顯示,以 ext3 磁區,2TB 的 SATA 硬碟,樣本檔案大小 1TB,作檔案複製時,使用 4K-byte sector 竟比 512-byte sector 減少 7 小時。

    指令:
    fdisk -> x  extra functionality (experts only) -> setting the start sector("b") to 64

    測試:

    hdparm -tT /dev/sda1

    參考連結:

    Notes: 並不是所有廠牌的硬碟都有支援 4096-byte sector size。

    ↑GO TO TOP↑

    強制更新 partition table - partprobe

    使用 fdisk 變更 partition table 後,若不想作 reboot 但要立即更新,可以使用指令。

    #> partprobe /dev/mapper/mpathb      ;磁碟裝置
    
    Putty 登入 Linux 執行有關 ncurses 的文字介面時會出現亂碼

    Putty 的設定)

    • Terminal > Use background colour to erase screen [check]
    • Window > Translation
      • Received data assumed .... character set: [UTF-8]
      • Treat CJK ambiguous characters as wide [uncheck]
    • Connection > Data > Terminal-type string [linux]
    解決 btmp 紀錄檔案肥大問題

    敘述:/var/log/btmp 檔案有 1.xGB 以上。
    原因:btmp 用來紀錄系統登入的資訊,若出現異常登入現象,會造成此檔增大。
    解決:使用 lastb 指令檢查所有登入紀錄是否正常,要避免異常的登入,可以修改 SSH Port。

    // 清空 btmp 內容

    cat /dev/null > /var/log/btmp
    

    ↑GO TO TOP↑

    檔案刪除技巧

    包含 dash 符號的檔名

    rm ./-1234567.txt
    

    檔案數太多,直接刪除會出現錯誤:Argument list too long

    方法一
    #> cd /var/spool/clientmqueue
    #> for f in *
    > do
    > echo "rm $f";
    > done
    
    方法二
    #> cd /var/spool/clientmqueue
    #> find .  -name "*" -maxdepth 1 -exec rm -f {} \;
    
    掛載 Windows 分享目錄

    CentOS 5)
    ( How to mount remote Windows shares )

    mount.cifs //winbox/getme /mnt/win -o ip=123.123.123.123,username=sushi,password=yummy
    

    ※ mount.cifs 指令在 samba-client 套件內。

    關閉 SELinux

    關於 SELinux

    // 永久 Disable SELinux
    重開機後自動關閉

    #> sed -i 's/SELINUX=.*$/SELINUX=disabled/' /etc/selinux/config
    

    手動立即關閉

    #> setenforce 0
    

    // 檢查 SELinux 的狀態

    #> sestatus
    SELinux status:                 disabled 
    或
    #> getenforce 
    

    // 開機時關閉
    編輯開機選單

    grub append> ro root=/dev/VolGroup00/LogVo100 selinux=0 enforcing=0
    

    ↑GO TO TOP↑

    校時(NTPD)及變更系統的時區-timezone

    校時:

    yum install ntp
    ntpdate pool.ntp.org
    chkconfig ntpd on
    service ntpd start 
    

    Crontab:
    /etc/crontab

    10 * * * * root (/usr/sbin/ntpdate tw.pool.ntp.org && /sbin/hwclock -w) &> /dev/null
    

    /etc/cron.hourly/ntpdate.cron:

    #!/usr/bin/env bash
    TIMESVR="192.168.21.86"
    
    (/sbin/ntpdate $TIMESVR && /sbin/hwclock -w) > /dev/null
    

    檢查校時:

    # ntpstat
    synchronised to NTP server (204.9.54.119) at stratum 2
       time correct to within 121 ms
       polling server every 64 s
    
    # ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
    +w1-wdc.ipv4.got 10.0.77.54       4 u   14   64  377  214.365  -16.459   8.887
     clock02.chil01. 204.9.54.119     2 u   15   64  377  278.195   -1.254   0.427
    *ntp.your.org    .CDMA.           1 u   13   64  377  196.313  -16.884   0.456
     LOCAL(0)        .LOCL.          10 l   14   64  377    0.000    0.000   0.001 
    

    TIPs:

    如果 ntpd server 目前時間的偏移量 offset 太大,會造成 ntpd 無法服務,必須先停止 ntpd 服務,然後用 ntpdate 手動校正時間一次,再啟動 ntpd 服務。

    變更時區:
    for CentOS 5/6/7)

    # ln -s /usr/share/zoneinfo/Asia/Taipei /etc/localtime
    

    或者

    # system-config-date
    

    設定時間:

    # date -s "2 OCT 2006 18:00:00"
    # /sbin/hwclock --systohc 
    
    WGET 技巧

    // Proxy 設定

    $ export http_proxy=http://username:password@this.is.proxy.ip:port
    $ export http_proxy=http://windomain\\username:password@this.is.proxy.ip:port

    或 修改 /etc/wgetrc

    http_proxy=http://windomain\username:password@this.is.proxy.ip:port/
    這裡的 domain 與 username 之間不用雙反斜線。

    // 解決:有些下載時,檔名會包含有 URL 字串

    wget 'HTTP URL Link'

    // 下載整個網頁 HTML 檔(必須開啟 Index of)

    wget -r --no-parent http://xxx.xxx.xxx/aaa/
    
    YUM 套件管理技巧

    // 系統更新

    yum repolist enabled
    
    查詢所有可更新的套件
    yum list updates
    
    更新所有套件
    yum update --disablerepo=epel
    

    // 停用有問題的 yum-updatesd,並以下列方式取代

    停用 yum-updatesd
    service yum-updatesd stop
    chkconfig yum-updatesd off
    
    新增 /etc/cron.daily/yum.cron
    #!/bin/sh
    /usr/bin/yum -R 120 -e 0 -d 0 -y update yum
    /usr/bin/yum -R 10 -e 0 -d 0 -y update                        #如果不想讓系統自動更新所有套件,可註解這行。
    
    chmod 0755 /etc/cron.daily/yum.cron 

    // 各種舊版本的套件庫位址

    http://vault.centos.org/

    // 如果想將多個 CD 的 ISO 檔合併成一個 DVD ISO,可以使用附件區的 mkdvdiso.sh,這只能使用在 RedHat/CentOS 版本,使用方法如下

    yum install anaconda-runtime mkisofs
    
    ./mkdvdiso.sh cd/ /tmp/CentOS-5.5-i386-bin-DVD.iso

    TIPs:

    所有 CD ISO 檔放在 cd/ 目錄內

    必須關閉 SELinux

    輸出檔路徑必須是絕對路徑

    // 清除最新套件庫清單及暫存的套件檔

    yum clean all
    

    // 搜尋套件的某一個檔案
    搜尋 libstdc++.so.6

    yum whatprovides "*/libstdc++.so.6" 
    

    // 列出指定套件的相依性

    yum deplist <package-name>
    

    // 下載 RPM 套件

    yum -y install yum-utils.noarch
    yumdownloader <package-name>
    
    ; Extract downloaded RPM
    rpm2cpio dekiwiki-10.0.1-3.1.noarch.rpm | cpio -idmv 
    
    yum -y install --downloadonly --downloaddir=/tmp/packages NetworkManager
    

    // 安裝時臨時啟用一個不常用的套件庫位址

    yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel
    

    // 使用光碟 ISO方式來升級系統

    # vi /etc/yum.repo.d/CentOS-Media.repo
    
    [c6-local]
    name=CentOS-$releasever - Media
    baseurl=file:///mnt/iso/
    gpgcheck=0
    enabled=0
    
    NOTE: enabled=0,不是 1。將 DVD 掛載為 /mnt/iso。 
    
    # yum --disablerepo=\* --enablerepo=c6-local upgrade
    

    // 安裝本機端的 RPM 套件

    yum --nogpgcheck install htop-1.0.2-1.el5.rf.x86_64.rpm
    

    // 安裝指定版本套件

    yum --showduplicates list <package-name>
    yum list <package-name>-<version>
    yum install <package-name>-<version> 

    // 列出所有套件庫位址

    yum repolist
    yum repolist enabled 
    

    // 列出已安裝套件

    yum list installed
    yum list installed |tail -n +3|cut -d' ' -f1 > installed_packages.lst
    或
    rpm -qa > installed_packages.lst
    
    yum -y install $(cat installed_packages.lst) 
    

    // 安裝 EPEL 套件庫
    EPEL - Extra Packages for Enterprise Linux

    rpm -ivh http://mirror01.idc.hinet.net/EPEL/5/i386/epel-release-5-4.noarch.rpm
    rpm -ivh http://mirror01.idc.hinet.net/EPEL/6/i386/epel-release-6-8.noarch.rpm 
    

    TIPs:

    錯誤: Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
    解決: sed -i "s/mirrorlist=https/mirrorlist=http/" /etc/yum.repos.d/epel.repo

    // 安裝 ELRepo 套件庫
    ELRepo - The Community Enterprise Linux Repository

    rpm --import http://elrepo.org/RPM-GPG-KEY-elrepo.org
    
    for RHEL-5, CENTOS-5
    rpm -Uvh http://elrepo.org/elrepo-release-5-2.el5.elrepo.noarch.rpm
    
    for RHEL-6, CENTOS-6
    rpm -Uvh http://elrepo.org/elrepo-release-6-3.el6.elrepo.noarch.rpm
    

    // 安裝 RPMforge/RepoForge 套件庫
    RPMforge 是由 Dag 及其他包裝者合作維護的。他們為 CentOS 提供超過 5000 個套件,包括 wine、vlc、mplayer、xmms-mp3 及其他受歡迎的媒體工具。它並不是 Red Hat 或 CentOS 的一部份,但卻是為那些發行版本而設計的。

    // CentOS 如何補安裝套件組
    系統在第一次安裝時,都可以選擇要安裝哪些套件組,假使之後系統要補裝某套件組,例如 GNOME 視窗套件,可以使用這些指令,而不用一一找出有哪些相依性的套件名稱。

    列出有哪些套件組可安裝
    # yum grouplist
    安裝 GNOME 視窗套件組
    # yum groupinstall "GNOME Desktop Environment"
    移除套件組
    # yum groupremove "Office Suite and Productivity" "Dial-up Networking Support"
    

    // 設定 proxy
    編輯 /etc/yum.conf

    proxy=http://<username>:<password>@<this.is.proxy.ip:<port>/
    proxy=http://windowsad\username:password@proxy.server:port/

    // 安裝本機上的 RPM

    # yum localinstall my.rpm
    

    // 建立 YUM 套件庫主機

    安裝套件 createrepo
    CetOS 5:

    createrepo /source/path/reas5
    createrepo -g  /source/path/reas5/repodata/comps.xml
    

    CetOS 6/7:

     createrepo /yum-repo-packages/centos_6.4_x86_64
     createrepo -g /yum-repo-packages/centos_6.4_x86_64/repodata/2727...cab6f72-c6-x86_64-comps.xml /yum-repo-packages/centos_6.4_x86_64
    

    ↑GO TO TOP↑

    DNS 除錯指令 dig/host

    使用 host)

    $> host <FQDN> <DNS-Server>
    

    使用 dig)
    很早以前 nslookup 就被 dig 所取代,看看這個新工具的用法:

    // 以系統所設的 DNS server(resolv.conf) 查詢網域
    $>  dig www.osslab.org.tw
    
    // 以指定的 DNS server(8.8.8.8)查詢網域,並且列出所有 type 紀錄
    $> dig @8.8.8.8 osslab.org.tw ANY
    
    type 可以設 ANY, A, MX, SIG, etc...
    
    // 顯示所有紀錄且以易讀格式內容輸出
    $> dig +multiline +noall +answer +nocmd cyberciti.biz ANY
    
    // 反解 IP
    $> dig -x 123.123.123.123
    $> dig +short -x 123.123.123.123
    
    // 批次讀取多個 domain name
    $> cat /path/to/lookup.txt
    
    +short www.google.com
    +short www.osslab.org.tw
    
    $> dig -f /path/to/lookup.txt
    
    // 追查解析路徑
    $dig +short +trace www.osslab.org.tw
    
    // 檢查 TTL
    $> dig +nocmd +noall +answer +ttlid A www.cyberciti.biz 
    
    變更 hostname,無需重啟主機

    以 RedHat/CentOS 為例)
    http://kbase.redhat.com/faq/docs/DOC-8646

    1. 編輯 /etc/sysconfig/network
      HOSTNAME=myhost.mydomain
    2. 編輯 /etc/hosts
      111.222.333.444     myhost.mydomain    myhost
    3. 執行指令 hostname
      # hostname myhost.mydomain
    4. 重啟 Network
      # service network restart

     

    如果按照上述的 SOP 仍是改不了目前的主機名稱,可能是其他地方有作設置,檢查下列的項目:

    • 檢查 /etc/sysconfig/networking/profiles/default
      這裡是透過 XWindows 網路設定產生的檔案
    • 檢查 /etc/sysctl.conf
      kernel.hostname=xxxx.xxxx.xxxx.xxxx
       

    Ubuntu/Debian)

    # vi /etc/hostname
    [my_host_name]
    
    # sudo /etc/init.d/hostname.sh start 
    

    其他 Linux)

    # sudo echo [my_host_name] > /proc/sys/kernel/hostname
    

    ↑GO TO TOP↑

    Linux 系統作燒機/壓力測試(stress test)的工具

    軟體名稱:stress-1.0.2

    RPM 安裝檔下載
    http://dag.wieers.com/rpm/packages/stress/

    使用方法

    stress --cpu 2 --io 4 --vm 1 --vm-bytes 128M --timeout 10s
    

    軟體名稱:SysBench
    官網:https://github.com/akopytov/sysbench

    其他更多工具:https://github.com/haydenjames/bench-scripts

     

    ↑GO TO TOP↑

    RedHat/CentOS 安裝時如何載入 Raid Card 驅動程式

    主機有 floppy 時,將下載的驅動程式磁碟片映像檔,使用 dd 指令寫入空白磁碟片,在使用安裝光碟開機後,輸入

    linux dd
    

    主機沒有 floppy 時,將下載的驅動程式磁碟片映像檔,上傳到 FTP/NFS/HTTP 主機,在使用安裝光碟開機後,輸入

    linux dd=ftp://ftp.server.domain/this/is/driver.img
    

    詳細教學:http://www.redhat.com/docs/manuals/e...DRIVERDISK-WHY

    CentOS 5 無法使用 4GB 以上 RAM

    CentOS 在 v5 以後版本,kernel 的套件作了些改變,如果要使用 4GB 以上 RAM,系統必須安裝有 kernel-PAE 套件檔,這個套件安裝後系統會新增一個可支援 4GB 以上 RAM 的 kernel,系統在重新開機後若使用這個 kernel 進行開機,系統就可以正常使用 4GB 以上 RAM 了。

    #> yum install kernel-PAE

    官網相關討論串  

    ↑GO TO TOP↑

    遠端桌面管理-VNC

    設定VNC作遠端連接時的桌面與本地端桌面為同一個,且每次重開機時自動生效。

    //檢查模組 vnc.so 是否存在
    shell>locate vnc.so

    //開機啟動圖形介面時自動載入 vnc.so
    shell>vi /etc/X11/XF86Config

    Section "Module"
            Load  "dbe"
            Load  "extmod"
            ...
            Load  "vnc"

    //設定 VNC 的連接認證
    shell>vi /etc/X11/XF86Config

    Section "Screen"
            ...
            Option "SecurityTypes" "VncAuth"
           Option "UserPasswdVerifier" "VncAuth"
           Option "PasswordFile" "/root/.vnc/passwd"
            ...

    // 修改啟動設定檔 xstartup
    $ vi ~/.vnc/xstartup

    使用 GNOME 為桌面時

    [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
    xsetroot -solid grey
    #vncconfig -iconic &
    xterm -geometry 80×24+10+10 -ls -title "$VNCDESKTOP Desktop" &
    #twm &
    gnome-session –sm-disable
    gnome-session
    

    使用 KDE 為桌面時

    [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
    xsetroot -solid grey
    #vncconfig -iconic &
    xterm -geometry 80×24+10+10 -ls -title "$VNCDESKTOP Desktop" &
    twm &
    startkde &
    

    //變更 VNC 密碼
    shell> vncpasswd /root/.vnc/passwd

    PS. 如果連接時不想作認證,可以修改為

    Section "Screen"
      ...
      Option "SecurityTypes" "None"
    EndSection
    

    ↑GO TO TOP↑

    RPM 套件管理

    // 查詢已安裝的套件的詳細資訊

    shell> rpm -qi <rpm_name>

    // 查詢已安裝套件是 32 或 64 bit

    shell> rpm -qa --qf "%{n}-%{v}-%{r}.%{arch}\n" | grep -i <package-name>

    // 查詢未安裝的套件資訊

    shell> rpm -qpi your.rpm
    shell> less your.rpm
    

    // 列出已安裝套件的相依性

    shell> rpm -q --requires <package-name>
    

    // 列出一個尚未安裝的 RPM 所包含的檔案列表

    shell> rpm -qlp your.rpm

    // 查詢檔案所屬的套件名稱

    shell> rpm -qf /usr/bin/ksh

    // 編譯 source rpm

    yum install rpm-build
    rpmbuild --rebuild something.src.rpm
    

    // 查詢 RPM Public Key

    rpm -q gpg-pubkey | sort | uniq -c | sort -nr
    

    // 建立 RPM 套件

    如何找出device名稱(/dev/sda)與LUN channel的對應列表?

    使用工具 sg_utils,下載位置  http://sg.torque.net/sg/sg3_utils.html

    執行指令 sg_map -i

    root@oradb2 ~]# sg_map -i
    /dev/sg0  /dev/sda  ServeRA   rootvg            V1.0
    /dev/sg1  /dev/sdb  ServeRA   datavg            V1.0
    /dev/sg2  IBM-ESXS  VPBA073C3ETS11 N  A2E8
    /dev/sg3  IBM-ESXS  VPBA073C3ETS11 N  A2E8
    /dev/sg4  IBM-ESXS  VSC7160           1.07
    /dev/sg5  /dev/sdd  i-Raid    gtnas02--VOL#01   R001
    /dev/sg6  /dev/sdc  i-Raid    x3650---VOL#00    R001
    /dev/sg7  /dev/nst0  HP        Ultrium 2-SCSI    F6AW
    /dev/sg8  HP        NS E1200-160      5929
     

      

    執行指令 sg_scan -i

     [root@oradb2 ~]# sg_scan -i
    /dev/sg0: scsi0 channel=0 id=0 lun=0 [em]
        ServeRA   rootvg            V1.0 [rmb=0 cmdq=1 pqual=0 pdev=0x0]
    /dev/sg1: scsi0 channel=0 id=1 lun=0 [em]
        ServeRA   datavg            V1.0 [rmb=0 cmdq=1 pqual=0 pdev=0x0]
    /dev/sg2: scsi0 channel=1 id=0 lun=0 [em]
        IBM-ESXS  VPBA073C3ETS11 N  A2E8 [rmb=0 cmdq=1 pqual=0 pdev=0x0]
    /dev/sg3: scsi0 channel=1 id=1 lun=0 [em]
        IBM-ESXS  VPBA073C3ETS11 N  A2E8 [rmb=0 cmdq=1 pqual=0 pdev=0x0]
    /dev/sg4: scsi0 channel=3 id=0 lun=0 [em]
        IBM-ESXS  VSC7160           1.07 [rmb=0 cmdq=0 pqual=0 pdev=0xd]
    /dev/sg5: scsi1 channel=0 id=0 lun=0
        i-Raid    gtnas02--VOL#01   R001 [rmb=0 cmdq=1 pqual=0 pdev=0x0]
    /dev/sg6: scsi1 channel=0 id=0 lun=1
        i-Raid    x3650---VOL#00    R001 [rmb=0 cmdq=1 pqual=0 pdev=0x0]
    /dev/sg7: scsi1 channel=0 id=1 lun=0
        HP        Ultrium 2-SCSI    F6AW [rmb=1 cmdq=0 pqual=0 pdev=0x1]
    /dev/sg8: scsi1 channel=0 id=1 lun=1
        HP        NS E1200-160      5929 [rmb=0 cmdq=0 pqual=0 pdev=0xc]

     

    ↑GO TO TOP↑

    Apache 網頁認證與  Windows Active Directory 整合

    在要作限制存取的網頁子目錄下,新增一個隱藏檔 .htaccess,內容如下:

    範例一

    AuthMySQLEnable off
    AuthType Basic
    AuthName "USE YOUR WINDOWS ACCOUNT"
    AuthLDAPURL "ldap://myad.mydomain.com.tw/ou=IT,dc=mydomain,dc=com,dc=tw?sAMAccountName?sub?(objectClass=*)"
    # Using this to bind
    AuthLDAPBindDN "CN=John,OU=IT,DC=mydomain,DC=com,DC=tw"
    AuthLDAPBindPassword "123456"
    # When checking for group membership, use the DN of the user, not the HTTP entry
    AuthLDAPGroupAttributeIsDN on
    
    #require valid-user
    #require user Bob
    require valid-user 

    註:
    myad.mydomain.com.tw ; AD 主機名稱
    mydomain.com.tw ; 網域名稱
    ou=IT ; 僅對 IT 單位以內的帳號作認證,若想對所有網域帳號作認證,可刪除這。
    AuthLDAPBindDN ; 設定一組存在的AD帳號作連結依據,尤其對那些有設定限制來賓連結的AD。
    AuthLDAPBindPassword ; 前面所提的帳號的密碼。

    範例二

    AuthMySQLEnable off
    
    AuthType Basic
    
    # What the users will see as a "title" of the login prompt:
    #AuthName "Domain Credentials Required"
    AuthName "Your Domain AD's account required"
    
    # use plain LDAP authentication:
    AuthzLDAPMethod ldap
    
    # FQDN resolvable hostname (or IP) of the Windows
    # AD domain controller:
    AuthzLDAPServer myad.mydomain.com.tw
    
    # Distinguished Name (DN) of the user that mod_authz_ldap should
    # bind to the LDAP server as when searching for the domain user
    # provided by the web client (Active Directory does not allow
    # anonymous binds).  Note, the cn attribute corresponds to the
    # "Display Name" field of a user's account in the Active Directory
    # Users and Computers tool, not their login username:
    AuthzLDAPBindDN "cn=John,ou=IT,dc=mydomain,dc=com,dc=tw"
    
    # the BindDN user's password:
    AuthzLDAPBindPassword "123456"
    
    # LDAP Attribute where the user's domain login username is stored in:
    AuthzLDAPUserKey sAMAccountName
    
    # Base DN to begin searching for users from in the LDAP:
    #AuthzLDAPUserBase "ou=TestOU,dc=mydomain,dc=com,dc=tw"
    AuthzLDAPUserBase "ou=IT,dc=mydomain,dc=com,dc=tw"
    
    # Search in sub-containers below the UserBase DN if
    # necessary (most likely):
    AuthzLDAPUserScope subtree
    
    # Require the username and password provided to be a valid
    # user in the AD:
    require valid-user
    
    # log verbosity level:
    AuthzLDAPLogLevel info 

    要取得 AD 帳號所對應的 LDAP 樹目錄帳號的連結,可以透過 LDAP Browser 這個免費工具(試用30天)。

    延伸閱讀:

    ↑GO TO TOP↑

    編譯安裝 MRTG 流量監控套件

    系統環境:CentOS 5.2

    下載套件:http://oss.oetiker.ch/mrtg/download.en.html

    編譯套件

    ./configure --prefix=/opt/mrtg-2.16.2 \
    --with-gd=/usr/include \
    --with-gd-lib=/usr/lib \
    --with-gd-inc=/usr/include \
    --with-png=/usr/include \
    --with-zlib=/usr/include 

    註:如果出現找不到 GD Library 的錯誤訊息,請安裝 gd-devel  套件

    #yum install gd-devel

    安裝套件

    make
    make install
    

    ↑GO TO TOP↑

    指令 grep 的強化版

    有擔任過 IBM AIX 系統管理員的人,在使用 Linux 的 grep 指令時,一定會不習慣,因為在 AIX 上的 grep 有個 -p 顯示段落的參數,但 Linux 的 grep 卻沒有這功能。這裡教你如何寫一個可顯示段落的 grep 替代指令。

    方法一:pgrep.sh

    reference to undefined name 'syntax' Exception of type 'MindTouch.Deki.Script.Runtime.DekiScriptUndefinedNameException' was thrown. (click for details)

    將它放在 /usr/local/bin,並且 chmod 0755 賦予可執行的權利。

    用法:
    pgrep.sh <file.name> <filter.string>
    cat <file.name> | pgrep.sh - <filter.string>

    另一個選擇,用 perl 也辦得到喔

    cat <file.name> | perl -00 -ne 'print if /<filter.string>/'

    方法二:pgrep.awk

    reference to undefined name 'syntax' Exception of type 'MindTouch.Deki.Script.Runtime.DekiScriptUndefinedNameException' was thrown. (click for details)

    使用方法

    chmod 0755 pgrep.awk
    mv pgrep.awk /usr/local/bin
    cat test.txt | pgrep.awk <keyword> 
    

     

    ↑GO TO TOP↑

    關於 Joomla 1.5.x 網站被駭後所做的因應措施
    1. 升級 Joomla 至最新版。
    2. 關閉 php 參數 allow_url_fopen。

    相關連結:

    解開 RPM內的檔案,但不作安裝

    rpm2cpio xxx.rpm | cpio -idmv

    關閉  USB 儲存裝置的連接但不能影響 USB 鍵盤/滑鼠  

    modprobe -r usb_storage

    vi /etc/modprobe.conf

    alias usb_storage off
    

    ↑GO TO TOP↑

    NFS 進階技巧

    執行 umount 遇到 device is busy,但又不能重開機,該怎辦?

    //檢查那些程序及用戶使用該目錄

    fuser -m -v <mount_point>
    lsof | grep <mount_point>
    

    //刪除無效的程序

    fuser -i -k <mount_point>
    

    //以上都無效,可重啟 NFS Client daemon,但其他 NFS 目錄也會被迫中斷。

    service netfs stop
    service netfs start
    

    // 網友提供的另一個方法

    umount -l <mount_point>
    

    如何檢查哪些 Client 有掛載 NFS 目錄

    netstat -an | grep <nfs-server-ip>:2049 
    
    預設 NFS Port 是 2049,可以使用 netstat -lt 確認
    

    Can't mount remotely Linux host on AIX

    Q: Can't mount remotely Linux host on AIX ????

    A: To run the following commands on your AIX.

    nfso -o nfs_use_reserved_ports=1
    nfso -o portcheck=1
    

    If the configuration would be enabled automatically on system RESTART, edit the file /etc/rc.nfs , and to add above commands in the bottom.

    ↑GO TO TOP↑

    如何使用 patch/diff 指令

    更多教學:http://linux.chinaitlab.com/administer/811248.html
    單一個檔案時)

    //建立更新檔
    #diff -uN old.code new.code > patch.file
    //套用更新檔
    #patch < patch.file
    //回復更新前
    #patch -RE < patch.file
    

    連續多個檔案時)

    //建立更新檔
    #diff -rupN olddir newdir > patch.dir
    //套用更新檔
    #patch -p1 < patch.dir
    //回復更新前
    #patch -RE -p1 < patch.dir
    

    找出兩個目錄的所有原始檔 .c 內容不一致的檔案

    目錄一: asterisk_orig/
    目錄二: asterisk_patched/
    
    $ cd asterisk_orig; find ./ -name "*.c" -exec md5sum -b {} \; > ../asterisk_orig.md5; cd ../
    $ cd asterisk_patched; find ./ -name "*.c" -exec md5sum -b {} \; > ../asterisk_patched.md5; cd ../
    
    $ diff asterisk_orig.md5 asterisk_patched.md5 
    
    273c273
    < 894a111d1efa5901471820e203503039 *./channels/chan_sip.c
    ---
    > 00116baac23473049b5801c9287fb4be *./channels/chan_sip.c
    

    TIPs

    前提是 asterisk_orig 與 asterisk_patched 目錄架構及檔案名稱必須完全一樣,這通常用來找出 asterisk_patched 目錄內被更新過了哪些 .c 檔案。

    編輯器 VI 必學招

    Notes: 指令輸入注意大小寫的不同,輸入大寫的英文是用 shift + 英文字。

     命令執行(注意大小寫不同)  使用說明  使用技巧
     i 以插入字元方式進入編輯模式 與 a 同為進入編輯模式,兩者差別只有游標的起始位置不同
     a 以附加字元方式進入編輯模式  
     h j k l 操控游標的移動,h--向左, j--向下, k--向上, l--向右 當遇到部份作業系統不支援方向鍵使用時,可用此方式代替
     :1 游標移到第一行  
     :22 游標移到第22行 作程式除錯找特定行列時會用到
     gg 游標移至檔首   
     G 游標移至檔尾 編輯大檔案時要移到檔尾不用一頁一頁捲
     0 游標移至行首  
     $ 游標移至行尾  
     :wq 存檔後離開   
     :w new.txt 另存新檔成 new.txt  
     :w !sudo tee % 以 sudo 模式存檔 如果存檔時遇到權限不足,且有 sudo 的權限時的方法
     :q! 不存檔離開  如不小心編錯內容,只要沒存檔前就可以用此法離開,保存原始內容
     :set nu 顯示行號  作程式除錯時必用 
     :set nonu 取消行號顯示  
     :set hlsearch  Highlight 搜尋的關鍵字 有些系統預設已經啟用
     dd 刪除目前這一行  
     10dd 刪除目前以下10行(含本列)  
     yy 複製目前這一行  
     3yy 複製目前以下3行(含本列)  
     p 貼上  
     :%s/old/new/g 內容包含有old字元的都會取代成new字元   
    :/<table>/,/<\/table>/g/^$/d 包含 <table> ... </table> 的內容刪除  
     /keyword 搜尋文字  
     /\KeyWord 搜尋文字(不分大小寫)  
     /\s\+$ 搜尋行尾的空格字元並 Highlight 這可以配合 :set hlsearch 使用
     ~ 大小寫互換  
     :%s/[ctrl+V and ctrl+M]//g 消除斷行符號 ^M  
     :%s/\s\+$// 移除所有行尾的空格字元  
     :! ls -l 執行外部 SHELL 指令  :!! 上一個指令
     :vsplit my.file 左右分割視窗且左邊載入 my.file  ctrl + w + w 切換視窗
     :split my.file 上下分割視窗 ctrl + w + w 切換視窗

     

    比對兩個檔案內容

    vim -d file1 file2
    

    啟用 VI Highlight Color

    #> yum install vim-enhanced
    
    NOTE:必須使用 vim 才會有顏色顯示;vi 不支援顏色
    

    Putty 顏色設定優化

    ANSI Blue:         Red:74 Green:74 Blue:255
    ANSI Blue Bold: Red:140: Green:140 Blue:255 
    

    FAQ:

    Q: 錯誤訊息:A line cannot be longer than 2048 characters.
    A: 這是因為 VI 的每一行字數不可超過 2048 字元,遇到時可以將超過字數的行刪除,另存一個檔。

    cut -c1-2047 before.log > after.log
    


    ↑GO TO TOP↑ 

    比 top 還好用的工具 - htop

    下載位置 http://dag.wieers.com/rpm/packages/htop/
    官方網站 http://htop.sourceforge.net/

    畫面預覽

    htop.png 

    指令 dd 的用法
    // 備份MBR
    dd if=/dev/hdx of=/path/to/image count=1 bs=512
    
    // 光碟轉成 iso 檔
    dd if=dev/cdrom of=/root/cd.iso
    
    // 銷毀硬碟資料
    dd if=/dev/urandom of=/dev/hda1
    
    // 備份整個 USB-Flash
    dd if=/dev/sdb | gzip > ./my-usb_flash.img.gz
    
    //還原 USB-Flash
    gzip -dc ./my-usb_flash.img.gz | dd of=/dev/sdb
    
    // 建立一個測試用的大檔案10GB
    dd if=/dev/zero of=/path/to/image bs=1G count=10
    NOTE: 新版 Linux 可以改用指令
    fallocate -l 1G test.img 
    

    ↑GO TO TOP↑

    ps 指令

    以 PID 查詢

    ps -fp <PID>
    ps -fp <PID#1>,<PID#2>,<PID#3> 
    

    分析CPU/Memory使用

    // CPU 使用率最高前10排名

    // for CentOS
    ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -11
    
    //
    ps aux | head -1; ps aux | sort -rn +2 | head -10
    or
    ps aux | head -1; ps aux | sort -rn -k 3 | head -10

    // Memory 使用率最高前10排名

    // for CentOS
    ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -11
    
    ps aux | head -1; ps aux | sort -rn +3 | head
    or
    ps aux | head -1; ps aux | sort -rn -k 4 | head
    
    ps -eo cmd,pid,ppid,%mem,%cpu --sort=-%mem | head -n 6
    

    // 優先權最高的程序

    ps -eakl | sort -n +6 | head
    or
    ps -eal | sort -n -k 7 | head

    // 程序以 nice 值排序

    ps -eakl | sort -n +7
    or
    ps -eal | sort -n -k 8

    // 程序以執行時間排序

    ps vx | head -1;ps vx | grep -v PID | sort -rn +3 | head -10
    or
    ps vx | head -1;ps vx | grep -v PID | sort -rn -k 4 | head -10

    // 程序以 I/O 排序

    ps vx | head -1; ps vx | grep -v PID | sort -rn +4 | head -10
    or
    ps vx | head -1; ps vx | grep -v PID | sort -rn -k 5 | head -10

    // 等待中的程序

    ps vg | head -1; ps vg | grep -w wait

    // 指定 PID 的啟動時間與總執行時間

    ps -p <PID> -o etime,start
    
    指令 ls 技巧

    列出目錄名稱

    ls -l | grep ^d
    
    ls -d */
    

    列出特定規則檔名

    ls myfile[1,3,5,7,9]
    
    ls myfile[1-9]
    

    ↑GO TO TOP↑

    Powered by MindTouch Core