Linux
CentOS
Ubuntu
OSX
初心者

Linux開発環境の基礎知識

More than 1 year has passed since last update.

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

書式

# コメント

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


最後に

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