Memo/Linux

http://dexlab.net/pukiwiki/index.php?Memo%2FLinux
 

Linux


ファイルやディレクトリのデフォルトアクセス権

  • umask
    • 002: ファイル作成時: 664, ディレクトリ作成時: 775
    • 022: ファイル作成時: 644, ディレクトリ作成時: 755
  • CentOS 7: 「UIDが200以上かつ、ユーザ名とプライマリーグループ名が同じ場合」「002」, それ以外は「022」
    1. cat /etc/profile
    2. ...
    3. if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    4.     umask 002
    5. else
    6.     umask 022
    7. fi
  • ユーザ毎にumaskを設定したい場合
    1. echo "umask 022" >> ~/.bashrc

DB用ダミーデータ作成


last: ログインユーザ/reboot/shutdownした日時の表示

  • /var/log/wtmp を見ている
  • ログインしたユーザをフルネーム(-w)で表示
    1. last -w
    2. user01 pts/1        192.168.61.1     Tue Nov 28 14:27   still logged in
    3. user01 pts/0        192.168.61.1     Tue Nov 28 11:55   still logged in
    4. reboot   system boot  3.10.0-693.2.2.el7.x86_64 Tue Nov 28 11:54 - 16:24  (04:29)
    5. user01 pts/1        192.168.61.1     Mon Nov 27 17:40 - 19:28  (01:48)
    6. user01 pts/0        192.168.61.1     Mon Nov 27 11:07 - 19:43  (08:36)
    7. ...
  • rebootした日時を表示
    1. last reboot
    2. reboot   system boot  3.10.0-693.2.2.e Tue Nov 28 11:54 - 16:13  (04:19)
    3. ...
    4. reboot   system boot  3.10.0-229.el7.x Thu Oct  1 01:58 - 02:03  (00:04)
  • shutdownした日時も表示
    1. last -x
    2. ...
    3. runlevel (to lvl 3)   3.10.0-229.el7.x Thu Oct  1 02:03 - 18:24  (-7:-38)
    4. reboot   system boot  3.10.0-229.el7.x Thu Oct  1 02:03 - 18:24  (-7:-38)
    5. shutdown system down  3.10.0-229.el7.x Thu Oct  1 02:03 - 02:03  (00:00)

NIC情報/リンク速度の確認

転送速度が遅い場合、NIC、LANケーブル、ソフトのどこに問題があるのか調査する。

  • ethtool
    1. # CentOS7
    2. sudo yum install ethtool
    3.  
    4. # Ubuntu
    5. sudo aptitude install ethtool
    6.  
    7. # Speed: リンク速度
    8. ethtool enp8s0
    9.  
    10. Settings for enp8s0:
    11.         Supported ports: [ TP ]
    12.         Supported link modes:   10baseT/Half 10baseT/Full
    13.                                 100baseT/Half 100baseT/Full
    14.                                 1000baseT/Half 1000baseT/Full
    15.         Supported pause frame use: No
    16.         Supports auto-negotiation: Yes
    17.         Advertised link modes:  10baseT/Half 10baseT/Full
    18.                                 100baseT/Half 100baseT/Full
    19.                                 1000baseT/Half 1000baseT/Full
    20.         Advertised pause frame use: No
    21.         Advertised auto-negotiation: No
    22.         Speed: 1000Mb/s
    23.         Duplex: Full
    24.         Port: Twisted Pair
    25.         PHYAD: 0
    26.         Transceiver: internal
    27.         Auto-negotiation: on
    28.         MDI-X: Unknown
    29. Cannot get wake-on-lan settings: Operation not permitted
    30.         Current message level: 0x000000ff (255)
    31.                                drv probe link timer ifdown ifup rx_err tx_err
    32.         Link detected: yes
    33.  
    34. # ドライバ表示
    35. ethtool -i enp8s0
    36. driver: sky2
    37. version: 1.30
    38. firmware-version:
    39. expansion-rom-version:
    40. bus-info: 0000:08:00.0
    41. supports-statistics: yes
    42. supports-test: no
    43. supports-eeprom-access: yes
    44. supports-register-dump: yes
  • ethtoolが使えない場合
    1. # CentOS7
    2. dmesg | grep -i "Link is up"
    3. [   40.388458] sky2 0000:08:00.0 enp8s0: Link is up at 1000 Mbps, full duplex, flow control both
  • lspci
    1. sudo lspci | grep -i Ether
    2. 08:00.0 Ethernet controller: Marvell Technology Group Ltd. 88E8055 PCI-E Gigabit Ethernet Controller (rev 14)

safe-rm: ブラックリスト式rm

誤って重要なファイルをrmしないようにする


daemon


バイナリファイルが32/64bitを区別する

  • 例:bashの場合
    1. file /bin/bash
    2. /bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

~/.ccacheの削除

  1. ccache -C -z

swapを使っているプロセスを探す

  • CentOS 6.x
  • swapを使っているプロセスの上位10件
    1. grep VmSwap /proc/*/status | sort -k 2 -r | head -n 10
    2.  
    3. /proc/1337/status:VmSwap:            848 kB
    4. /proc/1357/status:VmSwap:            840 kB
    5. /proc/1035/status:VmSwap:            676 kB
    6. ...
    7.  
    8. # pidからコマンドや引数名を得る
    9. grep VmSwap /proc/*/status | sort -k 2 -r | head -n 10 | cut -d/ -f 3 | xargs -i ps -o pid,comm,args h {}
    10.  1337 master          /usr/libexec/postfix/master
    11.  1357 qmgr            qmgr -l -t fifo -u
    12.  1035 rsyslogd        /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
    13. ...

パッケージ更新後に再起動が必要なプロセスを探す


sudo時の補完を有効にする

  1. echo "complete -cf sudo" >> ~/.bashrc

/etc/passwdからユーザ情報(HOME/SHELL等)の取得

  • getentを使う
    1. getent passwd postfix
    2. postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    3.  
    4. # HOMEの取得
    5. getent passwd postfix | cut -f6 -d:
    6. /var/spool/postfix
    7.  
    8. # SHELLの取得
    9. getent passwd postfix | cut -f7 -d:
    10. /sbin/nologin
  • user, groupは「id」コマンドが便利

ドットから始まるファイルをコピー/移動

通常「cp src/* dest/」としても、ドットから始まるファイル/ディレクトリは対象外になる

  • ドットから始まるファイル/ディレクトリを含める
    1. # 有効化
    2. shopt -s dotglob
    3.  
    4. # 無効化
    5. shopt -u dotglob

プロセス毎のUSS,PSS,RSSを確認

  • プロセス毎のメモリ
    • VSS(VSZ): 仮想メモリの使用量
    • RSS: 物理メモリの使用量(共有メモリの使用量を含める) 多数のプロセスで共有メモリをシェアしている場合、RSSの合計は物理メモリを超えてしまう。
    • PSS: 物理メモリの使用量(共有メモリの使用量をプロセス間で等分する)
    • USS: 物理メモリの使用量(共有メモリの使用量を除く)
  • 例:psコマンドでのpostgresqlのRSSの合計値
    1. ps -eo comm,user:32,rss h | grep -P "postmaster\s+postgres\s+" | awk '{sum+=$3} END {print sum}'
    2. 15832 # KB
  • /proc/ファイルからPSSを合計
    1. pgrep -U postgres postmaster | xargs -i sudo grep -i pss /proc/{}/smaps | awk '{sum+=$2}  END {print sum}'
    2. 5483 # kB
  • pmap: 3.2.8ではPSSは表示されなかった
    1. pmap --version
    2. pmap (procps version 3.2.8)
    3.  
    4. sudo pmap -x 13025
    5.  
    6. 13025:   /usr/bin/postmaster -p 5432 -D /var/lib/pgsql/data
    7. Address           Kbytes     RSS   Dirty Mode   Mapping
    8. 0000000000400000    4492     816       0 r-x--  postgres
    9. ...
    10. ----------------  ------  ------  ------
    11. total kB          220728    6688    3300
  • smem memory reporting tool
    • 単位: KB
    • 合計: -t
    • ヘッダ行無し: -H
      1. sudo yum install smem --enablerepo=epel
      2.  
      3. sudo smem -P postmaster -U postgres -t
      4.   PID User     Command                         Swap      USS      PSS      RSS
      5. 13031 postgres postgres: logger process           0      140      309     1548 
      6. 13036 postgres postgres: wal writer proces        0      152      338     1732 
      7. 13038 postgres postgres: stats collector p        0      184      377     1780 
      8. 13035 postgres postgres: writer process           0      172      474     2004 
      9. 13037 postgres postgres: autovacuum launch        0      276      519     2080 
      10. 13025 postgres /usr/bin/postmaster -p 5432        0     2804     3483     6688 
      11. -------------------------------------------------------------------------------
      12.     6 1                                           0     3728     5500    15832

initスクリプト/プロセスのデーモン化

  • RedHat?/CentOS
    • /etc/init.d/functions に定義している関数「daemon」「killproc」「status」を使うと綺麗に表示できる
    • daemonはバックグラウンドには回してくれないので「&」を使う。pidfileの生成も自分で行う。
    • 「less /usr/share/doc/initscripts-9.49.39/sysvinitfiles」にもサンプルがある

GNU parallel コマンドの並列実行


ディレクトリ移動時にワイルドカードを使う

  • 以下のようなディレクトリ構成
    1. LANG=C ll /usr/share/doc/ | grep zabbix
    2. drwxr-xr-x  2 root root 4096 Dec  9 18:09 zabbix-agent-3.0.5
    3. drwxr-xr-x  2 root root 4096 Dec  9 18:09 zabbix-get-3.0.5
    4. drwxr-xr-x  2 root root 4096 Dec  9 18:10 zabbix-sender-3.0.5
    5. drwxr-xr-x  2 root root 4096 Dec  9 18:09 zabbix-server-mysql-3.0.5
    6. drwxr-xr-x  2 root root 4096 Dec  9 18:09 zabbix-web-3.0.5
  • zabbix-server-mysql-3.0.5 に移動したいが、プログラム中にはバージョン番号を入れたくない場合、ワイルドカードが使える
    1. cd /usr/share/doc/zabbix-*-mysql*
    2.  
    3. pwd
    4. /usr/share/doc/zabbix-server-mysql-3.0.5

rmコマンドでゴミ箱に入れる

"rm -rf /" や "rm .*" 等の事故を防ぎたい。

  • ファイル/ディレクトリを直接削除するのではなく一度ごみ箱「~/.Trash/」に入れるようにする
  • ゴミ箱中の同名ファイル/ディレクトリはファイル名末尾に「.~1~」のように番号が付く
  • 30日より前のファイルは削除
  • aliasではないrmを実行したい場合は「\rm」のようにする
    • CentOS 6.x:
      1. echo "alias rm='mkdir -p ~/.Trash/;touch ~/.Trash/.dummy;find ~/.Trash/ -type f -mtime +30 -delete -o -empty -type d -delete;mv -f --backup=numbered --target-directory ~/.Trash/'" >> ~/.bashrc
      2. source ~/.bashrc

NetworkManager?

/etc/resolv.confの自動書き換え停止するために、NetworkManager?を止めていたが割と便利そう


ディレクトリ構造を維持してコピー

  1. cp --parents /etc/hosts /tmp/
  2.  
  3. tree /tmp/etc/
  4. /tmp/etc/
  5. └── hosts

sshdの設定を確認する

  • 現在の設定を確認
    1. sudo sshd -T | sort
  • 任意の設定ファイルを指定してテスト
    1. sudo sshd -T -f ./sshd_config

2つのテキストファイルの共通行だけ抽出

  1. cat file1
  2. aaa
  3. bbb
  4.  
  5. cat file2
  6. bbb
  7. ccc
  8.  
  9. grep -x -i -f file1 file2
  10. bbb

vuls: CVE脆弱性チェックツール

vuls/README.ja.md at master · future-architect/vuls


abrtd:コアダンプした時にiowaitが高くなる/コアダンプファイルが消える

CentOS6/7だと abrtd が起動しており、設定によってはコアダンプした後にすぐ消すようだ。
コアダンプ対象のプロセスのメモリ使用量が大きいと、数GBのファイルを作った後に消すという無駄な処理のため、iowaitが高くなる場合がある。

  • 不要な場合は停止
    1. for srv in abrtd abrt-ccpp abrt-oops abrt-pstoreoops abrt-vmcore abrt-xorg abrt-dbus;do sudo service $srv stop;sudo chkconfig $srv off; done

先頭行/任意の行に追加

  • "1i" で1行目を指定して追加する。
    1. echo -e "1:foo\n2:var" >> tmp.txt
    2. sed -i -e "1i 1:hoge" tmp.txt
    3. cat tmp.txt
    4. 1:hoge
    5. 1:foo
    6. 2:var

rename: ファイル名の一括変更

  • 「*.htm」のファイルを「.htm」から「.html」に名前を変更する
    1. rename .htm .html *.htm

デバイスのUUIDを調べる

HDD入れ替え等でfstabを書く際に、デバイスの接続順が変わっても、明示的にドライブを指定できる。

  • blkidを使う
    1. sudo blkid
    2. /dev/sda1: UUID="b599d616-e521-449f-89a0-7f838614bc56" TYPE="ext2"
    3. /dev/sda5: UUID="HOiXD0-6j1h-Q3up-Et62-fvHk-mPIr-Ynglet" TYPE="LVM2_member"
    4. /dev/mapper/mediacenter-root: UUID="e0aeadc6-742f-42b4-b0e4-de4ecd6f5abd" TYPE="ext4"
    5. /dev/mapper/mediacenter-swap_1: UUID="9874055b-0ddc-4910-a319-fc3c1e20ab81" TYPE="swap"
    6.  
    7. # デバイスを指定して調べる
    8. sudo blkid /dev/sda1
    9. /dev/sda1: UUID="b599d616-e521-449f-89a0-7f838614bc56" TYPE="ext2"
  • 例:/etc/fstab (Ubuntu 12.04 LTS)
    1. proc            /proc           proc    nodev,noexec,nosuid 0       0
    2. UUID=e0aeadc6-742f-42b4-b0e4-de4ecd6f5abd /               ext4    errors=remount-ro 0       1
    3. UUID=b599d616-e521-449f-89a0-7f838614bc56 /boot           ext2    defaults        0       2
    4. UUID=9874055b-0ddc-4910-a319-fc3c1e20ab81 none            swap    sw              0       0

ユーザをサブグループに追加

  • user01をwheelグループへ追加。usermod の場合、'a'が無いとプライマリグループの変更になる。
    1. sudo gpasswd -a user01 wheel
    2. # または
    3. sudo usermod -aG wheel user01
    4.  
    5. id user01
    6. uid=501(user01) gid=501(user01) groups=501(user01),10(wheel)
  • 「/etc/group-」は1世代前のバックアップなので間違ってusermod -Gした場合は復元できる。
  • user01をwheelグループから削除
    1. sudo gpasswd -d user01 wheel

/etc/fstabの構文チェック

  1. sudo mount -fav

Linuxコマンドの色付け


ポート解放確認

  • ncを使う
    • CentOS 6.x: 「-w 3」で3秒でタイムアウト
      1. nc -zv -w 3 www.example.com 80;echo $?
      2. Connection to www.example.com 80 port [tcp/http] succeeded!
      3. 0
    • CentOS 7: ncがncat(nmap-ncat package)のエイリアスに変わったため、「-z」オプションが使えなくなった
      1. timeout 1 bash -c 'cat < /dev/null > /dev/tcp/www.example.com/80';echo $?
      2. # 正常の場合:0 / 異常(timeout)の場合:124
    • -u: udpのチェックは不正確で全て「succeeded」になるため使わない方が良い
  • サーバ側のListenも可能: 例:tcp/10080
    1. # 1回リクエストがあると終了する
    2. nc -l 10080
    3.  
    4. # -k: 接続を継続する
    5. nc -l 10080 -k

プロセス監視と自動再起動

  • cron等で一定時間の監視を行い、落ちていたら再起動するスクリプト

ネットワーク帯域制限


peco : 標準入力からの行をインクリメンタルサーチ

標準入力の行をCUIでインクリメンタルサーチし、選択した行を標準出力に返すコマンド

  • ターミナルの改行コードをCR+LFにする必要があった。Poderosa+改行コードLFだと、Enter押しても選択されない
  • CentOS6.x
    1. wget -O peco_linux_amd64.tar.gz https://github.com/peco/peco/releases/download/v0.3.2/peco_linux_amd64.tar.gz
    2. sudo tar xvfz peco_linux_amd64.tar.gz
    3. sudo mv peco_linux_amd64/peco /usr/local/bin/
    4. sudo chmod 755 /usr/local/bin/peco
  • 例: lsの中から選択
    1. ls | peco

パスワード有効期限の設定

  • 現在の設定を確認
    1. chage -l <username>
  • 90日にしたい場合
    1. sudo chage -M 90 <username>
  • 有効期限設定の解除
    1. sudo chage -I -1 -m 0 -M 99999 -E -1 <username>

sudoした時に環境変数が変わらない場合

sudo -u した場合、OSのバージョンによってユーザの環境変数が変わらない部分がある

  • CentOS 5.8の場合
    1. sudo -u zabbixsrv env | grep HOME
    2. HOME=/root
  • CentOS 6.3の場合
    1. sudo -u zabbixsrv env | grep HOME
    2. HOME=/var/lib/zabbixsrv
  • CentOS5でもユーザのHOMEになるように修正
    1. sudo visudo
    2. ----
    3. Defaults    always_set_home
    4. ----

core dump コアダンプを出力

  • CentOS6.xの場合デフォルトではcoreファイルは出力されない
    1. ulimit -a | grep core
    2. core file size          (blocks, -c) 0
  • プロセス毎のlimitsを確認
    1. sudo cat /proc/$(pidof mysqld)/limits
  • 一時的に有効にする場合。ユーザ/セッション毎なのでログアウトしたら元に戻る
    1. # 1GB
    2. ulimit -c 1000000
    3. # 無制限
    4. ulimit -c unlimited
  • coreファイルの出力場所。デフォルトでは /core
    1. cat /proc/sys/kernel/core_pattern
    2. core
    3.  
    4. # 例:/tmp/core
    5. echo /tmp/core > /proc/sys/kernel/core_pattern
    6.  
    7. # 例:/tmp/core.<%e:実行ファイル名>.<%p:PID>.<%u:UID>
    8. echo /tmp/core.%e.%p.%u > /proc/sys/kernel/core_pattern
  • デーモン含め、恒久的に有効にする場合
    1. vim /etc/security/limits.conf
    2. ----
    3. *               soft    core            unlimited
    4. ----
    5.  
    6. echo -e "kernel.core_pattern = /tmp/core.%e.%p.%u\nfs.suid_dumpable = 2" >> /etc/sysctl.conf
    7. echo "DAEMON_COREFILE_LIMIT=unlimited" >> /etc/sysconfig/init
    8.  
    9. sysctl -p
    10.  
    11. # daemonの再起動またはホストの再起動
    12. service <daemon> restart

nscd: DNSキャッシュ

  • nscdが動作している場合、/etc/nsswitch.conf を変更しても設定が変わらない。その場合、nscdを再起動してみる。

timeout: コマンドを指定秒数でタイムアウトさせる

  • 指定秒数でタイムアウトさせたいが、コマンド自体にはオプションが無い場合に使える
  • CentOS6のcoreutils-8.4-19.el6.x86_64にはデフォルトで入っている
  • CentOS5のcoreutils-5.97-34.el5_8.1には入っていないので、bashスクリプトで代用
    1. cp /usr/share/doc/bash-3.2/scripts/timeout /usr/local/bin/
    2. chmod 755 /usr/local/bin/timeout    
  • tailコマンドを3秒間実行
    1. sudo timeout 3 tail -f /var/log/messages
  • timeoutする場合、exit code:124を返す
    1. timeout 1 sleep 5;echo $?
    2. 124

ホスト名の変更

  • CentOS6.x で検証
    • /etc/hosts に書く場合、FQDNを先に書く必要がある。そうしないとhostname -fでFQDNが取得できない
  • 例:web01.example.com に変えたい場合
    • /etc/resolv.conf: 自動生成されるので変更不要
      1. search example.com localdomain
      2. nameserver 192.168.61.2
    • /etc/sysconfig/network
      1. NETWORKING=yes
      2. HOSTNAME=web01.example.com
  • /etc/hosts : <FQDN> <HOSTNAME> の順に書く
    1. 127.0.0.1   web01.example.com web01 localhost localhost.localdomain localhost4 localhost4.localdomain4
    • hostname
      1. hostname -f
      2. web01.example.com
      3.  
      4. hostname -s
      5. web01
      6.  
      7. hostname
      8. web01.example.com
  • /etc/hosts: <hostname> <FQDN>の順に書くと hostname -f でFQDNが取得できない
    1. 127.0.0.1   web01 web01.example.com localhost localhost.localdomain localhost4 localhost4.localdomain4
    • hostname
      1. hostname -f
      2. web01
      3.  
      4. hostname -s
      5. web01
      6.  
      7. hostname
      8. web01.example.com

タイムゾーンの変更

  • CentOS6.x, UTC => JSTに変更する場合
    • crondの再起動が必要
    • /etc/localtimeを更新するコマンドがあるので使う
      • CentOS6は tzdata-update コマンド
      • CentOS7は tzdata-update コマンド
        1. sudo vi /etc/sysconfig/clock
        2. ----
        3. ZONE="Asia/Tokyo"
        4. UTC=false
        5. ----
        6.  
        7. # CentOS7
        8. sudo timedatectl set-timezone Asia/Tokyo
        9.  
        10. # CentOS6
        11. sudo /usr/sbin/tzdata-update
        12.  
        13. # crond再起動
        14. sudo service crond restart

HDDの修復


巨大なダミーファイルを作成する

  • バイナリ: 100MBのファイルを作成
    1. head -c 100m /dev/urandom > 100m.dummy

ログインシェルなしのユーザで、コマンドを実行

  1. less /etc/passwd | grep apache
  2. apache:x:48:48:Apache:/var/www:/sbin/nologin
  3.  
  4. sudo su - apache --shell=/bin/bash --command="pwd"
  5. /var/www

16進数ダンプ

  • odを使う
    1. echo Hello | od -tx1c
    2.  
    3. 0000000  48  65  6c  6c  6f  0a
    4.           H   e   l   l   o  \n

pkill:名前を指定してプロセスをkill

pgrepで探したプロセスをkillするのに使える。
CentOS7だとプロセスのオプション表示に「-a」が必要

  • 例:mysql用のトンネルsshを削除。「13306:」を含んだプロセスをkill
    1. ssh -fNg -L 13306:mysql.example.com:3306 gw.example.com
    2.  
    3. pgrep -u $USER -l -f 13306
    4. 2225 ssh -fNg -L 13306:127.0.0.1:3306 127.0.0.1
    5.  
    6. pkill -u $USER -f 13306:
    7.  
    8. # シグナルを指定: -15 (SIGKILL)、-9 (SIGTERM) -9はDBやLDAP等のデータストアに対して通常は実行しない。データが失われる可能性がある
    9. pkill -9 -f <process name>

md5deepでファイルのベリファイ

ファイルのmd5ハッシュをとってリスト化し、比較してくれるツール

  • ハッシュの作成には、SATA接続HDDの1.1TBのデータに対して、約13時間かかった
  • ハッシュリスト作成時エラー。標準出力に出る
    • No such file or directory
  • UTF-8のファイルを比較した時、いくつかmd5が事なる場合があった。しかし、異なった結果になったファイルを「md5sum filename」で比較すると同じだった。
  • CentOS5.x, 6.x
    1. sudo yum install md5deep --enablerepo=epel
  • Ubuntu 12.04 LTS
    1. sudo aptitude install md5deep
  • コピー元のハッシュリスト作成
    1. nohup md5deep -r /mnt/disk1/SRC-DIR > SRC-DIR.$(date +%Y%m%d).list &
  • ハッシュリストとコピ−先を比較。差が無ければ何も出力されない。
    1. md5deep -X SRC-DIR.list -r /mnt/disk2/DEST-DIR

ext3/4でフォーマットする時に5%がroot用に予約される

特にオプションをつけずにmkfs.ext3/4等でフォーマットすると 5%がroot向けに予約されるようだ。(2TBなら100GB、3TBなら150GB)
データ用ドライブなら不要だと思う。
また大きいファイルだけを扱うならば、「-T largefile」とするとi-nodeが少なくなり、フォーマットの時間が短くなる。

  • ext4でフォーマット, 予約領域:0%, 大きいファイルだけ扱う場合
    1. sudo mkfs.ext4 /dev/sdb1 -m 0 -T largefile

iowaitの高いプロセスを調べる

  • どのドライブの使用率が高いのかがわかる
    • r/s: 秒間の読み込み回数
    • w/s: 秒間の書き込み回数
    • avgrq-sz: 平均 I/O サイズ
    • avgqu-sz: 平均待ち行列長
    • await: レスポンスタイム。I/O を実施していない待ち時間を含む
    • svctm: サービスタイム。1回のI/Oに要する時間(ミリ秒)
    • %util: 使用率(ビジー率)
      1. iostat -x 5
      2.  
      3. # iowaitが44%と高く、sdbの%utilが異常に高い
      4. avg-cpu:  %user   %nice %system %iowait  %steal   %idle
      5.            1.00    0.00    3.50   44.36    0.00   51.15
      6.  
      7. Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
      8. sda               0.00    80.40    0.20   47.60     0.80   512.00    21.46     0.11    2.27   12.00    2.23   0.50   2.40
      9. dm-0              0.00     0.00    0.20  128.00     0.80   512.00     8.00     1.03    8.01   13.00    8.00   0.19   2.44
      10. dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
      11. sdb              39.40     0.00   48.80    0.00  6364.80     0.00   260.85     1.48   29.23   29.23    0.00  18.31  89.36
  • iotopを使う
    1. sudo yum install iotop
    2. iotop -d 5
  • dstatを使う(kernel 2.6.20以上)
    1. sudo yum install dstat
    2. sudo dstat --time --top-io

プロセスの起動/経過時間の取得

  • pgrepを使う: ユーザやプロセス名を指定しできる。CentOS7だとプロセスのオプション表示に「-a」が必要
    1. pgrep -u nginx | xargs -i ps -o lstart h {}
    2. Fri Mar  3 12:34:25 2017
  • psコマンドを使う
    • lstart: プロセスの起動時間
    • etime: プロセス起動からの経過時間。[[dd-]hh:]mm:ss
      1. ps -eo pid,ppid,lstart,etime,cmd h
      2. ...
      3.  1303     1 Thu May 29 09:52:18 2014    06:04:05 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
      4.  1339     1 Thu May 29 09:52:20 2014    06:04:03 /usr/sbin/sshd
      5. ...
  • etimeを秒に変換。例: crond
    1. # psの結果
    2. ps -eo comm,user:32,etime,args h | grep -P "^crond\s+root"
    3. crond           root                                01:50:19 crond
    4.  
    5. # 秒に変換
    6. ps -eo comm,user:32,etime,args h | grep -P "^crond\s+root" | perl -ane '@t=reverse split(/[:-]/,$F[2]); $s=$t[0]+$t[1]*60+$t[2]*3600+$t0; print "$s"'
    7. 6619

CentOS6.xでIPv6の無効化

  • 問題点
    • localhostへのリクエストがIPv6とIPv4のアドレスを交互に返す。apacheやnginxがIPv4のみをlistenしている場合、時々localhostへのリクエストが失敗する事になる。
  • IPv6の無効化
    1. echo "NETWORKING_IPV6=no" >> /etc/sysconfig/network
    2. echo "options ipv6 disable=1" >> /etc/modprobe.d/disable-ipv6.conf
    3. service ip6tables stop
    4. chkconfig ip6tables off
    5.  
    6. vim /etc/hosts
    7. ----
    8. #::1         localhost
    9. ----
    10.  
    11. service network restart

PowerTOP: 省電力化


serf: クラスタ作ってイベント送受信して色々やる


gawkでグループマッチ

  • 0/10の0の部分だけを取り出す
    1. echo "2014-01-02 20:11:22 [INFO] There are 0/10 players online:" | gawk 'match($6, /([0-9]+)\/[0-9]+/, m) { print m[1] }'

logwatchメールの停止

  • CentOS5.x
    1. chmod -x /etc/cron.daily/0logwatch

シンボリックリンク先が同じかのチェック

  • test -ef を使う
    1. ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
    2. test /usr/share/zoneinfo/Asia/Tokyo -ef /etc/localtime
    3. echo $? # 0

mv: inter-device move failed:

  • 異なるデバイス間でmvした時に発生する時がある
  • cp -r してから、rm -rf すれば良い

ゾンビプロセスの数

  • ps, topの例。psの方が早い
    1. ps aux | awk 'BEGIN {c=0} {if ($8 ~ /Z/) c+=1} END {print c}'
    2. 1
    3.  
    4. top -b -d1 -n1 | awk 'BEGIN {c=0} {if ($8 ~ /Z/) c+=1} END {print c}'
    5. 1
    6.  
    7. # ゾンビプロセスだけ表示
    8. ps aux | awk '{if($8 ~ /Z/) print}'

CentOS 6/7でmkpasswdを使う

  1. yum install expect

操作ログをファイルに保存する

  • scriptでCUI操作ログをとる 来栖川電算
    • そのままではscpで接続できない&scriptプロセスが残り続ける問題があるため改良
      1. vim /etc/profile.d/user-logging.sh
      2. ----
      3. LOG_DIR=/tmp
      4. if [ -n "$SSH_CLIENT" ]; then
      5. TOPPROCESS_JUDGE_TOKEN='sshd:'
      6. else
      7. TOPPROCESS_JUDGE_TOKEN='login'
      8. fi
      9.  
      10. if [ ! -z "$(ps -eo 'pid,args,tty' | awk -v pid=$PPID -v args=$TOPPROCESS_JUDGE_TOKEN '{if ($1 == pid && $2 == args && $3 ~ /@pts/) print $1,$2,$3}')" ]; then
      11. SCRIPTLOGFILE="${LOG_DIR}/$(whoami)_$(date +%Y%m%d%H%M)_$$.log"
      12. touch $SCRIPTLOGFILE
      13. chmod 600 $SCRIPTLOGFILE
      14. script $SCRIPTLOGFILE
      15. exit
      16. fi
      17. ----

ネットワークスループットの測定


OS判別

  1. cat /etc/issue | cut -d ' ' -f 1 | head -1 | tr "[:upper:]" "[:lower:]"
  2. centos
  3. ubuntu
  4. raspbian

リモートシャットダウン用ユーザ

  • リモートシャットダウン等がしたい時に。

Windows Server 2003 R2

  1. Administrative Tools > Active Directory Users and Computers > Users
  2. New > User
    • First name: shutdown
    • User logon name: shutdown
    • Password never expires: checked
  3. Administrative Tools > Default Domain Controller Security Settings
  4. Local Policies > User Rights Assignment
  5. Allow log on locally
    • Add User or Group : EXAMPLE\shutdown
  6. Shutdown the system
    • Add User or Group : EXAMPLE\shutdown
  7. Force shutdown from a remote system
    • Add User or Group : EXAMPLE\shutdown
  8. open command prompt(cmd.exe)
    • gpupdate /force
  • netコマンド
    • CentOS6.x
      1. sudo yum install samba
    • Raspbian
      1. sudo aptitude install samba-common-bin
  • Linuxからテスト
    1. net rpc shutdown -f -t '30' -C 'shutdown by remote user' -I '192.168.1.100' -U 'shutdown%password'

CentOS6.x

  • リモートからsudoコマンドを使えるように
    1. visudo
    2. ----
    3. Defaults    !requiretty
    4. ----
  • シャットダウン用ユーザを作成し、パスワードを設定(CentOS6.xには既に存在したので不要)
    1. useradd -g root -M shutdown
    2. passwd shutdown
  • スクリプトを配置して、ログインシェルに指定(/etc/passwordのログインシェルに引数を設定できなかったため)
    1. echo -e '#!/bin/sh\n/usr/bin/sudo /sbin/shutdown -h now' > /usr/local/sbin/shutdown.sh
    2. chmod 750 /usr/local/sbin/shutdown.sh
    3.  
    4. vipw
    5. ----
    6. #shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    7. shutdown:x:6:0:shutdown:/sbin:/usr/local/sbin/shutdown.sh
    8. ----
    9.  
    10. visudo
    11. ----
    12. shutdown ALL=NOPASSWD: /sbin/shutdown, /sbin/halt, /sbin/poweroff, /sbin/reboot
    13. ----
  • テスト(実際にシャットダウンするので注意)
    1. su - shutdown

指定範囲の行を取得

  • 1 〜 10までの行を作成
    1. seq 10 > seq.txt
  • tailを使う
    1. # 先頭2行をスキップ
    2. tail -n +2 seq.txt
    3.  
    4. # 後2行をスキップ
    5. tail -n -2 seq.txt
  • sedを使う
    1. sed -n '2,4p' seq.txt
  • headとtailを使う
    1. START=2;END=4;head -n $END seq.txt  | tail -n $(($END - $START + 1))

flockでファイルロック

  • CentOS5以上なら使える
  • -n : non-block。ロックできない場合は即終了。終了ステータスは1
  • ロックファイルlocktestを作る。ターミナル2つ開いて、実行してみる
    1. flock -n locktest sleep 10
    2. echo $?

psで特定のカラムだけ表示と集計

  • comm は15文字を超えるとカットされる。「comm:20」にしても拡張できなかった
  • user は 8文字を超えると uid で表示される。「uid:20」と最大文字数を指定すれば表示される
  • ユーザ、コマンド、%CPUだけ表示。ヘッダ行なし
    1. ps -eo user,pcpu,comm h
    2. root      0.0 bash
    3. apache    0.0 httpd
    4. ...
  • apacheユーザ、httpdプロセスの%CPUだけ合計(※デュアルコア以上だと値が変)
    1. ps -eo user,comm,pcpu h | grep -P "apache\s+httpd" | awk '{sum+=$3} END {print sum}'
    2. 1.1
  • apacheユーザ、httpdプロセスのRSS(物理メモリ使用量)だけ合計
    1.  ps -eo user,comm,rss h | grep -P "apache\s+httpd\s+" | awk '{sum+=$3} END {print sum}'
    2. 134712

pidstatでプロセス毎の統計情報の取得

  • sysstat-8.0以上に含まれている
  • CentOS6.xのsysstatパッケージにpidstatが含まれているが、CentOS5.xには入っていない
  • マルチコアの場合、%CPU等の値が100を超えるなど変
  • CentOS6.3(sysstat-9.0.4-20.el6.x86_64 にはpidstat含まれている)
    1. yum install sysstat
    2.  
    3. # 一覧表示
    4. pidstat                                                                                                                                          
    5. Linux 2.6.18-308.1.1.el5 (hostname)       07/09/13        _x86_64_        (2 CPU)
    6.  
    7. 17:49:10      UID       PID    %usr %system  %guest    %CPU   CPU  Command
    8. 17:49:10        0         1    0.00    0.00    0.00    0.00     0  init
    9. 17:49:10        0         3    0.00    0.00    0.00    0.00     0  ksoftirqd/0
    10. ...
    11.  
    12. # PIDを指定
    13. pgrep -u apache httpd
    14. ...
    15. 30222
    16.  
    17.  
    18. # 1秒おきに、2回取得
    19. pidstat -p 30222 1 2                                                                                                                               
    20. Linux 2.6.18-308.1.1.el5 (hostname)       07/09/13        _x86_64_        (2 CPU)
    21.  
    22. 17:51:42      UID       PID    %usr %system  %guest    %CPU   CPU  Command
    23. 17:51:43       48     30222    0.00    0.00    0.00    0.00     1  httpd
    24. 17:51:44       48     30222    0.00    0.00    0.00    0.00     1  httpd
    25. Average:       48     30222    0.00    0.00    0.00    0.00     -  httpd
  • CentOS5.8(sysstat-7.0.2-12.el5 にはpidstat含まれない) srpmからインストール
    1. cd /usr/src/redhat/
    2. wget http://pagesperso-orange.fr/sebastien.godard/sysstat-10.1.6-1.src.rpm
    3. rpm -ivh --nomd5 sysstat-10.1.6-1.src.rpm
    4. rpmbuild -ba SPECS/sysstat-10.1.6.spec
    5. rpm -Uvh RPMS/x86_64/sysstat-10.1.6-1.x86_64.rpm

共同作業用ディレクトリの作成

  • 共有ディレクトリ:/var/www/example.com
  • 共有グループ:share
    1. sudo groupadd share
    2. sudo mkdir -p /var/www/example.com
    3. sudo chown :share /var/www/example.com
    4. sudo chmod 775 /var/www/example.com
    5. sudo chmod g+s /var/www/example.com
    • 同じshareグループのユーザが新規ファイル作成すると0644、新規ディレクトリ作成すると2775になる
  • SGIDの削除
    1. sudo chmod g-s /var/www/example.com

Hadoop

  • http://ja.wikipedia.org/wiki/Hadoop
    • Apache Hadoopは大規模データの分散処理を支えるJavaソフトウェアフレームワークであり、フリーソフトウェアとして配布されている。[1]Hadoopはアプリケーションが数千ノードおよびペタバイト級のデータを処理することを可能としている。HadoopはGoogleのMapReduce?およびGoogle File System(GFS)論文に触発されたものである。
  • CentOS 6.3 x86_64 にhadoop-1.1.2安定版をインストールする
    1. yum install jdk.x86_64
    2. wget http://ftp.riken.jp/net/apache/hadoop/common/hadoop-1.1.2/hadoop-1.1.2-1.x86_64.rpm
    3. rpm -Uvh hadoop-1.1.2-1.x86_64.rpm

障害調査


psで省略されてしまうプロセスの長い引数を表示

デフォルトでは長い引数は省略されてしまう。"w"か"ww"を付ける

  • wwを付ける
    1. ps uxww

ログの集計

  • grep -Pでperl互換の正規表現が使えるので便利
  • ログインに失敗したユーザ数を降順で表示
    1. zgrep -o -P 'Failed password for [\w\-\_]+' /var/log/secure | sort | uniq -c | sort -nr
    2.    1098 Failed password for root
    3.     489 Failed password for invalid
    4.      11 Failed password for bin
    5.       1 Failed password for ftp

UID/GIDを変更する

  • login name: user1 / UID:1000 / GID:1000 を UID:2000 / GID:2000 に変更する場合
    1. usermod -u 1000 user1
    2. groupmod -g 1000 user1
    3. find /home/user1 -gid 2000 -exec chown user1. {} \;

添付ファイル付きメール送信

  • Gmailでも表示できるスクリプト
    1. sudo yum install mutt sharutils
    2.  
    3. cat > gmail.sh << 'EOS'
    4. #!/bin/bash
    5. # encoding: utf-8
    6.  
    7. readonly CUR_DIR=$(cd $(dirname $0);pwd)
    8. mail_to='bar@example.com'
    9. mail_from='foo <foo@example.com>'
    10. subject='メール件名'
    11. body='メール本文
    12. テスト'
    13. attachment_file=$CUR_DIR/`basename $0`
    14.  
    15. export EMAIL=$mail_from
    16. export LANG=ja_JP.UTF-8
    17. echo "${body}" | mutt -n -s "${subject}" "${mail_to}" -a "${attachment_file}"
    18.  
    19. # vim: ts=4:sw=4
    20. EOS
  • FROMヘッダの指定。環境変数に書くか、~/.muttrc に追加
    1. export EMAIL="foo <foo@example.com>"
    2.  
    3. vi ~/.muttrc
    4. ----
    5. set envelope_from=yes
    6. set from="from@address"
    7. ----

GNU Partedでパーティションリサイズ他

  • GNU Parted
    • 2TB以上のHDDを扱える
    • fdisk, resize2fs の作業を一度に行える

圧縮されたテキストファイルを解凍せずに見る

  • gzip(.gz), compress(.Z), pack(.z),
    1. zmore /var/log/maillog.1.gz
    2.  
    3. zless /var/log/maillog.1.gz
    4.  
    5. zcat /var/log/maillog.1.gz
  • その他コマンド
    1. zcat        zdiff       zegrep      zforce      zic         zipcloak    zipgrep     zipnote     zless       znew
    2. zcmp        zdump       zfgrep      zgrep       zip         zipdetails  zipinfo     zipsplit    zmore       zsoelim

プロセス一覧の取得

  • ps + grep ではgrepプロセスも表示されるため工夫が必要
    1. ps aux | grep httpd
    2. root      1975  0.0  0.9 247992  9828 ?        Ss   12:27   0:00 /usr/sbin/httpd
    3. apache    1992  0.0  0.6 247992  6164 ?        S    12:27   0:00 /usr/sbin/httpd
    4. ...
    5. hoge      3386  0.0  0.0 107444   964 pts/1    S+   18:00   0:00 grep httpd
    6.  
    7. # httpdプロセスだけ表示
    8. ps aux | grep '[h]ttpd'
  • pgrep を使う
    1. pgrep -lf httpd
    2. 1975 /usr/sbin/httpd
    3. 1992 /usr/sbin/httpd
    4. ...
    • pidだけ取得
      1. pgrep -u apache -f /usr/sbin/httpd
      2. 1975
      3. 1992
      4. ...
  • pstree でツリー状に取得
    1. $ pstree
    2. init─┬─acpid
    3.      ├─atd
    4.      ├─automount───5*[{automount}]
    5. ...
    • CentOS 7の場合
      1. sudo yum install psmisc
  • pidファイルを見る。親プロセスのpidだけ記録されている
    1. cat /var/run/httpd.pid
    2. 30607

umountでdevice is busy エラー

  • umountでエラーが出る場合、なにかのプロセスが使っているためプロセスを調べて終了させる
    1. umount -f /mnt
    2.  
    3. fuser -muv /mnt

lessキーボードショートカット

  • 現在位置から末尾へパターンマッチ:/pattern
  • 現在位置から先頭へパターンマッチ:?pattern
  • 次の検索:n
  • 前の検索:N
  • 先頭に移動:<
  • 末尾に移動:>
  • 終了:q

seq 規則的な数値を得る

  • 数値の連番(FIRST LAST)
    1. seq 0 3
    2. 0
    3. 1
    4. 2
    5. 3
  • 10から、-2つづ、5まで(FIRST INCREMENT LAST)
    1. seq 10 -2 5
    2. 10
    3. 8
    4. 6
  • -f: printfスタイルフォーマットを指定して表示
    1. seq -f "%04.2f" 1 0.1 1.5
    2. 1.00
    3. 1.10
    4. 1.20
    5. 1.30
    6. 1.40
    7. 1.50
  • -s: 区切り文字を指定
    1. seq -s , 0 3
    2. 0,1,2,3
  • -w: 0で桁埋めして表示
    1. seq -w 0 10 100
    2. 000
    3. 010
    4. 020
    5. 030
    6. 040
    7. 050
    8. 060
    9. 070
    10. 080
    11. 090
    12. 100

仮想コンソールの数を減らしてメモリ節約

メモリ節約のためクラウド環境(AWS EC2等)なら仮想コンソールは1つで良い。デフォルト6つ

  • CentOS6.x
    1. perl -p -i -e 's#ACTIVE_CONSOLES=/dev/tty\[1-6\]#ACTIVE_CONSOLES=/dev/tty[1-1]#' /etc/sysconfig/init
    2. reboot
  • CentOS5.x
    1. perl -p -i -e 's/^2:2345/#2:2345/' /etc/inittab
    2. perl -p -i -e 's/^3:2345/#3:2345/' /etc/inittab
    3. perl -p -i -e 's/^4:2345/#4:2345/' /etc/inittab
    4. perl -p -i -e 's/^5:2345/#5:2345/' /etc/inittab
    5. perl -p -i -e 's/^6:2345/#6:2345/' /etc/inittab
    6. reboot

フリーズした時の対処

  • 端末、ターミナル
    • CTRL+Q:間違えてターミナルロック CTRL+S を押してしまった場合の解除
    • CTRL+D:標準入力待ちの終了。bash プロンプト上だとlogoutする
    • CTRL+C:シグナルSIGINTを受け付けてくれるアプリは終了してくれる
    • CTRL+\:終了
    • CTRL+Z:アプリの一時停止。fgで元に戻る。jobsで番号を確認できるので kill %1できる
    • ALT+F2〜F6:仮想コンソールへ切り替え
  • Xターミナル
    • ALT+CTRL+F2:
    • ALT+F7:Xに戻る(ttyの個数+1)
  • ssh,telnetを試す
  • kill -HUP, kill -INT, kill -QUIT, kill -KILL の順でプロセスをkillしてみる
  • CTRL+ALT+DELで再起動できるかを試す
  • alt-SysRq?-s, alt-SysRq?-u, alt-SysRq?-o:ソフトウェアリセットが効かないときに試す
  • Alt + SysRq? + b:再起動
  • 電源スイッチを切る
  • 電源ケーブルを抜く

extundeleteで削除ファイル復元

  • http://extundelete.sourceforge.net/
    • ext3, ext4対応。lvm2でも復元できた
    • rm -rf したディレクトリを削除した場合でも、パスも含めて復元
    • システムドライブ上のファイルを削除した場合は、別ドライブをマウントしてそこに復元で対処できた
  • 例:/dev/sdb1 のファイルを削除してしまった場合
    • /dev/sdb1で余計な書き込みはせず、別パーティションで extundelete のビルドを行う
  • ext3/ext4等、パーティションフォーマット確認。
    1. df -T
  • ファイルを削除したコマンドの時間をメモ
    1. HISTTIMEFORMAT="%F %T " history
  • 対象パーティションを読み取り専用でマウント
    1. mount -o remount,ro /dev/sdb1
  • extundelete のインストール
    • CentOS6:
      1. sudo yum install extundelete --enablerepo=epel
    • CentOS5:
      1. yum -y install make gcc gcc-c++ e2fsprogs-devel
      2. mkdir /tmp/0
      3. cd /tmp/0
      4. wget --trust-server-names "http://downloads.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2"
      5. tar xvfj extundelete-0.2.4.tar.bz2
      6. cd extundelete-0.2.4
      7. ./configure --prefix=/usr/local
      8. make
      9. sudo make install
      10. extundelete --help
  • 復元
    1. cd /tmp
    2.  
    3. # 復元したいファイルパスが分かっている場合
    4. sudo extundelete --restore-file /home/user01/README.md /dev/sdb1
    5.  
    6. # 1時間以内に削除したファイルを復元
    7. sudo extundelete --restore-all --after $(date +%s -d '1 hour ago') /dev/sdb1
    8.  
    9. # RECOVERED_FILES ディレクトリ以下に復元されたか確認。安全な場所にコピー
  • 対象パーティションを再マウント
    1. mount -o remount,rw /dev/sdb1

シンボリックリンク先のパスを取得

  • readlink を使う。-fで常に絶対パスを取得
    1. ls -l /usr/java/
    2. 合計 4
    3. lrwxrwxrwx. 1 root root    6  9月  5 11:15 2012 default -> latest
    4. drwxr-xr-x. 2 root root 4096  9月  5 11:07 2012 jdk-1.7.0
    5. lrwxrwxrwx. 1 root root    9  9月  5 11:15 2012 latest -> jdk-1.7.0
    6.  
    7. readlink /usr/java/default                                                                        
    8. latest
    9.  
    10. readlink -f /usr/java/default
    11. /usr/java/jdk-1.7.0

trコマンドで置換

  1. # file内の文字'e'を'x'に変換する。
  2. tr e x < file
  3.  
  4. # file内の小文字を大文字に変換する。
  5. tr '[a-z]' '[A-Z]' < file
  6.  
  7. # file内のスペースをすべてタブに変換する。
  8. tr ' ' '\11' < file
  9.  
  10. # file内の複数スペースをすべて1つのタブに変換する。
  11. tr -s ' ' '\11' < file
  12.  
  13. # file内のスペースをすべて削除する。
  14. tr -d ' ' < file

rootパスワードを忘れてしまった場合

物理サーバが手元にある場合、またクラウドでもさくらのVPSのように「コンソール」が提供されkernel選択画面が使える場合は、シングルモードに入りrootユーザのパスワードを変更できる。

CPUコア数を調べる

  • CentOS6.x
  • CPUコア数を調べる(Intel HTなら物理CPUより増える)
    1. cat /proc/cpuinfo | grep "processor" | wc -l
    2. 2
    3.  
    4. egrep -c "^processor[[:space:]]+:[[:space:]]+[0-9]+$" /proc/cpuinfo
    5. 2
    6.  
    7. # coreutils にある
    8. nproc
    9. 2
    10.  
    11. # util-linux-ng にある
    12. LANG=C lscpu                                                                          
    13. Architecture:          x86_64
    14. CPU op-mode(s):        32-bit, 64-bit
    15. Byte Order:            Little Endian
    16. CPU(s):                2
    17. ...
    18.  
    19. # glibc-common にある
    20. getconf _NPROCESSORS_ONLN
    21. 2
  • 物理CPU。"physical id"が異なれば違うCPU。同じならIntel HTなど。
    1. cat /proc/cpuinfo | grep "physical id"
    2. physical id     : 0
    3. physical id     : 1

atime,ctime,mtimeの取得取得

  • statコマンドを使う
    1. touch test
    2. stat test
    3.   File: `test'
    4.   Size: 0               Blocks: 0          IO Block: 4096   通常の空ファイル
    5. Device: fd00h/64768d    Inode: 16825       Links: 1
    6. Access: (0664/-rw-rw-r--)  Uid: (  501/user01)   Gid: (  501/user01)
    7. Access: 2017-01-04 13:07:45.113462561 +0900
    8. Modify: 2017-01-04 13:07:45.113462561 +0900
    9. Change: 2017-01-04 13:07:45.113462561 +0900
  • mtimeだけの取得
    1. touch test
    2. stat --print=%y test | cut -d ' ' -f 1
    3. 2017-01-04

cutでデリミタの無い行を無視する

デリミタの無い行の場合"-f1", "-f2"でもすべて同じ値になる。
そのような行を無視したい場合は"-s"を付けると良い。

  1. echo -e "var1" | cut -f1
  2. var1
  3.  
  4. echo -e "var1" | cut -f2
  5. var1
  6.  
  7. echo -e "var1" | cut -s -f1
  8.  
  9. echo -e "var1\tvar2" | cut -s -f2                                                                         
  10. var2

chkconfig対応スクリプトの作成

  • ひな形
    • fileexample.chkconfig
      1. mv example /etc/rc.d/init.d/
      2. chmod 755 /etc/rc.d/init.d/example
      3. chown root:root /etc/rc.d/init.d/example
      4. chkconfig --add example
      5. chkconfig example on
      6. service example restart
  • /etc/rc.d/init.d/functions か肝心なので軽く読んでみると良い
    1. . /etc/rc.d/init.d/functions
    1. cat > test.sh << 'EOS'
    2. #!/bin/bash
    3.  
    4. . /etc/rc.d/init.d/functions
    5.  
    6. echo "success" && echo_success
    7. echo "failure" && echo_failure
    8. echo "passed" && echo_passed
    9. echo "warning" && echo_warning
    10. EOS
    11.  
    12. LANG=C bash test.sh
    13. success                                                    [  OK  ]
    14. failure                                                    [FAILED]
    15. passed                                                     [PASSED]
    16. warning                                                    [WARNING]

新規ユーザ追加時の処理

  • /etc/skel/ ファイルやディレクトリを置くと useradd 時に自動的にコピーされる

ユーザID(名前)、グループID(名前)の取得

  1. id hoge
  2. uid=500(hoge) gid=500(hoge) 所属グループ=500(hoge)
  3.  
  4. id -u
  5. 500
  6.  
  7. id -u -n
  8. hoge
  9.  
  10. id -g
  11. 10
  12.  
  13. id -g -n
  14. wheel

alternativesで複数ソフトを共存

MTAやJAVAなど複数ソフト、バージョンを切り替えて使える

  • 例:MTAの切り替え(sendmail, postfix)
    1. # 手動選択
    2. alternatives --config mta
    3.  
    4. # 自動選択
    5. alternatives --set mta /usr/sbin/sendmail.postfix
    6.  
    7. # 自動選択。番号がわかっていれば上と同様
    8. echo 2 | alternatives --config mta
  • javaの例
    1. # 追加。複数ファイルで構成されている場合は--slaveオプションも付ける
    2. # --install [シンボリックリンク名] [グループ名] [バイナリ本体] [優先度] \
    3. #   --slave [シンボリックリンク名] [グループ名] [バイナリ本体]
    4. # ※優先度は大きいほど高い
    5. alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_31/bin/java 16031 \
    6.   --slave /usr/bin/jar java-jar /usr/java/jdk1.6.0_31/bin/jar \
    7.   --slave /usr/bin/javac java-javac /usr/java/jdk1.6.0_31/bin/javac \
    8.   --slave /usr/bin/javadoc java-javadoc /usr/java/jdk1.6.0_31/bin/javadoc \
    9.   --slave /usr/bin/javaws java-javaws /usr/java/jdk1.6.0_31/bin/javaws \
    10.   --slave /usr/bin/jcontrol java-jcontrol /usr/java/jdk1.6.0_31/bin/jcontrol
    11.  
    12. # 手動選択
    13. alternatives --config java
    14. # 自動選択
    15. alternatives --set java /usr/java/jdk1.6.0_31/bin/java
    16.  
    17. # 削除
    18. # --remove [グループ名] [削除したいバイナリ本体]
    19. alternatives --remove java /usr/java/jdk1.6.0_31/bin/java
    20.  
    21. # 現在の設定
    22. alternatives --display java
    23. java - ステータスは手動です。
    24. リンクは現在 /usr/java/jdk1.6.0_31/bin/java を指しています。
    25. /usr/java/jdk1.6.0_31/bin/java - 優先項目 30
    26. 現在の「最適」バージョンは /usr/java/jdk1.6.0_31/bin/java です。
    27.  
    28. # 設定情報
    29. ls -l /etc/alternatives/

高速に空ファイルを生成

  • 10GBの空ファイル。seekがポイント
    1. dd if=/dev/zero of=/tmp/dummy count=1 bs=1 seek=10G

セキュリティ


CentOS6.x


複数のサーバリソースを見る「dstat」

  • dstat
    • python製
    • cpu,memory,network,disk,mysql等々

ログアウト後もコマンドを実行したままにする

通常、ssh等でログインした場合、ログアウトした時点で実行したプロセスは停止する。
時間がかかる処理やデーモン化させたい処理がある場合。

  • 新規コマンドを指定する場合。実行中の標準出力は"nohup.out"に保存される
    1. nohup hoge.sh &
  • 既存プロセスを指定する場合
    1. disown job番号

ソフトウェアRAID

  • CentOS5.xの初期設定
  1. 1TB x2台でソフトウェアRAIDを構成する
  2. カスタムレイアウトを選択。CentOS5のネットワークインストール中にソフトウェアRAIDを構築しよう 2
  3. GURBを/dev/md0上にインストール を選択
  4. grubはsdaにしかインストールされてないので、sdbにもインストールしてやる
    1. # more /boot/grub/device.map
    2. # this device map was generated by anaconda
    3. (hd0)     /dev/sda
    4. (hd1)     /dev/sdb
    5.  
    6. [root@linux ~]# grub
    7.  grub> root (hd0,0)
    8.  grub> setup (hd0)
    9.  grub> root (hd1,0)
    10.  grub> setup (hd1)
    11.  grub> quit
  5. RAID監視デーモンのメール送信先を変更 RAIDをモニタモードで監視するには − @IT
    1. vi /etc/mdadm.conf
    2. ----
    3. MAILADDR hoge@example.com
    4. ----
    5. service mdmonitor restar

ファイル共有してメールで送信

宅ふぁいる便のようなサービスのオープンソース版


ログイン失敗したlinuxアカウントをロックする

  1. vi /etc/pam.d/password-auth
  2. ----
  3. auth required pam_env.so
  4. # 6回以上の失敗アクセスがあった場合、システム管理者がリセットするまで無効
  5. auth required pam_tally2.so deny=6
  6. auth sufficient pam_unix.so try_first_pass nullok
  7. auth required pam_deny.so
  8.  
  9. account required pam_unix.so
  10.  
  11. password requisite pam_cracklib.so try_first_pass retry=3 type=
  12. # 過去4回のパスワードを回転使用できないように
  13. password sufficient pam_unix.so try_first_pass use_authtok nullok sha512 shadow remember=4
  14. password required pam_deny.so
  15.  
  16. session optional pam_keyinit.so revoke
  17. session required pam_limits.so
  18. session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
  19. session required pam_unix.so
  20. ----

特定のポートを使用しているプロセスを調べる


迷惑/スパムメール対策

ログの削除

  1. # 公開鍵の消去
  2. echo "" > /root/.ssh/authorized_keys
  3.  
  4. # ログの消去
  5. # /var/log/cron.1 や cron.1.gz も削除
  6. find /var/log/* -regextype posix-egrep \( -regex ".+\.[0-9]+$" -or -regex ".+\.[0-9]+\.gz$" \) -type f -delete
  7. echo "" > /var/log/boot.log
  8. echo "" > /var/log/btmp
  9. echo "" > /var/log/cron
  10. echo "" > /var/log/dmesg
  11. echo "" > /var/log/dmesg.old
  12. echo "" > /var/log/lastlog
  13. echo "" > /var/log/maillog
  14. echo "" > /var/log/messages
  15. echo "" > /var/log/secure
  16. echo "" > /var/log/spooler
  17. echo "" > /var/log/tallylog
  18. echo "" > /var/log/wtmp
  19. echo "" > /var/log/yum.log
  20. echo "" > /var/log/audit/audit.log
  21.  
  22. if [ -d /var/log/httpd ]; then
  23. for file in `ls /var/log/httpd/*_log`; do
  24. echo "" > $file
  25. done
  26. fi
  27.  
  28. if [ -f /var/log/mysqld.log ]; then
  29. for file in `ls /var/log/mysql*.log`; do
  30. echo "" > $file
  31. done
  32. fi
  33.  
  34. if [ -f /var/log/postgresql.log ]; then
  35. for file in `ls /var/log/postgresql*.log`; do
  36. echo "" > $file
  37. done
  38. fi
  39.  
  40. # コマンドヒストリーのクリア
  41. history -c

複数ユーザの一括作成


日付と時刻

  • ISO 8601形式
    1. date --iso-8601
    2. 2016-03-01
    3.  
    4. date --iso-8601=hours
    5. 2016-03-01T13+0900
    6.  
    7. date --iso-8601=minutes
    8. 2016-03-01T13:08+0900
    9.  
    10. date --iso-8601=seconds
    11. 2016-03-01T13:08:22+0900
    12.  
    13. # UTC
    14. date --iso-8601=seconds -u
    15. 2016-03-01T04:09:01+0000
  • GMTからJST, UTCへ変換
    1. # local time: JST
    2. date -d 'Oct  4 03:54:51 2016 GMT' '+%Y-%m-%d %H:%M:%S %Z'
    3. 2016-10-04 12:54:51 JST
    4.  
    5. # UTC
    6. date -d 'Oct  4 03:54:51 2016 GMT' -u '+%Y-%m-%d %H:%M:%S %Z'
    7. 2016-10-04 03:54:51 UTC
  • 昨日の日付の取得
    1. date -d '1 day ago' '+%Y-%m-%d'
    2. date -d '-1 day' '+%Y-%m-%d'
  • 日付文字列から秒へ
    1. date -d "2011-01-01 01:02:03" '+%s'
    2. 1293811323
    3.  
    4. ruby -e 'require "time";t="2011-01-01 01:02:03";puts Time.parse(t).to_i'
    5. 1293811323
  • 秒から日付文字列へ。UTC時刻が欲しければ「-u」オプションを付与
    1. date -d "@1293811323" '+%Y-%m-%d %H:%M:%S'
    2. 2011-01-01 01:02:03
  • 日付の比較
    1. #/bin/bash
    2. # 日付文字列を 1970-01-01 00:00:00 からの経過秒に変換
    3. DATE_1=`date -d "$1" '+%s'`
    4. DATE_2=`date -d "$2" '+%s'`
    5. if [ $DATE_1 -eq $DATE_2 ]; then
    6.     echo "$1 == $2"
    7. elif [ $DATE_1 -gt $DATE_2 ]; then
    8.     echo "$1 > $2"
    9. elif [ $DATE_1 -lt $DATE_2 ]; then
    10.     echo "$1 < $2"
    11. fi

swapを追加

  • 例:swapが無い場合に追加する場合。/etc/rc.local 等に追加
    1. local SWAPFILE=/swap.1
    2. cat /etc/fstab | grep -i "swap" > /dev/null 2>&1
    3. if [ $? == 1 -a ! -f $SWAPFILE ]; then
    4.     # swap=512MB
    5.     dd if=/dev/zero of=$SWAPFILE bs=1M count=512
    6.     mkswap $SWAPFILE
    7.     swapon $SWAPFILE
    8.     echo "$SWAPFILE    swap      swap    defaults,nofail 0 0" >> /etc/fstab
    9.     swapon -s
    10. fi

DNSの引っ越し


DNSの確認

  • 通常
    1. $ dig ドメイン名
  • メールサーバ
    1. $ dig mx ドメイン名
  • dnsサーバを指定する場合
    1. $ dig @DNSサーバ ドメイン名

ディレクトリ内のファイル数カウント

  • lsよりfindの方が数倍早い
    1. time find /tmp -type f | wc -l
  • ディレクトリ毎のファイル数
    1. for d in $(find /home/ -maxdepth 1 -type d); do echo $d,$(sudo find "$d" -type f | wc -l); done

複数ファイル内容の文字コードを変換

  • *.shをutf-8に変更
    1. find -name '*.sh' | xargs nkf --overwrite -w

数値を規則的に増加/減少させるseqコマンド


httpingでHTTPポーリング

pingライクにhttpチェックができる


sed


grepで正規表現にマッチした部分だけを抽出

  • grep v2.5以上の「-o」オプションでマッチした部分だけを抽出
    1. LANG=C ifconfig | grep -o -e "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" | sed -n "1p"
  • grep v2.5以上の「-P」オプションでPerl互換の正規表現
    1. LANG=C ifconfig | grep -o -P "\d+\.\d+\.\d+\.\d+" | sed -n "1p"
  • egrepも同様
    1. LANG=C ifconfig | egrep -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | sed -n "1p"

ファイルシステムのパラメータを調整 tune2fs

  • 状態の表示
    1. tune2fs -l /dev/sda1
  • ボリュームラベル変更
    1. tune2fs -L eraid0 /dev/sda1
  • 倉庫として使う場合、root用予約領域を0%に変更。
    1. tune2fs -m 0 /dev/sda1
    • 2TB HDDの場合5%程root用として確保されていた。
    • 「tune2fs -l」では「Reserved block count:」として表示される

バックアップ、リストア

  • ddは遅いので、GNU ddrescueが良さそう

サーバ設定、自動化Capistrano, Chef, cloudinit


ImageMagick?


ディスク使用量の多いディレクトリを表示

  • 1階層だけ表示。MBで表示。逆順で表示
    1. du -m --max-depth=1 /home/hoge | sort -nr
  • MB単位で表示。.svnディレクトリを除外
    1. du -S -m --exclude=.svn | sort -n

ファイルディスクリプタが足りなくなった時

  • /var/log/kern.log
    1. kernel: VFS: file-max limit 8192 reached
  • 設定されている値の確認
    1. cat /proc/sys/fs/file-attachref(example.chkconfig);
    2. #geshi(bash){{
    3. mv example.chkconfig /etc/rc.d/init.d/example
    4. chmod 755 example
    5. chown root:root example
    6. chkconfig --add example
    7. chkconfig example on
    8. service example restart
  • /etc/rc.d/init.d/functions か肝心なので軽く読んでみると良い
    1. . /etc/rc.d/init.d/functions
    1. cat max
    2.  
    3. # CentOS5.4の場合のデフォルト
    4. 102274
  • 動的に設定
    1. echo 102274 > /proc/sys/fs/file-max
  • 設定ファイルに指定
  • /etc/sysctl.conf
    1. fs.file-max=102274

小技


ddコマンド中の進捗を見る

  • Pipe Viewer を使う。CentOS5.xの場合rpm, yum RPMforgeが使えた
    1. yum install pv --enablerepo=rpmforge
    2.  
    3. #または
    4.  
    5. wget http://pipeviewer.googlecode.com/files/pv-1.1.4-1.i386.rpm
    6. sudo rpm -ivh pv-1.1.4-1.i386.rpm
    7.  
    8. # 実行例
    9. dd if=/dev/zero count=1024 bs=1M | pv -s 1g > output.log
    10.  
    11. 024+0 records in67.4MB/s] [===============================================================================>  ] 98% ETA 0:00:00
    12. 1024+0 records out
    13.    1GB 0:00:11 [91.3MB/s] [=================================================================================>] 100%           
    14. 1073741824 bytes (1.1 GB) copied, 10.751 seconds, 99.9 MB/s

テキスト操作


sudoでリダイレクトを含むコマンド

以下の例では「sh -c "..."」を付けないと、「>」の部分が現在のユーザで実行されてしまい、ファイルが作成できない

  1. sudo sh -c "cat > /etc/php.d/json.ini << 'EOS'
  2. extension=json.so
  3. EOS"

lsで日付の昇順にソート

  1. ls -ltr

肥大化したメールの削除

  • root mailboxを削除
    1. sudo bash -c "cat /dev/null > /var/spool/mail/root"
  • cron job中でstdout/stderrを出力しないようにする。または「example.sh | logger -i -t example.sh」でsyslogへ飛ばす
  • crondの設定でメールを送信しない
    1. sudo vi /etc/sysconfig/crond
    2. --
    3. CRONDARGS="-m off"
    4. --
    5. sudo service crond restart

lessでソースコードのカラー化

  • CentOS6.3 x86_64
    1. sudo yum install source-highlight --enablerepo=rpmforge -y
    2. export LESS='-R'
    3. export LESSOPEN='| /usr/bin/src-hilite-lesspipe.sh %s'

kernel: ACPI: Unable to turn cooling device

  • /var/log/messagesに延々以下のメッセージが出る場合
    kernel: ACPI: Unable to turn cooling device [ddc8b748] 'on'
  • acpi=offを追加して、再起動
    1. vi /boot/grub/grub.conf
    2. ----
    3. kernel /vmlinuz-2.6.18-194.3.1.el5 ro root=/dev/VolGroup00/LogVol00 acpi=off
    4. ----
    5.  
    6. service acpid stop
    7. chkconfig acpid off

IDE/SATA HDDの情報を見る

  • sata
    1. $ cat /proc/scsi/scsi
    2.  
    3. Attached devices:
    4. Host: scsi0 Channel: 00 Id: 00 Lun: 00
    5.   Vendor: WDC WD10 Model:    -WCAV50611046 Rev:    
    6.   Type:   Direct-Access                    ANSI SCSI revision: 02
    7. Host: scsi0 Channel: 00 Id: 00 Lun: 01
    8.   Vendor: WDC WD50 Model:    -WCAPW1876244 Rev:    
    9.   Type:   Direct-Access                    ANSI SCSI revision: setup (hd1)
    10.  grub 02
  • ide
    1. $ cat /proc/ide/hda/model
    2.  
    3. HITACHI_DK23DA-30

echoで改行したい時

  • 通常。\も表示される
    1. $ echo 'a\nb'
    2. a\nb
  • 改行したい時。-eオプション
    1. $ echo -e 'a\nb'
    2. a
    3. b
  • 一時的に改行したい時。$'\n'
    1. echo $'\n''\n'
    2.  
    3. \n

lsyncd+rsyncdでリアルタイムミラー

yum install lsyncd -y --enablerepo=rpmforge

ファイル名の文字コードを変換する

  • インストール
    yum -y install convmv
  • 文字コード
    • euc-jp
    • sjis
    • utf8
  • テスト
    convmv -r -f sjis -t utf8 *
  • 実行 sjis -> utf-8へ
    convmv -r -f sjis -t utf8 * --notest

WARNING: UNPROTECTED PRIVATE KEY FILE!

  • 以下のエラーが出る場合。秘密鍵のパーミッションが間違っている。644だとエラー
    $ ssh -i .ssh/id_rsa 192.168.1.2
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    
  • 600にパーミッションを修正。
    $ chmod 600 .ssh/id_rsa

ログイン時にメッセージを表示する

  1. # vi /etc/motd
  2. ----
  3.          __|  __|_  )  Fedora 8
  4.          _|  (     /    32-bit
  5.         ___|\___|___|
  6.  
  7.  Welcome to an EC2 Public Image
  8.                        :-)
  9.  
  10.     Base
  11.  
  12.  --[ see /etc/ec2/release-notes ]--
  13. ----

ヒアドキュメント

  1. cat >> hoge.txt << EOS
  2. a
  3. b
  4. c
  5. EOS
  • 変数展開したくない場合、シングルクォーテーションで括る
    1. cat >> hoge.txt << 'EOS'
    2. VAR=hoge
    3. echo $hoge
    4. EOS

bonnie++ディスクベンチマーク

  • 測定した処理時間が短過ぎた場合には、測定結果の表示が「+++++」「+++」となってしまうため、ソース修正。
    1. cd /tmp
    2. wget http://www.coker.com.au/bonnie++/experimental/bonnie++-1.96.tgz
    3. tar xvfz bonnie++-1.96.tgz
    4. cd bonnie++-1.96
    5.  
    6. 必要ならインストール
    7. # yum groupinstall
    8. ./configure
    9. vi bonnie.h
    10. ----
    11. #define MinTime (0.01)
    12. ----
    13. make
    14.  
    15. ./bonnie++ -d /tmp -u root
    16.  
    17. cd ..
    18. rm -rf bonnie++*
  • rpmでのインストールもできるが、上記項目が修正されていない。
    yum install bonnie++ --enablerepo=rpmforge
    bonnie++ -u ユーザ -d /tmp
    • 結果のカンマ区切り列をbon_csv2html, bon_csv2txtコマンドに与えると、html,txtとして出力される
      bon_csv2html < input.csv > output.html
  • デフォルトでは、バッファキャッシュによる測定誤差を小さくするため、実メモリサイズの2倍の一時ファイルが測定時に作成される。測定対象のパーティションの空き容量に注意が必要。

topコマンド

  • 1秒毎に更新
    top -d 1
キー説明
1cpuコア毎の使用率を表示
Mメモリ使用量でソート
NPIDでソート
PCPU使用率でソート
TTIME+でソート
  • その他  man top

アーキテクチャの判別

  1. uname -i
  2.  
  3. i386
  4. x86_64

32bit/64bitかどうか判定

  1. getconf LONG_BIT
  2.  
  3. 32 // 32bit
  4. 64 // 64bit

cpanインストール時にデフォルトでyesに設定する

perl -MCPAN -e shell
cpan> o conf prerequisites_policy follow
cpan> o conf commit
cpan> quit

プロセス毎のメモリ使用量

  • メモリ多い順にソート。単位KB
    ps alx |  awk '{printf ("%d\t%s\n", $8,$13)}' | sort -n -r
  • 特定プロセスだけ表示。単位KB。例mysql
    ps alx | grep mysql | awk '{printf ("%d\t%s\n", $8,$13)}'

unixbenchで結果が0.0( no measured results)

  • /usr/bin/timeが必須
    1. sudo yum install time
  • 5.1.3の場合
    1. sudo yum install time make gcc perl perl-Time-HiRes
    2. wget http://byte-unixbench.googlecode.com/files/UnixBench5.1.3.tgz
    3. tar xvfz UnixBench5.1.3.tgz
    4. cd UnixBench
    5. make
    6. ./Run -i 1 index
  • 4.1.0の場合
    1. sudo yum install time
    2. wget http://www.tux.org/pub/tux/benchmarks/System/unixbench/unixbench-4.1.0.tgz
    3. tar zxvf unixbench-4.1.0.tgz
    4. cd unixbench-4.1.0
    5. make
    6. ./Run -1 index

ソースからドキュメントを生成 doxygen

  • centos5.3
    yum install doxygen
  • Graphviz dot記法のテキストからグラフを作成できる
    yum install graphviz graphviz-gd

CentOS5.3でWebDAV環境作成

  • httpd-devel
    # yum -y install httpd-devel
  • インストール
    # wget ftp://ftp.aconus.com/fc5/modhttp://www.itmedia.co.jp/help/tips/linux/l0458.html]]
    # tar xvfz mod_encoding-2.2.0-1.src.tar.gz
    # rpm -ivh iconv_hook-1.0.0-1.src.rpm mod_encoding-2.2.0-1.src.rpm
     
    ビルドエラー「インストール済み(ただし未伸張)ファイルが見つかりました」が出るので、以下を先頭に追加
    # vi SPECS/iconv_hook.spec
    ----
    %define __check_files %{nil}
    ----
    # rpmbuild -ba SPECS/iconv_hook.spec
    # rpm -ivh RPMS/i3861p*.log/iconv_hook-1.0.0-1.i386.rpm
    
    ビルドエラー「インストール済み(ただし未伸張)ファイルが見つかりました」が出るので、以下を先頭に追加
    # vi SPECS/mod_encoding.spec
    ----
    %define __check_files %{nil}
    ----
    # rpmbuild -ba SPECS/mod_encoding.spec
    # rpm -ivh RPMS/i386/mod_encoding-2.2.0-1.i386.rpm 
  • 設定
    # vi /etc/httpd/conf.d/mod_encoding.conf
    ----
    LoadModule encoding_module modules/mod_encoding.so
    <IfModule mod_encoding.c>
    	EncodingEngine on
    	NormalizeUsername on
    	SetServerEncoding UTF-8
    	DefaultClientEncoding UTF-8 CP932 EUCJP-MS
    	AddClientEncoding "Microsoft .* DAV 1.1" ASCII CP932 UTF-8
    	AddClientEncoding "Microsoft .* DAV" UTF-8 CP932
    	AddClientEncoding "(Microsoft .* DAV $)" UTF-8 CP932
    	AddClientEncoding "(Microsoft .* DAV 1.1)" CP932 UTF-8
    	AddClientEncoding "Microsoft-WebDAV*" UTF-8 CP932
    	AddClientEncoding "RMA/*" CP932
    	AddClientEncoding "xdwin9x/" CP932
    	AddClientEncoding "cadaver/" UTF-8 EUCJP-MS
    	AddClientEncoding "Mozilla/" EUCJP-MS
    </IfModule>
    ----
    # service httpd restart
  • webdav設定
    # vi /etc/httpd/conf.d/dav.example.com.conf
    ----
    <VirtualHost *:80>
        ServerAdmin webmaster@dav.example.com
        ServerName dav.example.com
        ServerAlias www.dav.example.com
        DocumentRoot /var/www/vhost/dav.example.com/public_html
        ErrorLog logs/dav.example.com-error_log
        CustomLog logs/dav.example.com-access_log combined env=!no_log
        <Directory />
            Options -Indexes FollowSymLinks
            AllowOverride All
        </Directory>
    
        <Location />
            DAV On
            #SSLRequireSSL
            AuthType Basic
            AuthUserFile /var/www/vhost/dav.example.com/.htpasswd
            AuthName "password"
            Require valid-user
        </Location>
    </VirtualHost>
    ----
    # chown -R apache. /var/www/vhost/dav.example.com/public_html
    # service httpd graceful
    

libiconvのインストール

  • libiconv
    # cd /usr/local/src/
    # wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.9.2.tar.gz
    # tar xvfz libiconv-1.9.2.tar.gz
    # cd libiconv-1.9.2
    # ./configure
    # make
    # make install
    # vi /etc/ld.so.conf
    ----
    /usr/local/lib
    ----
    # ldconfig
    

sudoを使えるように

  • UNIXの慣習としてsudoできるのはwheelグループ。コメントを外す
    1. sudo visudo
    2. ----
    3. %wheel   ALL=(ALL)  NOPASSWD: ALL
    4. ----
    5.  
    6. # user01をwheelグループに追加
    7. usermod -G wheel user01
  • visudoより /etc/sudoers.d/ にファイルを作る方がデプロイが楽
    • CentOS6.x
      1. echo 'hoge ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/hoge
      2. chmod 440 /etc/sudoers.d/hoge
      3.  
      4. # groupの場合、%を付ける
      5. echo '%hogegroup ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/hogegroup
      6. chmod 440 /etc/sudoers.d/hogegroup
    • もし ディレクトリが無かったり、設定が必要ならば設定する。(CentOS6.xでは不要だった)。「#includedir」の行頭#はコメントではない
      1. mkdir /etc/sudoers.d
      2. chmod 750 /etc/sudoers.d
      3.  
      4. vim /etc/sudoers
      5. --
      6. #includedir /etc/sudoers.d
      7. --
  • hogeユーザでsudoを使えるように
    1. visudo
    2. ----
    3. # パスワードを要求する
    4. hoge ALL=(ALL) ALL
    5. # パスワードを要求しない
    6. hoge ALL=(ALL) NOPASSWD: ALL
    7. ----
  • sudoユーザがrootになりたい時
    1. sudo su -

ディレクトリ単位でディスク使用量を表示

ls | xargs du -ks  | sort -n -r

graphvizで日本語を使う

dotファイルをUTF-8で記述し、以下の方法で、nodeとlabelが日本語になった。
「-G」でgraph環境変数も追加できる。

  • CentOS5.3
  • インストール
    yum install graphviz graphviz-gd
  • フォント
    $ locate .ttf
    /usr/share/fonts/ja/TrueType/kochi-gothic-subst.ttf
    /usr/share/fonts/ja/TrueType/kochi-mincho-subst.ttf
    /usr/share/fonts/japanese/TrueType/sazanami-gothic.ttf
    /usr/share/fonts/japanese/TrueType/sazanami-mincho.ttf
  • コマンドでフォントを指定
    dot -T png -Nfontname=kochi-gothic-subst -Efontname=kochi-gothic-subst < trac.dot > trac.png
  • dotファイル内でフォント指定。dotファイルはUTF-8で記述する
    digraph G {
    node [fontname="kochi-gothic-subst"]
    edge [fontname="kochi-gothic-subst"]
    ...
    }
    

CentOS5.3のネットワークインストールで、メモリ256MBでエラー

メモリが256MBしかないPCに、CentOS5.3をネットワークインストールしようとすると、rootパスワード入力後、パッケージ選択前に以下のエラーが発生する。
メモリ512MBあれば問題なくインストールできる。

centos5.3_netinstall_error.jpg


BitTorrent?クライアント

Linuxで無線LANを使う

  • Thinkpad X31 + Intel PRO Wireless LAN 2100 3B Mini にCentOS5.2を入れてみる
    • dmesgを確認すると、firmwareの認識に失敗していた
      # dmeshttp://www.itmedia.co.jp/enterprise/0309/05/epn05.html]]
  • [[エンタープライズ:特集:第3回 tarボールからRPMパッケージを作るコツ (1/3)g | grep ipw2100
    ipw2100: Intel(R) PRO/Wireless 2100 Network Driver, git-1.2.2
    ipw2100: Copyright(c) 2003-2006 Intel Corporation
    ipw2100: Detected Intel PRO/Wireless 2100 Network Connection
    ipw2100: eth0: Firmware 'ipw2100-1.3.fw' not available or load failed.
    ipw2100: eth0: ipw2100_get_firmware failed: -2
    ipw2100: eth0: Failed to power on the adapter.
    ipw2100: eth0: Failed to start the firmware.
    ipw2100Error calling register_netdev.
    ipw2100: probe of 0000:01:04.0 failed with error -5
    • firmwareを最新に更新。ATrpms
      $ wget http://dl.atrpms.net/all/ipw2100-firmware-1.3-6.0.1.noarch.rpm
      $ rpm -ivh ipw2100-firmware-1.3-6.0.1.noarch.rpm
      $ rmmod ipw2100
      $ modprobe ipw2100
      $ iwconfig
    • これで認識した。あとは@ITの記事参照
    • WPAとdhcpを起動するように
      # wpa_supplicant on
      # chkconfig dhcdbd on

ポートフォワーディング

  • ローカルPCからポートフォワーディングを行う方法
  • http://サーバA:10080/ へアクセスした時に、www.google.co.jpを表示する場合。
    サーバAへsshでログインして、ssh_10080_www.google.co.jp_80.sh を実行している間だけ使用可能となる。
    自分以外も接続可能なので、使用後は切断すること。
    • ポートを開放する
      # vi /etc/sysconfig/iptables
      ----
      -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10080 -j ACCEPT
      ----
      # service iptables restart
    • スクリプトを用意(-gオプションはローカル以外からの接続を許可)
      $ vi ssh_10080_www.google.co.jp_80.sh
      ----
      #!/bin/bash
      
      ssh -g -L 10080:www.google.co.jp:80 user@localhost
      ----
      $ chmod 700 ssh_10080_www.google.co.jp_80.sh
      

ソースコード検索

  • 再帰、大文字小文字無視、色つき
    grep -r -i --color=auto "検索文字列" /tmp/*
  • ack だと、svnやcvsの管理ファイルは無視してくれて、色も付いて色々便利
    • インストール
      cpan -i App::Ack

ロケールShift_JISを追加する

# localedef -f SHIFT_JIS -i ja_JP ja_JP.SJIS
# export LANG=ja_JP.sjis

リアルタイムログ監視


Unix/Linuxコマンドリファレンス

ファイル分割

root宛のメールを転送する

  • postfixを使っている場合
    # sed -i '/^root:/d' /etc/postfix/aliases
    # echo "root: hoge@example.com" >> /etc/postfix/aliases
    # postalias /etc/postfix/aliases
    # echo test|mail root
    • postaliasでエラーが出る場合、/etc/postfix/main.cf の"myhostname"の値を設定してあるか確認。
  • sendmailを使っている場合
    # sed -i '/^root:/d' /etc/aliases
    # echo "root: hoge@example.com" >> /etc/aliases
    # newaliases
    # echo test|mail root

ファイル中のCRLFをLFに置換

  • perl ワンライナー
    perl -pe 's/\x0D\x0A|\x0D|\x0A/\n/g' inputfile > outputfile

強制コピー

rootでcp -fしても、「yes/no」と訪ねられる。yesコマンドの出力を食わせてやればよい。

$ yes | cp -f ...

sshポートフォワーディング

  • 以下3台のLinuxサーバがあり、remotehost2への接続はremotehost1経由でしか行えないとする。
    • localhost
    • remotehost1
    • remotehost2
  • 安全に localhost -> remotehost2へファイルをコピーしたい場合
    • localhostで新しい接続を開き、ポートフォワーディングする(ポートは適当)。remotehost1に接続した状態のまま。
      ssh -g -L 30022:remotehost2:22 username@remotehost1
    • localhost scpでポート指定し、/home/foo/にファイルをコピーする
      scp -P 30022 filename username@localhost:/home/foo/
  • hostA上でremotehost1のsvnからチェックアウト
    • hostA
      ssh -g -L 30443:localhost:443 username@remotehost1
    • hostAの新しいssh接続を開いて
      svn co https://localhost:30443/svn/SandBox/trunk/src SandBox

shift_jisのディレクトリの一覧

  • 一覧
    ls | nkf --sjis --euc
  • 移動
    cd `printf "あいうえお" | nkf -s`

ソースコード検索ack

"grep -r"の代わりに使える。
デフォルトで CVS, RCS, .svn, blib といったバージョン管理ディレクトリを無視、-i, -v といった grep 由来のコマンドラインや、 --perl で perl ソースコードだけ検索。カラーリングにも対応。

  • インストール
    # perl -MCPAN -e shell
    cpan> install App::Ack
    • 1.6系でエラーとなる場合
      cpan> install P/PE/PETDANCE/ack-1.58.tar.gz
  • 使い方
    ack [options] PATTERN [FILE...]
    ack -f [options] [DIRECTORY...]

manで文字化けする場合

  • 日本語判別が強化されている lv を使う
  • 以下のようなファイルを作り、source ファイル名 で読み込む
    • euc-jpで表示
      #!/bin/bash
      export LANG="ja_JP.eucjp"
      export PAGER="/usr/bin/less -isr"
    • utf-8で表示
      #!/bin/bash
      export LANG="ja_JP.utf8"
      export PAGER="/usr/bin/iconv -f euc-jp -t utf-8 | /usr/bin/less -isr"

usb機器一覧の表示

Redhat系ならば、lsusbがある。
あとはlshwとか。

  • Fedoraならば
    # yum install usbutils
    # lsusb
  • USBのwebカメラが認識しなくなった
    usb 5-2: USB disconnect, address 36
    usb 5-2: new full speed USB device using uhci_hcd and address 40
    usb 5-2: configuration #1 chosen from 1 choice
    pwc: Unknown parameter `index'
  • /etc/modprobe.conf の options pwc index=1.を削除すればよいらしい。
  • 編集後
    Dec 18 15:52:26 tech-fsv last message repeated 2 times
    Dec 18 15:54:16 tech-fsv kernel: usb 5-2: USB disconnect, address 40
    Dec 18 15:54:19 tech-fsv kernel: usb 5-2: new full speed USB device using uhci_hcd and address 41
    Dec 18 15:54:20 tech-fsv kernel: usb 5-2: configuration #1 chosen from 1 choice
    Dec 18 15:54:20 tech-fsv kernel: pwc Philips webcam module version 9.0.2-unofficial loaded.
    Dec 18 15:54:20 tech-fsv kernel: pwc Supports Philips PCA645/646, PCVC675/680/690, PCVC720[40]/730/740/750 & PCVC830/840.
    Dec 18 15:54:20 tech-fsv kernel: pwc Also supports the Askey VC010, various Logitech Quickcams, Samsung MPC-C10 and MPC-C30,

updatedb の自動更新を有効にする。

locateコマンドでファイルを高速に検索可能だが、RedHat?やFedoraだと、インストール時にはupdatedbの自動更新が無効になっている。
有効にするには以下のファイルを編集し「yes」に変更する。

# vi /etc/updatedb.conf
-----------------------------
DAILY_UPDATE=yes
-----------------------------

毎日午後4時に実行されるが、負荷が高すぎて問題が出る場合は、PRUNEPATHSでディレクトリを除外しておく。キャッシュやテンポラリファイルが膨大にあるディレクトリを指定すると良さそう。

tailの出力結果をファイルに保存する

tailの出力結果をgrepで絞り込んで、それをファイルに出力しようとしても、以下の方法では何も出力されません。

  • CTRL+Cでは、パイプ全体が死ぬため出力されない
    # tail -f /var/log/httpd/access_log | grep 絞りこみ文字列 > ファイル名
  • tailだけ殺してやる
    # tail -f /var/log/httpd/access_log | grep 絞りこみ文字列 > ファイル名&
    # killall tail

HDD増設

  1. 接続されているドライブ確認
    # fdisk -l
    Disk /dev/hda: 122.9 GB, 122942324736 bytes
    ...
    Disk /dev/hdb: 300.0 GB, 300090728448 bytes
    ...
    Disk /dev/hdd: 61.4 GB, 61492838400 bytes
    ...
  2. fdiskで領域確保
    # fdisk /dev/hdd
    m - help
    p - 現在の領域設定表示
    n - 新規に領域作成
    w - 書き込み
  3. フォーマット(-c オプション付けると不良セクタを検査する)
    # mkfs.ext3 /dev/hdd1
  4. マウント
    # mkdir /mnt/hdd1
    # mount -t ext3 /dev/hdd1 /mnt/hdd1
  5. 自動マウント設定 (fstab)
    # vi /etc/fstab
    # LABEL=/dev/hdd1 /mnt/hdd1 ext3 defaults 1 2

DynamicDNSの自動IPアドレス更新

スクリプトによる自動ユーザ追加

スクリプト等で一括登録する方法。useradd -p コマンドではあらかじめcrypt()したパスワードを渡す必要があります。passwdコマンドにパイプ経由でパスワードを渡してみます。

# useradd hoge
# echo 'hogehoge' | passwd --stdin hoge

世代/差分バックアップ(rdiff-backup)

デバック用コードを有効にする

デバック時にのみ有効にしたいコードが有る場合、Makefile, gcc, cc時にオプションで「-DDEBUG」を付ける事により、ソース中に「#define DEBUG」記述するのと同じ効果を持たせる事ができる。

Makefile
---------------------------------
CFLAGS = -g -O2 -DDEBUG
---------------------------------
test.c
---------------------------------
#ifdef DEBUG
printf("DEBUG:...");
#endif
---------------------------------

JPEG2000形式のファイルを他形式に変換する

Windowsでもbmp -> jpeg2000は可能だが、逆がほとんどない。
複数ファイルの一括変換ができなくて面倒。

  • jasper
  • 対応形式
    ValueDescription
    bmpWindows BMP
    jp2JPEG-2000 JP2
    jpcJPEG-2000 Code Stream
    jpgJPEG
    pgxPGX
    pnmPNM/PGM/PPM
    mifMy Image Format
    rasSun Rasterfile
  • JPEG2000形式(j2k, jp2)をbmpに変換する例
    jasper -f 入力ファイル名.jp2 -F 出力ファイル名.bmp -T bmp

Shift_JISでコマンドラインを使う

  1. Shift_jisを追加
    # localedef -f SHIFT_JIS -i ja_JP ja_JP.sjis
  2. 確認
    # locale -a | grep ja
    ja_JP
    ja_JP.eucjp
    ja_JP.sjis
    ja_JP.ujis
    ja_JP.utf8
    japanese
    japanese.euc
  3. 設定
    # export LANG=ja_JP.SJIS

whichコマンドの代わりは?

  • コマンドを探す which がFedora core 3では無い。
    代わりにwhereisコマンドを使う
    $ whereis perl
    perl: /usr/bin/perl /usr/share/man/man1/perl.1.gz

メール送信ができない時は

  • 以下のエラーの場合は
    WARNING: RunAsUser for MSP ignored, check group ids (egid=500, want=51)
    can not chdir(/var/spool/clientmqueue/): Permission denied
    Program mode requires special privileges, e.g., root or TrustedUser.
  • postdrop warningの時は
    以下のエラーの際は、postfix が起動していないため発生するようです。
    postdrop: warning: unable to look up public/pickup: No such file or directory
    • 解決方法
      プロセスの確認。masterが存在すれば起動済み
      # ps -aux | grep postfix
      root     26348  0.2  0.1  5220 1632 ?        S    17:02   0:00 /usr/libexec/postfix/master
      起動していない場合は、起動させる。
      # service postfix start
      # chkconfig postfix on
      ためしにメールを送ってみる。
      # echo "hogehoge" | mail メールアドレス

majordomo(メーリングリスト)

以下のように「majordomo@ドメイン名」宛にコマンドを送ると結果が返される。

宛先:majordomo@ドメイン名
件名:(何でも構いません)
本文:
     コマンド
     コマンド
     ・・・
     コマンド
     end (or "-")
  • コマンド
    コマンド名説明
    help説明ページの入手
    lists公開されたメーリングリスト一覧
    lists 自分のメールアドレス自分に配信されるメーリングリスト一覧

パッチを当てる

ハードウェア情報を一括表示する

  • lshwを利用する
    htmlやxml形式でハードウェア一覧を出力できる。
  • DOWNLOAD http://sourceforge.net/project/showfiles.php?group_id=32683
  • インストール
    $ wget http://jaist.dl.sourceforge.net/sourceforge/ezix/lshw-B.02.03.tar.gz
    $ tar vxzf lshw-B.02.03.tar.gz
    $ cd lshw-B.02.03/src/
    $ make
    $ su
    # make install
  • 実行
    # lshw -html > abc.html
    # lshw -xml > efg.xml

grepの使い方

  • デフォルトオプションを付与。~/.bash_profile あたりに追加すれば次回ログインから有効
    1. export GREP_OPTIONS="--color=auto"
  • 例えば /tmp 以下にあるたくさんのファイルの中から "Linux" という文字を含むファイルを見つけ出したいとき
    grep "Linux" /tmp/*
    これで結果がずらずらと出てきます。
    でもこれだと"linux"を含む文字列全てが対象となってしまいます。
  • 単語の完全一致で検索したいときは
    grep -w "Linux" /tmp/*
  • 大文字と小文字の区別をなくしたいときは
    grep -i "Linux" /tmp/*
  • サブディレクトリ以下も再帰的に検索したい場合
    grep -r "Linux" /tmp/*
  • マッチした1行前も表示
    1. grep -B 1 hoge
  • マッチした1行後も表示
    1. grep -A 1 hoge
  • 指定した文字を含まないファイルを表示
    1. grep -L hoge /tmp/*.txt

hosts.allowで制限できる範囲

inetd経由のデーモンのみ制御可能。
よって、apache等はその範囲ではない。
ただし、最近はlibwrapを取り込んでいるらしく、inetd経由でなくとも有効になるものがある。
lddコマンドでリンクしてるライブラ^processorリをみてlibwrap.soとかリンクしてれば制限かかるらしい。


rootkit検出ツールによる検査

ハッキングに利用されるrootkitを検出するツール。
http://www.chkrootkit.org/

  1. インストール
    $ wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
    $ tar xvzf chkrootkit.tar.gz
    $ cd chkrootkit-0.44
    $ make sense
    $ su
    # cp -p chkrootkit /usr/local/bin/
  1. 実行
    # ./chkrootkit
  2. 日に1回実行させ、異常があればメールで知らせる
    # su -
    # cd /etc/cron.daily/
    # vi chkrootkit
    
    #!/bin/sh
    #
    /usr/local/bin/chkrootkit > /var/log/chkrootkit_log
    grep "INFECTED" /var/log/chkrootkit_log
    chmod 600 /var/log/chkrootkit_log 
    
    # chmod 751 chkrootkit
  3. 実験
    # /etc/cron.daily/chkrootkit

lftpで除外設定

  • mirrorコマンドの`-x`オプションで除外したいファイル/ディレクトリを指定する
    1. > mirror -x "\\.svn" .

lftpでバッチ実行

  • lftp -c "コマンド" で接続から取得まで一括実行可能。
    以下の例では、centos用のphpモジュールを一括取得している
    1. lftp -c "open ftp.riken.jp && user anonymous password && cd /Linux/centos/4.1/centosplus/i386/RPMS/ && mget php*5.0.4-2*"

lftpでミラーリング

lftpコマンドを利用する。
「-e」オプションを付けると、コピー元にないファイルを削除する。

サーバー -> クライアントへダウンロード

cd  <コピー元のサーバ側ディレクトリ>
lcd <コピー先のクライアント側ディレクトリ>
mirror

クライアント -> サーバーへアップロード

cd  <コピー先のサーバ側ディレクトリ>
lcd <コピー元のクライアント側ディレクトリ>
mirror -R

ftpでコマンド入力すると応答がなくなる

iptablesの設定を確認。
passiveモードでログインできない場合も同様。

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# service iptables save
# service iptables restart

インストール後、再起動前にモジュールを追加したい場合

kernel等アップデートができる。
通常のインストール後に、「rebootしますか?」とダイアログが出るが、 そのときに、ALT+F2でコンソール画面に移動できる。

rpm -ivh rpmパッケージ名

元に戻るにはALT+F1。

FTP経由インストール時にエラーが出た場合

FTPサーバーがPASSIVEモードに対応しているか確認する。
どうやら、強制的にPASSIVEモードでアクセスするようなので、失敗する場合がある。

RedHat? Linux9 のPHPを更新する

apache2.0用にインストールする場合、オプションの変更が必要なので、 SRPMからコンパイルし、インストールする。

4.3.3をインストールする場合

  1. 古いバージョンのPHPを削除しておく
    http://blogs.yahoo.co.jp/airmikan/31578937.html]]
  • [[rpmの調べ物:初めてのrpmパッケージ作り-SPECファイル - 美味しいもの - Yahoo!ブログrpm -qa | grep php
    rpm -e 古いパッケージ名
  1. 新しいsrpmをどこかからDLし、インストールする。
    rpm -ivh php-4.3.3-4.1.src.rpm
  2. php.specの編集
    cd /usr/src/redhat/SPECS/
    /usr/src/redhat/SPECS/php.specに以下の行を追加
    #build --with-apxs=%{_sbindir}/apxs
    build --with-apxs2filter=%{_sbindir}/apxs
    コンパイル時に、libphp4
    	EncodingEngine on
    	NormalizeUsername on
    	SetServerEncoding UTF-8
    	DefaultClientEncoding UTF-8 CP932 EUCJP-MS
    	AddClientEncoding .soが存在すると言って怒られるので無効にする。
    # vihttp://blogs.yahoo.co.jp/airmikan/31578937.html]]
  • [[rpmの調べ物:初めてのrpmパッケージ作り-SPECファイル - 美味しいもの - Yahoo!ブログhttp://blogs.yahoo.co.jp/airmikan/31578937.html]]
  • [[rpmの調べ物:初めてのrpmパッケージ作り-SPECファイル - 美味しいもの - Yahoo!ブログ /etc/rpm/macros.specspo
    %_unpackaged_files_terminate_build 0
  1. コンパイル&インストール
    # rpmbuild -bb --clean php.spec
    # cd /usr/src/redhat/RPMS/
    # rpm -ivh php-4.3.3-4.1.i386.rpm
    # rpm -ivh php-debuginfo-4.3.3-4.1.i386.rpm
    # rpm -ivh php-devel-4.3.3-4.1.i386.rpm
    # rpm -ivh php-domxml-4.3.3-4.1.i386.rpm
    # rpm -ivh php-imap-4.3.3-4.1.i386.rpm
    # rpm -ivh php-ldap-4.3.3-4.1.i386.rpm
    # rpm -ivh php-manual-4.3.3-4.1.i386.rpm
    # rpm -ivh php-mysql-4.3.3-4.1.i386.rpm
    # rpm -ivh php-odbc-4.3.3-4.1.i386.rpm
    # rpm -ivh php-pgsql-4.3.3-4.1.i386.rpm
    # rpm -ivh php-snmp-4.3.3-4.1.i386.rpm
  2. できあがったlibphp4.soへのリンクを張る
    # ln -s /usr/lib/apache/libphp4.so /etc/httpd/modules/libphp4.so
  3. サービスの再起動
    # service httpd restart
  4. 確認
    phpinfo.php等のファイルを作り確認する。
    <?
    phpinfo();
    ?>

オープン可能なファイル数の上限を確認する

ファイルをオープンできる上限に達する現象は、 非常に負荷の高いWEBサーバーなどでみられる


ディスクの使用量が多いユーザーを調べる

  • MBで降順ソートして表示
    du -sm /home/* | sort -nr

SELinuxを無効にする

パーミッションを許可しているのにエラーとなる場合は、これを疑う。

  • SELinuxの状態確認。disableになっていれば良い
    1. getenforce
    2. Disabled
    3.  
    4. sestatus
    5. SELinux status:                 disabled
  • 無効化: CentOS6
    1. sudo setenforce 0
    2. sudo perl -p -i -e 's#^SELINUX=.+#SELINUX=disabled#' /etc/selinux/config
    • Enforcing状態から、Disabledには変わらない。Permissive(SELinuxは有効だが、ポリシーは無視)になる。ホスト再起動後にDisabledに変わる

grepやwcが遅い場合

マルチランゲージ対応版だと遅くなるようだ。日本語検索してなくてよいなら、 以下のように、LANG=Cにすることで数十倍早く実行できる。

export LANG=C

パスワード付きzipファイルを作成する

  • 作成パスワード問い合わせをする
    1. zip -qr9 -e output.zip target
  • 作成時にパスワード問い合わせしない。ヒストリーにパスワードが残るのであまり良くない
    1. zip -qr9 -P <password> output.zip target
  • 展開時にパスワード問い合わせする
    1. unzip output.zip
  • 展開時にパスワード問い合わせしない。ヒストリーにパスワードが残るのであまり良くない
    1. unzip -P <password> output.zip

MD5を簡単に求める

md5sumを使う

md5sum ファイル名
echo -n "文字列" | md5sum

※オプション "-n" を付けないと、phpのmd5()関数との結果が違ってしまうので注意。


日付の新しい順でリスト表示

  • 日付の新しい順でリスト表示
    # ls -tl --full-time
    合計 96
    -rw-r--r--  1 root root   395 2006-11-24 16:38:46.000000000 +0900 id_rsa.pub
    -rw-------  1 root root  5310 2006-07-20 20:09:17.000000000 +0900 mbox

LAN内のネットワークは見えるが、外側のネットワークが見えない時は

内側だけに、pingが飛ぶ、外側には飛ばない場合は、
/etc/sysconfig/network にゲートウェイの設定がされていない事を疑う。

[root@bs1 root]# more /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=bs1
GATEWAY=192.168.254.1
[root@bs1 root]# service network restart

IP制限をかける

特定のIPからのアクセスを制限するには、/etc/hosts.allow と /etc/hosts.denyで行う。
例えば、ローカルLANのみ許可する場合は
/etc/hosts.allow

ALL: 192.168.1.0/255.255.255.0   # Local Network

/etc/hosts.deny

ALL:    ALL

sshポートしか空いていない場合にファイルをやりとりするには

scpコマンドを使う。
sshポートが空いていれば、ftpデーモンが起動していなくとも、使用できる。

hogeアカウントで、xxx.hoge.co.jpの*.txtをカレントに転送する場合。
再起は-rオプション

scp hoge@xxx.hoge.co.jp:\*.txt ./ 

グラフィカルログインとコンソールログインを切り替える

/etc/inittab を開き、「5」の部分を「3」にする。

#id:5:initdefault:
id:3:initdefault:

開いているポートを調べるには

nmapコマンドを使います。

# nmap IPアドレス

ディストリビューションのバージョンを確認するには

  • RedHat?/CentOSの場合は/etc/redhat-release, /etc/issueファイルにある
    1. more /etc/redhat-release
    2. Fedora Core release 1 (Yarrow)
  • その他
    1. Red Hat Enterprise Linux Server release 6.3 (Santiago)
    2. Red Hat Enterprise Linux Server release 6.2 (Santiago)
    3. Red Hat Enterprise Linux Server release 5.4 (Tikanga)
    4. Red Hat Enterprise Linux Server release 5.3 (Tikanga)
    5. CentOS release 6.3 (Final)
    6. CentOS release 6.2 (Final)
    7. CentOS release 6.1 (Final)
    8. CentOS Linux release 6.0 (Final)
    9. CentOS release 5.8 (Final)
    10. CentOS release 5.7 (Final)
    11. CentOS release 5.5 (Final)
    12. CentOS release 4.6 (Final)
    13. Fedora Core release 4 (Stentz)
    14. Debian GNU/Linux 4.0
    15. Turbolinux Server 6.5 (Jupiter)
    16. SUSE Linux Enterprise Server 9 (ia64)
  • バージョンチェック(bash)
    1. readonly TARGET_OS="CentOS .*release [5-6]|Red Hat Enterprise Linux .* [5-6]"
    2. # OSチェック
    3. CHK=`egrep "$TARGET_OS" /etc/redhat-release`
    4. if [ "$CHK" == "" ]; then
    5.     echo "Not support OS. Target $TARGET_OS"
    6.     exit 1
    7. fi
    8. echo "OK"

カーネル(kernel)のバージョン等を確認するには

  • grubで指定されているバージョンを知る
    1. sudo grubby --default-kernel
    2. /boot/vmlinuz-3.10.0-693.2.2.el7.x86_64
  • unameコマンドを使う
    1. # kernel versionのみ
    2. uname -r
    3. 3.10.0-693.2.2.el7.x86_64
    4.  
    5. # マシン
    6. uname -m
    7. x86_64
    8.  
    9. # -a: 全て
    10. uname -a
    11. Linux centos7.localdomain 3.10.0-693.2.2.el7.x86_64 #1 SMP Tue Sep 12 22:26:13 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
    12. Linux bs1 2.4.22-1.2115.nptl #1 Wed Oct 29 15:20:17 EST 2003 i686 i686 i386 GNU/Linux

Redhat Linux でパッケージ管理システム apt を使う

aptというのはDebianでのパッケージ管理システムでしたが、最近はredhat等のrpmベースのディストリビューションにも移植されています。

rpmとの違いは依存性のある関連パッケージも同時にダウンロードしてインストールしてくれるます。
rpmのようにインストールしようとすると依存するrpmが不足していていちいちダウンロードしてインストールする必要がありません。

インストール

http://apt.freshrpms.net/からDLする。

RedHat? Linux 9なら

# rpm -ivh http://ftp.freshrpms.net/pub/freshrpms/redhat/9/apt/apt-0.5.5cnc6-fr1.i386.rpm

パッケージ情報の更新

# apt-get update

依存性に問題ないかチェック

# apt-get check

phpをインストールしたい時は

# apt-get install php

主なコマンド

説明コマンド
パッケージデータベースの更新apt-get update
パッケージのインストールapt-get install パッケージ名
パッケージのアップグレード(インストール済みパッケージを最新にします)apt-get upgrade
ディストリビューションごとアップグレードされますapt-get dist-upgrade
パッケージのアンインストールapt-get remove パッケージ名
パッケージの検索apt-cache search 検索文字列
パッケージの依存関係表示apt-cache depends パッケージ名

添付ファイル: fileinitd-my-app.20171110.zip 76件 [詳細] filesyslog_caller.golang.zip 123件 [詳細] fileexample.chkconfig 636件 [詳細] filecheckconfig.x86_64.patch 522件 [詳細] fileautorestart.sh 1421件 [詳細] fileexclude.list 1036件 [詳細] fileDiCE 1206件 [詳細] filechangeseq.py 652件 [詳細] filecentos5.3_netinstall_error.jpg 968件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-06-21 (木) 20:04:33 (4d)