Linux †
screen: 仮想端末上でセッションを継続させる †
ログインIPの確認 †
- FROMにログイン元IPが表示される
w -i
16:12:56 up 4:53, 2 users, load average: 0.54, 0.56, 0.53
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
user01 pts/0 192.168.61.1 11:27 32.00s 10.58s 0.00s ssh -F ssh-config -W bashton:22 web-01
user01 pts/1 192.168.61.1 11:44 0.00s 0.69s 0.00s w -i
paste: 行方向のマージ †
バージョン番号のソート †
単純にソートすると、「1.1.0, 1.10.0, 1.2.0」の順に並んでしまう。
- "."区切りで、整数でソートして、降順に表示
sort -t . -n -k 1,1 -k 2,2 -k 3,3 -r /tmp/ver.txt
2.0.0
1.10.0
1.2.0
1.1.0
0.10.0
0.2.0
0.1.0
0.0.10
0.0.2
0.0.1
ネットワークの疎通確認 †
sleepは1秒以下の値も指定できる †
- CentOS 7.x
- sleep 8.22 (coreutils-8.22-18.el7.x86_6)
swapを使っているプロセスを探す †
- CentOS 6.x
- swapを使っているプロセスの上位10件
grep VmSwap /proc/*/status | sort -k 2 -r | head -n 10
/proc/1337/status:VmSwap: 848 kB
/proc/1357/status:VmSwap: 840 kB
/proc/1035/status:VmSwap: 676 kB
...
# pidからコマンドや引数名を得る
grep VmSwap /proc/*/status | sort -k 2 -r | head -n 10 | cut -d/ -f 3 | xargs -i ps -o pid,comm,args h {}
1337 master /usr/libexec/postfix/master
1357 qmgr qmgr -l -t fifo -u
1035 rsyslogd /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
...
/etc/passwdからユーザ情報(HOME/SHELL等)の取得 †
ドットから始まるファイルをコピー/移動 †
通常「cp src/* dest/」としても、ドットから始まるファイル/ディレクトリは対象外になる
プロセス毎のUSS,PSS,RSSを確認 †
- プロセス毎のメモリ
- VSS(VSZ): 仮想メモリの使用量
- RSS: 物理メモリの使用量(共有メモリの使用量を含める) 多数のプロセスで共有メモリをシェアしている場合、RSSの合計は物理メモリを超えてしまう。
- PSS: 物理メモリの使用量(共有メモリの使用量をプロセス間で等分する)
- USS: 物理メモリの使用量(共有メモリの使用量を除く)
GNU parallel コマンドの並列実行 †
ディレクトリ移動時にワイルドカードを使う †
HDD廃棄時のデータ削除/消去/フォーマット †
HDDを廃棄する時に安全に削除を行うツール
SSDは「Secure Erase」が安全。
rmコマンドでゴミ箱に入れる †
"rm -rf /" や "rm .*" 等の事故を防ぎたい。
- ファイル/ディレクトリを直接削除するのではなく一度ごみ箱「~/.Trash/」に入れるようにする
- ゴミ箱中の同名ファイル/ディレクトリはファイル名末尾に「.~1~」のように番号が付く
- 30日より前のファイルは削除
- aliasではないrmを実行したい場合は「\rm」のようにする
NetworkManager †
/etc/resolv.confの自動書き換え停止するために、NetworkManagerを止めていたが割と便利そう
ディレクトリ構造を維持してコピー †
cp --parents /etc/hosts /tmp/
tree /tmp/etc/
/tmp/etc/
└── hosts
sshdの設定を確認する †
- 現在の設定を確認
sudo sshd -T | sort
vuls: CVE脆弱性チェックツール †
slabメモリ使用量が肥大しメモリ不足になる †
curl(libcurl)で定期的にhttps://リクエストを発行するようなサーバでメモリ不足になる。
topでみても怪しげなプロセスは無い。
「slabtop」で見るとdentryが異常にメモリを使っている。
- 対策
- slabキャッシュ解放
sync; echo 2 > /proc/sys/vm/drop_caches
- curl, nssの更新
sudo yum update curl nss-softokn
- curlを実行するスクリプトに追加。2択
export NSS_SDB_USE_CACHE=yes
# または
export TMPDIR=/dev/shm
abrtd:コアダンプした時にiowaitが高くなる/コアダンプファイルが消える †
CentOS6/7だと abrtd が起動しており、設定によってはコアダンプした後にすぐ消すようだ。
コアダンプ対象のプロセスのメモリ使用量が大きいと、数GBのファイルを作った後に消すという無駄な処理のため、iowaitが高くなる場合がある。
先頭行/任意の行に追加 †
rename: ファイル名の一括変更 †
- 「*.htm」のファイルを「.htm」から「.html」に名前を変更する
rename .htm .html *.htm
デバイスのUUIDを調べる †
HDD入れ替え等でfstabを書く際に、デバイスの接続順が変わっても、明示的にドライブを指定できる。
- 例:/etc/fstab (Ubuntu 12.04 LTS)
proc /proc proc nodev,noexec,nosuid 0 0
UUID=e0aeadc6-742f-42b4-b0e4-de4ecd6f5abd / ext4 errors=remount-ro 0 1
UUID=b599d616-e521-449f-89a0-7f838614bc56 /boot ext2 defaults 0 2
UUID=9874055b-0ddc-4910-a319-fc3c1e20ab81 none swap sw 0 0
ユーザをサブグループに追加 †
- 「/etc/group-」は1世代前のバックアップなので間違ってusermod -Gした場合は復元できる。
/etc/fstabの構文チェック †
sudo mount -fav
Linuxコマンドの色付け †
ポート解放確認 †
- ncを使う
- CentOS 6.x: 「-w 3」で3秒でタイムアウト
nc -zv -w 3 www.example.com 80;echo $?
Connection to www.example.com 80 port [tcp/http] succeeded!
0
- CentOS 7: ncがncatのエイリアスに変わった。v6.40以下は「-z」オプションが使えなくなった。6.50では「-z」オプションが追加されたようで使える。
nc -v -i 1 -w 3 www.example.com 80;echo $?
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 93.184.216.34:80.
Ncat: Idle timeout expired (1000 ms).
1
# または
timeout 1 bash -c 'cat < /dev/null > /dev/tcp/www.example.com/80';echo $?
# 正常の場合:0 / 異常(timeout)の場合:124
ネットワーク帯域制限 †
パスワード有効期限の設定 †
- 現在の設定を確認
chage -l <username>
core dump コアダンプを出力 †
nscd: DNSキャッシュ †
- nscdが動作している場合、/etc/nsswitch.conf を変更しても設定が変わらない。その場合、nscdを再起動してみる。
timeout: コマンドを指定秒数でタイムアウトさせる †
- 指定秒数でタイムアウトさせたいが、コマンド自体にはオプションが無い場合に使える
- CentOS6のcoreutils-8.4-19.el6.x86_64にはデフォルトで入っている
ホスト名の変更 †
- CentOS6.x で検証
- /etc/hosts に書く場合、FQDNを先に書く必要がある。そうしないとhostname -fでFQDNが取得できない
- 例:web01.example.com に変えたい場合
タイムゾーンの変更 †
- CentOS6.x, UTC => JSTに変更する場合
- crondの再起動が必要
- /etc/localtimeを更新するコマンドがあるので使う
HDDの修復 †
巨大なダミーファイルを作成する †
ログインシェルなしのユーザで、コマンドを実行 †
less /etc/passwd | grep apache
apache:x:48:48:Apache:/var/www:/sbin/nologin
sudo su - apache --shell=/bin/bash --command="pwd"
/var/www
od: 16進数ダンプ †
pkill:名前を指定してプロセスをkill †
pgrepで探したプロセスをkillするのに使える
md5deepでファイルのベリファイ †
ファイルのmd5ハッシュをとってリスト化し、比較してくれるツール
- ハッシュの作成には、SATA接続HDDの1.1TBのデータに対して、約13時間かかった
- ハッシュリスト作成時エラー。標準出力に出る
- No such file or directory
- UTF-8のファイルを比較した時、いくつかmd5が事なる場合があった。しかし、異なった結果になったファイルを「md5sum filename」で比較すると同じだった。
ext3/4でフォーマットする時に5%がroot用に予約される †
特にオプションをつけずにmkfs.ext3/4等でフォーマットすると 5%がroot向けに予約されるようだ。(2TBなら100GB、3TBなら150GB)
データ用ドライブなら不要だと思う。
また大きいファイルだけを扱うならば、「-T largefile」とするとi-nodeが少なくなり、フォーマットの時間が短くなる。
iowaitの高いプロセスを調べる †
プロセスの起動/経過時間の取得 †
- psコマンドを使う
- lstart: プロセスの起動時間
- etime: プロセス起動からの経過時間。[[dd-]hh:]mm:ss
ps -eo pid,ppid,lstart,etime,cmd h
...
1303 1 Thu May 29 09:52:18 2014 06:04:05 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
1339 1 Thu May 29 09:52:20 2014 06:04:03 /usr/sbin/sshd
...
- etimeを秒に変換。例: crond
# psの結果
ps -eo comm,user:32,etime,args h | grep -P "^crond\s+root"
crond root 01:50:19 crond
# 秒に変換
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"'
6619
CentOS6.xでIPv6の無効化 †
echo "NETWORKING_IPV6=no" >> /etc/sysconfig/network
echo "options ipv6 disable=1" >> /etc/modprobe.d/disable-ipv6.conf
service ip6tables stop
chkconfig ip6tables off
vim /etc/hosts
----
#::1 localhost
----
service network restart
PowerTOP: 省電力化 †
serf: クラスタ作ってイベント送受信して色々やる †
curlでSSLが失敗する場合 †
curlが参照している中間証明書(CA)が古い場合にも起きる。
php等でlibcurlを使っている場合も同様。
gawkでグループマッチ †
mv: inter-device move failed: †
- 異なるデバイス間でmvした時に発生する時がある
- cp -r してから、rm -rf すれば良い
ゾンビプロセスの数 †
CentOS6.xでmkpasswdを使う †
yum install expect
操作ログをファイルに保存する †
- scriptでCUI操作ログをとる 来栖川電算
- そのままではscpで接続できない&scriptプロセスが残り続ける問題があるため改良
vim /etc/profile.d/user-logging.sh
----
LOG_DIR=/tmp
if [ -n "$SSH_CLIENT" ]; then
TOPPROCESS_JUDGE_TOKEN='sshd:'
else
TOPPROCESS_JUDGE_TOKEN='login'
fi
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
SCRIPTLOGFILE="${LOG_DIR}/$(whoami)_$(date +%Y%m%d%H%M)_$$.log"
touch $SCRIPTLOGFILE
chmod 600 $SCRIPTLOGFILE
script $SCRIPTLOGFILE
exit
fi
----
ネットワークスループットの測定 †
OS判別 †
cat /etc/issue | cut -d ' ' -f 1 | head -1 | tr "[:upper:]" "[:lower:]"
centos
ubuntu
raspbian
リモートシャットダウン用ユーザ †
Windows Server 2003 R2 †
- Administrative Tools > Active Directory Users and Computers > Users
- New > User
- First name: shutdown
- User logon name: shutdown
- Password never expires: checked
- Administrative Tools > Default Domain Controller Security Settings
- Local Policies > User Rights Assignment
- Allow log on locally
- Add User or Group : EXAMPLE\shutdown
- Shutdown the system
- Add User or Group : EXAMPLE\shutdown
- Force shutdown from a remote system
- Add User or Group : EXAMPLE\shutdown
- open command prompt(cmd.exe)
CentOS6.x †
- リモートからsudoコマンドを使えるように
visudo
----
Defaults !requiretty
----
- シャットダウン用ユーザを作成し、パスワードを設定(CentOS6.xには既に存在したので不要)
useradd -g root -M shutdown
passwd shutdown
- スクリプトを配置して、ログインシェルに指定(/etc/passwordのログインシェルに引数を設定できなかったため)
echo -e '#!/bin/sh\n/usr/bin/sudo /sbin/shutdown -h now' > /usr/local/sbin/shutdown.sh
chmod 750 /usr/local/sbin/shutdown.sh
vipw
----
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
shutdown:x:6:0:shutdown:/sbin:/usr/local/sbin/shutdown.sh
----
visudo
----
shutdown ALL=NOPASSWD: /sbin/shutdown, /sbin/halt, /sbin/poweroff, /sbin/reboot
----
- テスト(実際にシャットダウンするので注意)
su - shutdown
指定範囲の行を取得 †
- 1 〜 10までの行を作成
seq 10 > seq.txt
- sedを使う
sed -n '2,4p' seq.txt
flockでファイルロック †
- CentOS5以上なら使える
- -n : non-block。ロックできない場合は即終了。終了ステータスは1
psで特定のカラムだけ表示と集計 †
- comm は15文字を超えるとカットされる。「comm:20」にしても拡張できなかった
- user は 8文字を超えると uid で表示される。「uid:20」と最大文字数を指定すれば表示される
pidstatでプロセス毎の統計情報の取得 †
- sysstat-8.0以上に含まれている
- CentOS6.xのsysstatパッケージにpidstatが含まれているが、CentOS5.xには入っていない
- マルチコアの場合、%CPU等の値が100を超えるなど変
- CentOS6.3(sysstat-9.0.4-20.el6.x86_64 にはpidstat含まれている)
yum install sysstat
# 一覧表示
pidstat
Linux 2.6.18-308.1.1.el5 (hostname) 07/09/13 _x86_64_ (2 CPU)
17:49:10 UID PID %usr %system %guest %CPU CPU Command
17:49:10 0 1 0.00 0.00 0.00 0.00 0 init
17:49:10 0 3 0.00 0.00 0.00 0.00 0 ksoftirqd/0
...
# PIDを指定
pgrep -u apache httpd
...
30222
# 1秒おきに、2回取得
pidstat -p 30222 1 2
Linux 2.6.18-308.1.1.el5 (hostname) 07/09/13 _x86_64_ (2 CPU)
17:51:42 UID PID %usr %system %guest %CPU CPU Command
17:51:43 48 30222 0.00 0.00 0.00 0.00 1 httpd
17:51:44 48 30222 0.00 0.00 0.00 0.00 1 httpd
Average: 48 30222 0.00 0.00 0.00 0.00 - httpd
- CentOS5.8(sysstat-7.0.2-12.el5 にはpidstat含まれない) srpmからインストール
cd /usr/src/redhat/
wget http://pagesperso-orange.fr/sebastien.godard/sysstat-10.1.6-1.src.rpm
rpm -ivh --nomd5 sysstat-10.1.6-1.src.rpm
rpmbuild -ba SPECS/sysstat-10.1.6.spec
rpm -Uvh RPMS/x86_64/sysstat-10.1.6-1.x86_64.rpm
共同作業用ディレクトリの作成 †
- 共有ディレクトリ:/var/www/example.com
- 共有グループ:share
sudo groupadd share
sudo mkdir -p /var/www/example.com
sudo chown :share /var/www/example.com
sudo chmod 775 /var/www/example.com
sudo chmod g+s /var/www/example.com
- 同じshareグループのユーザが新規ファイル作成すると0644、新規ディレクトリ作成すると2775になる
- SGIDの削除
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)論文に触発されたものである。
障害調査 †
psで省略されてしまうプロセスの長い引数を表示 †
デフォルトでは長い引数は省略されてしまう。"w"か"ww"を付ける
curlオプション †
- -s/--silent プログレスメータやエラーメッセージを表示しない
- -S -sと併用するとエラーメッセージだけ表示する
- -H/--header <line> : httpヘッダ等を付与できる
- -T/--upload-file <file> : PUTメソッドでファイルを送信
- -X POST 等のメソッドを指定。デフォルトはGET
- -d "key=value" でデータを送信できる。-X POST -d "key1=value1" -d "key2=value2"
- -o filename 出力をファイルに保存
- -O アクセスしたファイルがindex.htmlなら同じ名前で保存
- -i http headerも出力
- -I http headerのみ表示。HEAD メソッドと同じ
- -A ユーザエージェントを指定
- -L リダイレクトされていても取得
- --insecure SSL証明書を無視
ログの集計 †
- grep -Pでperl互換の正規表現が使えるので便利
UID/GIDを変更する †
GNU Partedでパーティションリサイズ他 †
- GNU Parted
- 2TB以上のHDDを扱える
- fdisk, resize2fs の作業を一度に行える
圧縮されたテキストファイルを解凍せずに見る †
プロセス一覧の取得 †
umountでdevice is busy エラー †
seq 規則的な数値を得る †
- 数値の連番(FIRST LAST)
seq 0 3
0
1
2
3
- 10から、-2つづ、5まで(FIRST INCREMENT LAST)
seq 10 -2 5
10
8
6
- -s: 区切り文字を指定
seq -s , 0 3
0,1,2,3
crontabでログ処理 †
- bash,zshで標準出力、標準エラーまとめてリダイレクト
command >& /dev/null
仮想コンソールの数を減らしてメモリ節約 †
メモリ節約のためクラウド環境(AWS EC2等)なら仮想コンソールは1つで良い。デフォルト6つ
フリーズした時の対処 †
- 端末、ターミナル
- 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で削除ファイル復元 †
- 例:/dev/sdb1 のファイルを削除してしまった場合
- /dev/sdb1で余計な書き込みはせず、別パーティションで extundelete のビルドを行う
- ext3/ext4等、パーティションフォーマット確認。
df -T
trコマンドで置換 †
# file内の文字'e'を'x'に変換する。
tr e x < file
# file内の小文字を大文字に変換する。
tr '[a-z]' '[A-Z]' < file
# file内のスペースをすべてタブに変換する。
tr ' ' '\11' < file
# file内の複数スペースをすべて1つのタブに変換する。
tr -s ' ' '\11' < file
# file内のスペースをすべて削除する。
tr -d ' ' < file
rootパスワードを忘れてしまった場合 †
物理サーバが手元にある場合、またクラウドでもさくらのVPSのように「コンソール」が提供されkernel選択画面が使える場合は、シングルモードに入りrootユーザのパスワードを変更できる。
CPUコア数を調べる †
- CentOS6.x
- CPUコア数を調べる(Intel HTなら物理CPUより増える)
cat /proc/cpuinfo | grep "processor" | wc -l
2
egrep -c "^processor[[:space:]]+:[[:space:]]+[0-9]+$" /proc/cpuinfo
2
# coreutils にある
nproc
2
# util-linux-ng にある
LANG=C lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
...
# glibc-common にある
getconf _NPROCESSORS_ONLN
2
crontabで%はエスケープが必要 †
crontab -eで編集する際、パラメータ等に「%」が含まれていると正常に実行されないので「\%」とエスケープが必要
atime,ctime,mtimeの取得取得 †
cutでデリミタの無い行を無視する †
デリミタの無い行の場合"-f1", "-f2"でもすべて同じ値になる。
そのような行を無視したい場合は"-s"を付けると良い。
echo -e "var1" | cut -f1
var1
echo -e "var1" | cut -f2
var1
echo -e "var1" | cut -s -f1
echo -e "var1\tvar2" | cut -s -f2
var2
新規ユーザ追加時の処理 †
- /etc/skel/ ファイルやディレクトリを置くと useradd 時に自動的にコピーされる
ユーザID(名前)、グループID(名前)の取得 †
id hoge
uid=500(hoge) gid=500(hoge) 所属グループ=500(hoge)
id -u
500
id -u -n
hoge
id -g
10
id -g -n
wheel
alternativesで複数ソフトを共存 †
MTAやJAVAなど複数ソフト、バージョンを切り替えて使える
高速に空ファイルを生成 †
セキュリティ †
CentOS6.x †
複数のサーバリソースを見る「dstat」 †
- dstat
- python製
- cpu,memory,network,disk,mysql等々
ログアウト後もコマンドを実行したままにする †
通常、ssh等でログインした場合、ログアウトした時点で実行したプロセスは停止する。
時間がかかる処理やデーモン化させたい処理がある場合。
- 新規コマンドを指定する場合。実行中の標準出力は"nohup.out"に保存される
nohup hoge.sh &
- 既存プロセスを指定する場合
disown job番号
ログイン失敗したlinuxアカウントをロックする †
vi /etc/pam.d/password-auth
----
auth required pam_env.so
# 6回以上の失敗アクセスがあった場合、システム管理者がリセットするまで無効
auth required pam_tally2.so deny=6
auth sufficient pam_unix.so try_first_pass nullok
auth required pam_deny.so
account required pam_unix.so
password requisite pam_cracklib.so try_first_pass retry=3 type=
# 過去4回のパスワードを回転使用できないように
password sufficient pam_unix.so try_first_pass use_authtok nullok sha512 shadow remember=4
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
----
迷惑/スパムメール対策 †
ログの削除 †
# 公開鍵の消去
echo "" > /root/.ssh/authorized_keys
# ログの消去
# /var/log/cron.1 や cron.1.gz も削除
find /var/log/* -regextype posix-egrep \( -regex ".+\.[0-9]+$" -or -regex ".+\.[0-9]+\.gz$" \) -type f -delete
echo "" > /var/log/boot.log
echo "" > /var/log/btmp
echo "" > /var/log/cron
echo "" > /var/log/dmesg
echo "" > /var/log/dmesg.old
echo "" > /var/log/lastlog
echo "" > /var/log/maillog
echo "" > /var/log/messages
echo "" > /var/log/secure
echo "" > /var/log/spooler
echo "" > /var/log/tallylog
echo "" > /var/log/wtmp
echo "" > /var/log/yum.log
echo "" > /var/log/audit/audit.log
if [ -d /var/log/httpd ]; then
for file in `ls /var/log/httpd/*_log`; do
echo "" > $file
done
fi
if [ -f /var/log/mysqld.log ]; then
for file in `ls /var/log/mysql*.log`; do
echo "" > $file
done
fi
if [ -f /var/log/postgresql.log ]; then
for file in `ls /var/log/postgresql*.log`; do
echo "" > $file
done
fi
# コマンドヒストリーのクリア
history -c
複数ユーザの一括作成 †
日付と時刻 †
swapを追加 †
DNSの引っ越し †
DNSの確認 †
- dnsサーバを指定する場合
$ dig @DNSサーバ ドメイン名
ディレクトリ内のファイル数カウント †
複数ファイル内容の文字コードを変換 †
数値を規則的に増加/減少させるseqコマンド †
httpingでHTTPポーリング †
pingライクにhttpチェックができる
sed †
ファイルシステムのパラメータを調整 tune2fs †
- 状態の表示
tune2fs -l /dev/sda1
- 倉庫として使う場合、root用予約領域を0%に変更。
tune2fs -m 0 /dev/sda1
- 2TB HDDの場合5%程root用として確保されていた。
- 「tune2fs -l」では「Reserved block count:」として表示される
バックアップ、リストア †
サーバ設定、自動化Capistrano, Chef, cloudinit †
- CloudInit Ubuntuに搭載されたクラウド環境でのセットアップツール。割と簡単に指定できる
ユーザ毎のcronファイル †
- 以下にユーザ毎にファイルができる
/var/spool/cron/USERNAME
ディスク使用量の多いディレクトリを表示 †
ファイルディスクリプタが足りなくなった時 †
- /etc/rc.d/init.d/functions か肝心なので軽く読んでみると良い
. /etc/rc.d/init.d/functions
- 例
cat max
# CentOS5.4の場合のデフォルト
102274
- 動的に設定
echo 102274 > /proc/sys/fs/file-max
- 設定ファイルに指定
- /etc/sysctl.conf
fs.file-max=102274
小技 †
ddコマンド中の進捗を見る †
- Pipe Viewer を使う。CentOS5.xの場合rpm, yum RPMforgeが使えた
yum install pv --enablerepo=rpmforge
#または
wget http://pipeviewer.googlecode.com/files/pv-1.1.4-1.i386.rpm
sudo rpm -ivh pv-1.1.4-1.i386.rpm
# 実行例
dd if=/dev/zero count=1024 bs=1M | pv -s 1g > output.log
024+0 records in67.4MB/s] [===============================================================================> ] 98% ETA 0:00:00
1024+0 records out
1GB 0:00:11 [91.3MB/s] [=================================================================================>] 100%
1073741824 bytes (1.1 GB) copied, 10.751 seconds, 99.9 MB/s
テキスト操作 †
lsで日付の昇順にソート †
ls -ltr
kernel: ACPI: Unable to turn cooling device †
IDE/SATA HDDの情報を見る †
echoで改行したい時 †
- 通常。\も表示される
$ echo 'a\nb'
a\nb
- 改行したい時。-eオプション
$ echo -e 'a\nb'
a
b
- 一時的に改行したい時。$'\n'
echo $'\n''\n'
\n
lsyncd+rsyncdでリアルタイムミラー †
yum install lsyncd -y --enablerepo=rpmforge
ファイル名の文字コードを変換する †
- インストール
yum -y install convmv
WARNING: UNPROTECTED PRIVATE KEY FILE! †
ログイン時にメッセージを表示する †
# vi /etc/motd
----
__| __|_ ) Fedora 8
_| ( / 32-bit
___|\___|___|
Welcome to an EC2 Public Image
:-)
Base
--[ see /etc/ec2/release-notes ]--
----
ヒアドキュメント †
cat >> hoge.txt << EOS
a
b
c
EOS
bonnie++ディスクベンチマーク †
- デフォルトでは、バッファキャッシュによる測定誤差を小さくするため、実メモリサイズの2倍の一時ファイルが測定時に作成される。測定対象のパーティションの空き容量に注意が必要。
アーキテクチャの判別 †
uname -i
i386
x86_64
32bit/64bitかどうか判定 †
getconf LONG_BIT
32 // 32bit
64 // 64bit
tcpflowでパケットキャプチャ †
- tcpflow
- Man page of TCPDUMP tcpdumpと同じ書式のフィルタが使える
- 管理者必見! ネットワーク・コマンド集 - tcpdumpコマンド:ITpro
- yumの場合
yum install tcpflow --enablerepo=rpmforge
- rpmをダウンロードする場合
sudo yum install libpcap http://pkgs.repoforge.org/tcpflow/tcpflow-0.21-1.2.el6.rf.$(uname -i).rpm
- 実行
# HTTP:80をパケットキャプチャしてコンソールに出力。-cを省略するとファイルに出力
sudo tcpflow -cs port 80 -i eth0
CTRL+Cで停止
# 送受信が[IP Address]かつポート80のパケットのみキャプチャ(HTTPリクエスト/レスポンス)
tcpflow -cs -i eth0 host [IP Address] and port 80
# 送信元が[IP Address]かつポート80のパケットのみキャプチャ(HTTPリクエストのみ表示)
tcpflow -cs -i eth0 src host [IP Address] and port 80
# 送信先が[IP Address]かつポート80のパケットのみキャプチャ(HTTPレスポンスのみ表示)
tcpflow -cs -i eth0 dst host [IP Address] and port 80
- -c: コンソールのみに出力
- -s: 表示できない文字を"."に変えて出力
- -i: eth0 等のNICを指定
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が必須
sudo yum install time
ソースからドキュメントを生成 doxygen †
- centos5.3
yum install doxygen
- mscgen dot記法に似たテキストからシーケンス図を作成できる
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
libiconvのインストール †
ディレクトリ単位でディスク使用量を表示 †
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あれば問題なくインストールできる。

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]]
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
ポートフォワーディング †
- 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
ソースコード検索 †
- ack だと、svnやcvsの管理ファイルは無視してくれて、色も付いて色々便利
ロケールShift_JISを追加する †
# localedef -f SHIFT_JIS -i ja_JP ja_JP.SJIS
# export LANG=ja_JP.sjis
Unix/Linuxコマンドリファレンス †
ファイル分割 †
強制コピー †
rootでcp -fしても、「yes/no」と訪ねられる。yesコマンドの出力を食わせてやればよい。
$ yes | cp -f ...
sshポートフォワーディング †
- 以下3台のLinuxサーバがあり、remotehost2への接続はremotehost1経由でしか行えないとする。
- localhost
- remotehost1
- remotehost2
- 安全に localhost -> remotehost2へファイルをコピーしたい場合
- hostA上でremotehost1のsvnからチェックアウト
shift_jisのディレクトリの一覧 †
ソースコード検索ack †
"grep -r"の代わりに使える。
デフォルトで CVS, RCS, .svn, blib といったバージョン管理ディレクトリを無視、-i, -v といった grep 由来のコマンドラインや、 --perl で perl ソースコードだけ検索。カラーリングにも対応。
manで文字化けする場合 †
- 日本語判別が強化されている lv を使う
- 以下のようなファイルを作り、source ファイル名 で読み込む
usb機器一覧の表示 †
Redhat系ならば、lsusbがある。
あとはlshwとか。
- /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で絞り込んで、それをファイルに出力しようとしても、以下の方法では何も出力されません。
HDD増設 †
- 接続されているドライブ確認
# 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
...
- fdiskで領域確保
# fdisk /dev/hdd
m - help
p - 現在の領域設定表示
n - 新規に領域作成
w - 書き込み
- フォーマット(-c オプション付けると不良セクタを検査する)
# mkfs.ext3 /dev/hdd1
- マウント
# mkdir /mnt/hdd1
# mount -t ext3 /dev/hdd1 /mnt/hdd1
- 自動マウント設定 (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
デバック用コードを有効にする †
デバック時にのみ有効にしたいコードが有る場合、Makefile, gcc, cc時にオプションで「-DDEBUG」を付ける事により、ソース中に「#define DEBUG」記述するのと同じ効果を持たせる事ができる。
Makefile
---------------------------------
CFLAGS = -g -O2 -DDEBUG
---------------------------------
test.c
---------------------------------
#ifdef DEBUG
printf("DEBUG:...");
#endif
---------------------------------
JPEG2000形式のファイルを他形式に変換する †
Windowsでもbmp -> jpeg2000は可能だが、逆がほとんどない。
複数ファイルの一括変換ができなくて面倒。
- jasper
- 対応形式
Value | Description |
bmp | Windows BMP |
jp2 | JPEG-2000 JP2 |
jpc | JPEG-2000 Code Stream |
jpg | JPEG |
pgx | PGX |
pnm | PNM/PGM/PPM |
mif | My Image Format |
ras | Sun Rasterfile |
Shift_JISでコマンドラインを使う †
- Shift_jisを追加
# localedef -f SHIFT_JIS -i ja_JP ja_JP.sjis
- 確認
# locale -a | grep ja
ja_JP
ja_JP.eucjp
ja_JP.sjis
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
- 設定
# export LANG=ja_JP.SJIS
whichコマンドの代わりは? †
patchの作成/適用 †
ハードウェア情報を一括表示する †
- lshwを利用する
htmlやxml形式でハードウェア一覧を出力できる。
hosts.allowで制限できる範囲 †
inetd経由のデーモンのみ制御可能。
よって、apache等はその範囲ではない。
ただし、最近はlibwrapを取り込んでいるらしく、inetd経由でなくとも有効になるものがある。
lddコマンドでリンクしてるライブラ^processorリをみてlibwrap.soとかリンクしてれば制限かかるらしい。
rootkit検出ツールによる検査 †
ハッキングに利用されるrootkitを検出するツール。
http://www.chkrootkit.org/
- インストール
$ 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/
- 実行
# ./chkrootkit
- 日に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
- 実験
# /etc/cron.daily/chkrootkit
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をインストールする場合
- 古いバージョンのPHPを削除しておく
http://blogs.yahoo.co.jp/airmikan/31578937.html]]
rpm -e 古いパッケージ名
- 新しいsrpmをどこかからDLし、インストールする。
rpm -ivh php-4.3.3-4.1.src.rpm
- 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]]
- コンパイル&インストール
# 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
- できあがったlibphp4.soへのリンクを張る
# ln -s /usr/lib/apache/libphp4.so /etc/httpd/modules/libphp4.so
- サービスの再起動
# service httpd restart
- 確認
phpinfo.php等のファイルを作り確認する。
<?
phpinfo();
?>
オープン可能なファイル数の上限を確認する †
ファイルをオープンできる上限に達する現象は、
非常に負荷の高いWEBサーバーなどでみられる
ディスクの使用量が多いユーザーを調べる †
SELinuxを無効にする †
パーミッションを許可しているのにエラーとなる場合は、これを疑う。
md5sum/sha1sum: チェックサム作成/検証 †
md5sum, sha1sum 等を使って、ファイルの破損等検証を行う。
- 他に sha224sum sha256sum sha384sum sha512sum とあるが、ビット数が大きいほど計算が遅い
- 標準入力から
echo -n "文字列" | md5sum
※"echo -n" で改行を出力しない事で、phpのmd5()関数と同じ結果になる。
日付の新しい順でリスト表示 †
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アドレス
ディストリビューションのバージョンを確認するには †
カーネルのバージョン等を確認するには †
unameコマンドを使う。バージョン情報のみは -r。全ては --all。
# uname --all
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 パッケージ名 |