Linux開発環境の基礎知識

  • 2539
    いいね
  • 8
    コメント

自分が長期間Linuxを使わずに、ある時に急に使うことになったりするのでコピペで使える知識をまとめたものです。自分用のメモですのでエントリとして書くのを少しためらいましたが、同じ境遇の人がコピペで使えれば便利かなと思い記事にしました。

MacOSはLinuxではなくBSD系ですが、パッケージコマンドの中に少し紹介してます。
CentOS7などに対応してないのでどなたか編集リクエスト送って頂けると助かります。

個人の設定ファイル

ホームディレクトリに設定ファイルがある。

場所 意味
.bash_profile ログイン時だけ読み込まれる
.bashrc シェルを起動するたびに読み込まれる

バイナリやライブラリの場所

参考
http://ja.wikipedia.org/wiki/Filesystem_Hierarchy_Standard

場所 意味
/bin 基本的なシステムコマンドのバイナリが置かれる
/sbin 基本的なシステム管理コマンドのバイナリが置かれる
/lib システムが提供するライブラリ
/usr/bin 基本的ではないシステムが提供するバイナリが置かれる
/usr/sbin 基本的ではないシステム管理コマンドが置かれる
/usr/lib /libとほぼ同じ
/usr/include C言語のインクルードヘッダ
/usr/libexec 内部的に呼ばれる補助コマンド
/usr/local 自分でコンパイルしたものが配置される場所(以下同じ)
/usr/local/bin
/usr/local/lib
/usr/local/include
/usr/local/opt
/usr/src/ カーネルのソースコードとヘッダファイル
/opt/local/bin パッケージソフトウェア(主にバイナリのblob)のインストール先に用いられることが多い
/opt/local/lib パッケージソフトウェア(主にバイナリのblob)のインストール先に用いられることが多い
/etc 各種アプリケーションの設定ファイル
/var/log アプリケーションのログが出力される
/var/www/html ウェブサーバーのドキュメントルートとして使われることが多い

パッケージ管理コマンド

ディストリビューション コマンド
RedHat系 yum
Mac brew
Debian系 apt-get

全てのパッケージアップデート

apt-get update && apt-get dist-upgrade

yum update

brew upgrade

パッケージがインストールされた場所

パッケージによって違う。

ディストリビューション 調べる方法
ubuntu dpkg -L パッケージ名
redhat(yumも同じ) rpm -ql パッケージ名
MacOSX 「/usr/local/Cellar」にインストールされ「/usr/bin」にリンクされる

自分でソースをビルドする

ネットから取得して解凍してコンパイルする場合。

wget http://目的のソース.tar.gz
tar -xvf 目的のソース.tar.gz
cd 目的のソース
./configure
make
sudo make install

インストールする場所を自分で決める場合は

./configure --prefix 場所

gccで自分でコンパイル

test.ccをコンパイルする場合。

gcc -Lライブラリパス -Iインクルードファイルパス -lライブラリ名 -o 出力バイナリ名 test.cc

共有ライブラリは「lib~.a」というような名前なので、-lで指定する際は「~」の部分だけでいい。

パッケージを入れる場合

デフォルトだと「/usr/bin」が先に検索されるので、${PATH}で「/usr/local/bin」を先に検索するように設定しておく。

綺麗に保ちたい場合は自分でコンパイルするソースを「./configure --prefix 場所」で決めた場所にインストールして、その都度パスを通した方がいい。

共有ライブラリの依存を調べる

共有ライブラリは拡張子が「.so」のファイル。
lddコマンドでプログラムの依存ライブラリが調べられる。

ldd /bin/cp
  libc.so.6 => /lib/libc.so.6
  /lib/ld-linux.so.2 => /lib/ld-linux.so.2

MacOSXの場合は

otool -L

環境変数の一覧確認

printenv

パスの指定

変数名 意味
$PATH バイナリの検索パス
$LD_LIBRARY_PATH ライブラリの検索パス
$C_INCLUDE_PATH C言語のインクルードパス

書いてある順番で優先して見つけて実行される。
:で区切って;で終わらせる。
「=/usr/local/lib」を優先して検索するように設定して反映する例。

$ LD_LIBRARY_PATH=/usr/local/lib:/usr/lib;
export LD_LIBRARY_PATH

上記は一時的に反映する場合。
恒久的に反映する場合は、「.bash_profile」か「.bashrc」に書いてからsourceコマンドで反映する。

vi ~/.bashrc
書き込む
source ~/.bashrc

ファイル解凍

.tar.gz

tar zxvf filename.tar.gz

.bz2

tar xvfj filename.bz2 

viの最低限のコマンド

コマンド 意味
i 挿入モード
a 次の文字から挿入モード
x 1文字消す
D 行末まで削除
q 終了
q! 強制終了
w 保存
wq 保存して終了
gg ファイルの先頭へ移動
:数字 指定行へ移動
G ファイルの末尾へ移動
Ctrl + f 次の画面へ移動
Ctrl + b 前の画面へ移動
0 行の先頭へ移動
$ 行の末尾へ移動
w 次の単語へ移動
b 前の単語へ移動
W 次の空白へ移動
B 前の空白へ移動
yy コピー(前に数値でコピー行数指定)
p ペースト(カレント行)
P ペースト(カーソルの下)
dd 削除(前に数値で削除行数指定)
u 作業取り消し
/[文字列] 前方検索
?[文字列] 後方検索
n 次の候補
N 前の候補
:% s/置換前文字列/置換語文字列/g 置換
:set number 行番号表示
:syntax off 色を消す

gitでcloneしてコミット

git clone URL
git add index.html
git commit -m "コメント"
git push

やりなおし

作業ツリーとインデックスを直前のコミット状態に戻す

git reset --hard

直前のコミットの取り消し

git reset --hard HEAD^

リモートの変更を取り込む

git pull

サービス起動と終了

/etc/init.d/サービス名 start
/etc/init.d/サービス名 stop

もしくは

service サービス名 start

再起動

/etc/init.d/サービス名 restart

常に起動させる

chkconfig サービス名 on

リモートマシンにファイルコピー

scp [オプション] コピー元 コピー先

カレントのtestfileを192.168.1.10にuser1でログインしてホームディレクトリに転送する場合。

scp ./testfile user1@192.168.1.10:~/

パスの順番を変えればリモートから取得も可能。

ファイル検索

$ find / -name doc.txt

自己署名証明書の作成

途中で聞かれるCommonNameにホスト名を入力する。あとは適当でいい。

# openssl genrsa 2048 > server.key
# openssl req -new -key server.key > server.csr
# openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt

ホスト名変更

#vi /etc/hosts
127.0.0.1 xxxx localhost ここに追記
#vi etc/sysconfig/network
NETWORKING=yes
HOSTNAME=ここに書く
GATEWAY=192.168.0.1

反映する

# /etc/rc.d/init.d/network restart

使われてるポートを調べる

sudo netstat -anp

容量を調べる

パーティションごと

df -h

カレントディレクトリから再帰的に調べる

du -h

様々なツール

分野 名前
仮想環境 Vagrant
Docker
全文検索エンジン Apache Solr
groonga
Hyper Estraier
Senna
KVS Redis
memcached
mongoDB
シリアライズ messagepack
デプロイツール ChefとAnsibleが有名
Puppet
Capistrano
Fabric
Ansible
サーバーテスト serverspec
サーバー監視 Nagios
パフォーマンス計測 New Relic
ログ収集 fluentd
アプリケーションテスト Jenkins
機械学習ライブラリ Jubatus(http://jubat.us/ja/)
Apache Mahout
SHOGUN
NLTK
形態素、分かち書き mecub
chasen
tinysegmenter

サーバー負荷状況を調査する

CPU負荷は

top

メモリは

vmstat

その他の方法として、

# uptime
13:35  up 30 mins, 2 users, load averages: 0.07 0.16 0.19

load averagesに続いて、1分、5分、15分単位で数値が表示される。
この数値は処理の待ち時間を示している。
処理の待ち時間は、「CPU使用率」か「I/O処理の待ち」かどちらかである。

ロードアベレージが低いのにパフォーマンスが上がらない場合はネットワークに要因がある可能性が高いので「netstat」などで調べる。

CPU使用率やI/O待ち時間を調べる

# sar -u 3 10
13:40:16  %usr  %nice   %sys   %idle
13:40:19    1      0      2     98
13:40:22    1      0      1     98
13:40:25    0      0      1     98
13:40:28    0      0      1     99
13:40:31    1      0      1     98
13:40:34    0      0      1     99
13:40:37    0      0      1     99
13:40:40    0      0      1     99
13:40:43    0      0      1     99
13:40:46    0      0      1     99
Average:      0      0      1     98   

%userはユーザー空間でのCPU使用率
%nineは優先度を変更されたプロセスによってユーザー空間でCPUが使用された利用率
%systemはカーネル空間でのCPU使用率
%iowiatが表示される場合は、CPUがI/O処理を待っていた時間の割合が示される。
%idelはディスクI/O待ちでCPUが待っていた時間の割合

サーバー構築時に行うセキュリティ設定

LPICの標準教科書の目次より
1 ソフトウェアのアップデート情報をチェックする
2 利用しているパッケージを定期的にアップデートする
3 不要なソフトウェアをインストールしない
4 不要なユーザは、ログインできなくするか、削除する
5 必要に応じてユーザのパスワードに有効期限をつける
6 root になれる、もしくはsudo を使えるユーザを制限する
7 ファイルおよびディレクトリのアクセス権を適切に設定する
8 ランレベルを適切に設定し、不要なデーモンを起動させない
9 不要なSUID,SGID を削除する
10 ログを正確に残す
11 パケットフィルタリング(iptables など) を有効にし、余計なパケットを受信しないようにする
12 不要なポートを閉じる

cronの設定

crontab -e

書式

# コメント
分 時 日 月 曜日 コマンドやスクリプト

最後に

タイトルに[新卒向け]と言う言葉を入れてましたが、なんか胡散臭いので消しました。