Linux開発環境の基礎知識

自分が長期間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
```

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

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
```

書式

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


#最後に

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