linux基礎_新卒エンジニア勉強会20130404

4,293 views

Published on

4月一ヶ月、週2回ペースで新入社員向けに行われたエスキュービズム社内勉強会資料です。

0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,293
On SlideShare
0
From Embeds
0
Number of Embeds
1,110
Actions
Shares
0
Downloads
37
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

linux基礎_新卒エンジニア勉強会20130404

  1. 1. Linux基礎 $ date 2013年 4月 4日 木曜日 16:00:00 JST $ echo $COMPANY S-cubism.Inc(http://www.s-cubism.jp)
  2. 2. 利用領域 2 サーバ 組み込み スーパーコンピュータ Desktopマシン Ubuntu等 理化学研究所「京」
  3. 3. 最近よく聞かれるシステム周りの利用区分 3 オンプレミス クラウド IaaS(イアース,アイアス) SaaS(サース) PaaS(パース)サーバを自社設備内で所有する。 物理的に自社建物内なのか、 ホスティングなのかは問わない 使い方をされている 純粋な技術用語とは言い難くバズワードとして使われる例も... 例:「御社のオンプレ環境をクラウドに統合してIT投資効果を最大化します!」 IaaS(Infrastracture as a Service) SaaS(Software as a Service) PaaS(Platform as a Service) ASP(Application Service Provider) 仮想化されたプラットフォーム等のインフラ基盤をインターネット経由で提供する 例:AWS(Amazon Web Service)、ニフティクラウド アプリケーションを稼働させるためのプラットフォームをインターネット経由で提供する Heroku、ニフティクラウドC4SA アプリケーションをインターネット経由で提供する ASPはシングルテナント、PaaSはマルチテナント
  4. 4. Linuxの構造 4 Hardware Linux Kernel shell Utilities User 狭義でLinuxというとLinux Kernelのこと
  5. 5. ディストリビューション Debian系 Redhat系 5 RHEL(Redhat Enterprise Linux)  商用。コミュニティによるFedoraをベースに安定 CentOS  RHELのクローン Fedora  RHELの実験的な性格。アップデート早すぎるので仕事で使わない Debian  汎用ディストリビューション Ubuntu  デスクトップ、サーバ用途に限定することでその用途に使う場合使いやすく Linuxを一般ユーザが使いやすいように、 各コミュニティ等が機能追加したり利用できる形にまとめあげたもの [user1@localhost ]$ cat /etc/redhat_release [user1@localhost ]$ cat /etc/debian_release 各ディストリビューションのOSのバージョンの確認方法 Redhat系 Debian系
  6. 6. OSSとライセンス コピーレフト条項を基準に分類したOSSライセンス 複数のライセンスのライブラリ等を含んだソフトウェアでは ライセンスが干渉する可能性 6 GPL汚染 Macのreadline(本来はGPLのGNU readline)はreadline互換のlibeditへのシンボリックリンク。 GNU readlineをバンドルしてしまうとMacのライセンスをGPLライセンスとする必要がある BSD型 MPL型 GPL型 その他 修正BSDライセンス MITライセンス Apacheライセンス PHPライセンス MPL CPL/EPL CDDL GPL LGPL AGPL Arttisticライセンス Rubyライセンス コピーレフトなし 限定的コピーレフト コピーレフトあり 「知る、読む、使う!オープンソースライセンス」より コピーレフト条項=OSSの改良版は、必ずOSSにしなければならない
  7. 7. 32bit OSと64bit OS 32bit OS 7 64bit OS 使用できるメモリが最大4GB(理論値)に制限される。 MySQL等32bitOSに物理メモリ8GBとか積んでもハードウェアリソース生かせない 言語によっては時刻関係の関数で結果が違ったりする ex. PHPでdate、mktime、strtotimeを使って2038年を超える時刻を扱った時 最近は基本こちら [user1@localhost ]$ uname -a [user1@localhost ]$ Linux cento 2.6.32-5-amd64 #1 SMP Sun May 6 04:00:17 UTC 2012 x86_64 GNU/Linux x86_64とかamd64とか表示される
  8. 8. パッケージ管理1 Redhat系OS 8 ソフトウェアのインストール&アップデート rpm Debian系OS deb + ソースコンパイルが使える yum、apt等の場合 サーバ レポジトリサーバ [@localhost ]# sudo yum install httpd $ wget http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.2.24.tar.gz $ cd httpd-2.2.24 $ sudo ./configure $ sudo make $ sudo make install パッケージ管理用コマンド リクエスト rpm、debファイルダウンロード 基本的にインターネット経由であるが、 セキュリティ面でサーバからのインターネットアクセス を許可したくない場合など、社内のローカルネットワー ク内にレポジトリサーバを立てている会社もある。 通常apt、aptitudeを使う 通常yumを使う
  9. 9. パッケージ管理2 9 Redhat系OSでのyum、rpm、ソースコンパイルの使い分け yumが使える環境である yumレポジトリに パッケージが存在する rpmパッケージが 存在する YES YES NO NO NO ソースコンパイル (利用頻度低) rpm (利用頻度中) YES yum(利用頻度高) yum install httpd yum update httpd rpm -ivh example.rpm rpm -Uvh example.rpm インターネットへの接続不可等 依存するパッケージも取ってくる 更新をチェックできる 内部でrpmコマンドを使っている 依存するパッケージは取ってこない 更新をチェックできない 派手にファイルを書き換えたりする ソフトウェアもあるので必ず検証必要 まだα版でGithubにしか上がっていない 最新版を使いたい場合など
  10. 10. パッケージ管理3 10 Redhat系OSで外部のレポジトリを使う $ sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6 $ sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm ・いちいちrpmコマンドやソースコンパイルでインストールしなくていいが、  素性が明らかでないレポジトリは使ってはいけない ・標準のパッケージ構成では起こりえない問題が発生する可能性 ・yum-prioritiesというパッケージを入れると使うレポジトリに優先度付けられる EPEL Remi (Extra Packages for Enterprice Linux) RepoForge がんがん最新版にしていく傾向 意図しないミドルウェアのupdateを避けるため、 基本はenable=0にしておく方がいいと思う... 都度yum --enablerepo=remi install...する (旧RPMforge) メジャー処なので記載。個人的にはEPEL使っていれば事足りるので殆ど使っていない。 主にRHEL向けにビルドされたFedoraレポジトリをソースとする CentOS6系のX86_64なサーバでEPELを追加する場合 $ sudo vi /etc/yum.repos.d/remi.repo [remi] name=Les RPM de remi pour Enterprise Linux(中略) mirrorlist=http://rpms.famillecollet.com/enterprise/(中略) enabled=0
  11. 11. 11 ユーザ管理
  12. 12. 12 rootと一般ユーザ $ top 原則本番サーバ等での普段の作業でroot作業は良くない サーバの状態をちょっと確認程度の作業は一般ユーザで $ sudo /etc/rc.d/init.d/httpd restart root権限必要な場合はsudo $ su - もしくは一時的にrootに昇格 $ sudo su - root昇格がsu - ではダメな場合もある rootはWindowsでいうadministrator。なんでもできる
  13. 13. 13 SSHログイン パスワード認証 $ ssh operation_user@example.com パスワード認証と公開鍵認証 ID/PASSWORDのみでサーバにログインできる 自分しか使わない開発サーバではこれでもいい。 公開鍵認証 認証に秘密鍵が必要。本番サーバでは基本的にこちらを選択する $ ssh -i /path/to/id_rsa.pem operation_user@example.com SSHの鍵形式はSSHクライアントにより使用可能な形式が異なる。 他の形式が必要な場合WindowsのPuTTYgen等で適宜変換する。 http://bit.ly/LpGeDq OpenSSH形式        ←サーバ上で鍵を生成したりIaaSであればこれがデフォルト Tera Term、Mac Terminal等 SECSH(ssh.com)形式  Poderosa等 PuTTy形式  WinSCP等
  14. 14. ファイルシステム等 14 と言いつつext2とかext3の話書いてない...
  15. 15. 15 ディレクトリ構成 / bin/ etc httpd/ conf.d    yum.repos.d home lib sbin tmp usr local bin src var log 各ディレクトリの用途は押さえておきましょう 設定ファイルなど 各種ログ Apacheの設定ファイル(yumでinstallした場合) 各ユーザのホームディレクトリ ソースコンパイルでinstallする時にwgetでDLしたファイルを置いたり 一時ファイル置き場。一定時間アクセスがないと消える yumレポジトリの設定ファイル 自作コマンド置いたり システム管理用コマンド 共有ライブラリ 基本コマンド
  16. 16. 16 mount サーバのHDDの大容量化で使う機会が減っていたが、最近のIaaSはHDDの容量が小さ いのでmountする機会がまた増えている。 例) ニフティクラウドのデフォルトHDD容量は30GB 例) AWS/EC2のAMIには8GBのものも! 細かい説明は省略しますが、 IaaSの場合、コントロールパネルからサーバにディスク 追加しただけでは使えないというのを覚えておく http://cloud.nifty.com/help/login/mount_linux.htm
  17. 17. 17 パーミッション ユーザを3グループに分けて利用制限 [root@localhost ecorange]# ls -l total 20 drwxr-xr-x 17 root root 4096 Apr 3 05:10 data drwxr-xr-x 5 root root 4096 Apr 3 05:10 docs drwxr-xr-x 34 root root 4096 Apr 3 05:10 html -rw-r--r-- 1 root root 4435 Apr 3 05:10 README.md d r w x r - x r - x 4 2 1 4 2 1 4 2 1 7 5 5 所有者 グループ その他 ファイルの種類 - ファイル d ディレクトリ l シンボリックリンク パーミッション ユーザ名 グループ名 サイズ(バイト) ファイル名 最終更新日 chown -R root:root ./* カレントディレクトリ以下全てをユーザrootグループrootの所有に chmod a+x sample.sh 全てのユーザにsample.shの実行権限を与える chmod 777 ./sample.txt sample.txtのパーミッションを777に 記号を使用する場合 (1)利用者を表す記号 u : ファイルの所有者(user) g : 所有グループ(group) o : その他のユーザ a : 全てのユーザ (2)オペレータ + : 許可を与える - : 許可を取り消す = : =で指定した権利のみを設定する (3)アクセス権 r : 読み出し(read) w : 書き換え(write) x : 実行(execute)
  18. 18. 18 UNIXコマンド 数が多すぎて紹介しきれません... ファイル操作系はまず覚える ファイル転送・圧縮・解凍 サーバの状態確認 cd、ls、mv、cp、cat、head、less、more、tail、mkdir、pwd、vi、find、grep ssh、sftp、scp、tar、zip top、free、vmstat、iostat等 scp、sftpはどちらもファイル転送。通常使う分にはどちらでもいいが scp 軽量。4GBを超えるファイルの転送はできない。転送の中断はできない sftp 重武装。4GBを超えるファイルの転送ができる。転送の中断ができる tarは僕はzcvf&zxvf、jcvf、jxvf派です。オプション数、指定の順番に派閥があるっぽい... tar zcvf hoge.tar.gz hoge tar zxvf hoge.tar.gz tar jcvf hoge.tar.bz hoge tar jxvf hoge.tar.bz
  19. 19. 19 /sbin/、/usr/sbin/以下のコマンドを実行できるのはrootだけ コマンドの実体はファイルです $ sudo su - # cd /sbin # vi misawa #!/bin/sh cat <<_EOT_ え?今オリジナルコマンド実装してた? 完全に無意識だったわ∼ _EOT_ # chmod u+x miwasa # misawa misawaコマンドの実装 root /usr/local/sbin、/usr/local/bin、/sbin、/bin、/usr/sbin、/usr/bin、/root/bin 一般ユーザ /usr/local/bin、/bin、/usr/bin、/home/username/bin ※環境によって違う ※rootと一般ユーザで共通なディレクトリ
  20. 20. 20 環境変数 OS上で管理されている属性情報のようなもの 全ユーザ共通のものとユーザ固有のものがある 一時的に環境変数を設定したい (そのセッション以外からは無効、 ログアウトすると消える) $ export HOGE=fuga 次回ログイン時や他のセッションでも有効にしたい #シェルを確認する $ echo $SHELL /bin/bash #bashの場合。zshの場合はvi /.zshrc $ vi /.bashrc export HOGE=fuga $ source /.bashrc $ echo $PATH 「PATH」という名前の環境変数の値を参照する $ env 全ての環境変数の変数名と値を参照する
  21. 21. 21 パイプ、リダイレクト、/dev/null ¦ パイプ > リダイレクト /dev/null 出力を捨てたい場合に使う。 例1) ライブラリのコマンド実行したら画面にデバッグログが1000行ぐらい表示される ※実際には実行結果は捨てるべきではありません /path/to/command > /dev/null 2>&1 例2) 0バイトのファイルを作成したい cp /dev/null hoge.txt 例3) 日常会話で 「そんなものは/dev/nullに捨ててしまえ!」→そんなくだらないものは捨ててしまえ! コマンドの実行結果を次のコマンドの入力に渡す 例) カレントディレクトリ以下にある、拡張子が.rbなファイルの中から「hoge」という文字列を含むファイルを探す find . -name *.rb ¦ xargs grep hoge コマンドの実行結果を次のコマンドの入力に渡す 例) lsコマンドの実行結果をhoge.txtに書き出す ls > hoge.txt
  22. 22. 22 シェルスクリプト1 シェルで記述したプログラム。使う機会は非常に多いです。 ・ファイルに対する一括操作 ・バックアップスクリプト作成etc よく使うものはGitlabかgistとかで共有できるといいですね(チラッチラッ 個人的にはある程度行数超えそうならLL(軽量言語)に逃げます... $ chmod u+x test.sh $ ./test.sh 実行権限を忘れずに 明示的にパス指定して実行(相対パス、絶対パス) 実行 頭にシェバング(shebang) #!/bin/sh 汎用性を持たせるためにBourne Shell(sh)で書かれることが多い #!/bin/bash bashで書くこともある 書き方がちょっと特殊... a=`expr 5+3` ←加算 b=`expr 5-3` ←減算 if [ 1 -ne 1 ]; then ←「 [ 」の直後と「 ] 」の直前には必ず半角スペースが必要  echo "Hello Shell Script." fi
  23. 23. 23 シェルスクリプト2 #!/bin/sh # ---------- 設定 ---------- # バックアップ元のデータベース db_name=dbname db_user=username db_pass=password # バックアップ先のディレクトリ・ファイル bk_dir=/backup/database/ bk_file=$db_name # 保存する日数 bk_days=7 # ---------- ファイル名を設定 ---------- # タイムスタンプを取得 ts_now=`date +%Y%m%d` ts_old=`date "-d$bk_days days ago" +%Y%m%d` # ファイル名を設定 file_temp=$bk_file.sql file_backup=$bk_file.$ts_now.tar.gz file_remove=$bk_file.$ts_old.tar.gz # ---------- バックアップ処理 ---------- # バックアップ先のディレクトリに移動 cd $bk_dir if [ $? != 0 ]; then  echo "Backup directory does not exist." exit 1 fi 昔作ったMySQLのDBバックアップスクリプトの一部
  24. 24. 24 プロセス、ジョブ等
  25. 25. プロセス1 25 Linuxシステム上で動作するアプリケーション、プログラムの実行単位 実行中、実行待ち、イベント待ち、終了の4状態。 プロセスには親子関係があって、親プロセスが子プロセスを立ち上げる 親プロセス・子プロセス $ ps -ef ¦ grep httpd root 5551 1 0 03:45 ? 00:00:00 /usr/sbin/httpd apache 5552 5551 0 03:45 ? 00:00:00 /usr/sbin/httpd apache 5553 5551 0 03:45 ? 00:00:00 /usr/sbin/httpd apache 5556 5551 0 03:45 ? 00:00:00 /usr/sbin/httpd apache 5557 5551 0 03:45 ? 00:00:00 /usr/sbin/httpd apache 5558 5551 0 03:45 ? 00:00:00 /usr/sbin/httpd apache 5559 5551 0 03:45 ? 00:00:00 /usr/sbin/httpd apache 5560 5551 0 03:45 ? 00:00:00 /usr/sbin/httpd apache 5561 5551 0 03:45 ? 00:00:00 /usr/sbin/httpd apache 5562 5551 0 03:45 ? 00:00:00 /usr/sbin/httpd apache 5563 5551 0 03:45 ? 00:00:00 /usr/sbin/httpd 親プロセスの値が全て同じ kill プロセスを殺す kill 5563   5563番のプロセスを終了 kill -9 5551 5551番のプロセスを強制終了 ※実際はhttpdのプロセスを強制終了したりしない方が良い
  26. 26. プロセス2 26 マルチプロセス、マルチスレッド $ ps -ef ¦ grep mysqld root 2184 1 0 03:45 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe (中略) mysql 2922 2184 0 03:45 ? 00:00:01 /usr/libexec/mysqld Apacheはマルチプロセス(MPMがpreforkの場合) MySQLはシングルプロセスマルチスレッド Apacheはhttp経由でリクエストが増えるとプロセス数が増えるが、MySQLは変化しない ApacheはMPMでworkerを選択するとマルチプロセス+マルチスレッドで動作するが、 動作させられるかは言語やライブラリがマルチスレッド対応か等に依存する。 PHPはpreforkしか使えません! それぞれの違いについては省略しますが、ミドルウェアによって マルチプロセスだったり、シングルプロセス+マルチスレッドだったりします psコマンドでの見え方が変わってくる
  27. 27. プロセス3 27 pstreeコマンドで見ると視覚的に分かりやすい $ pstree -c init─┬─ ├─httpd─┬─httpd │ ├─httpd │ ├─httpd │ ├─httpd │ ├─httpd │ └─httpd ├─mysqld_safe───mysqld─┬─{mysqld} │ ├─{mysqld} │ ├─{mysqld} │ ├─{mysqld} │ ├─{mysqld} │ ├─{mysqld} │ ├─{mysqld} │ ├─{mysqld} │ ├─{mysqld} 子プロセス スレッド
  28. 28. 28 ランレベル $ sudo /sbin/chkconfig --list httpd httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off $ sudo /sbin/chkconfig httpd on $ sudo /sbin/chkconfig --list httpd httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off Redhat系であればchkconfigでサービスの確認設定ができる Apache、MySQL等はchkconfig (httpd¦mysqld) onしておかないと サーバ自体がメンテナンス等でrebootされた際にWebサービスが止まる ミドルウェアの再起動 Redhat系のOSであれば以下は同じ意味です $ sudo /etc/rc.d/init.d/httpd restart $ sudo service httpd restart Apacheはrestartとstop&startは違う stop 子プロセス全てを終了。その後親プロセスを終了 restart 子プロセスを全て終了。その後親プロセスは設定ファイルをリロード(終了はしない) graceful 子プロセスに現在の処理終了後に終了するように 助言 。親プロセスは設定ファイルをリロード service httpd restartで挙動がおかしい場合、stop&startを試してみるといい場合もある
  29. 29. 29 ジョブ1 1つ以上のプロセスが動いてひとまとまりの処理になっている場合の基本単位 $ command1 ¦ command2 $ command 例えばパイプでつないで2つのコマンドを実行した場合ジョブとしては1つだが、プロセスは2つ走っている フォアグラウンドジョブとして実行(普通にコマンドを実行) $ command& バックグラウンドジョブとして実行 $ ./test.sh ←実行中にCtrl+Z [1]+ Stopped ./test.sh $ bg %1 フォアグラウンドジョブをバックグラウンドジョブに切り替える $ jobs [1]+ Running ./test.sh & $ fg %1 バックグラウンドジョブをフォアグラウンドジョブに切り替える
  30. 30. 30 ジョブ2 時間がかかるジョブをログアウトしても実行したままにしたい $ nohup ./test.sh$ 開発サーバ等であればtmuxとかscreen使った方が楽かも... とりあえず yum install tmux(Linux) brew install tmux(Mac) しておけば幸せになるかも...
  31. 31. 31 メモリとスワップ サーバのメモリ使用量が物理搭載メモリ量を超えた場合、スワップが発生。 HDD上に確保したスワップ領域に、現在使われていないプログラム(プロセス)を一時的に退避する。 メモリに比べディスクの読み書きは遅い $ vmstat 5 procs ---------------memory ------------- ---swap-- -----io---- ---system-- -------cpu-------- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 16 50308 45068 736488 0 0 91 806 1064 144 2 2 94 2 0 0 0 16 50308 45068 736516 0 0 0 0 1044 96 0 0 100 0 0 0 0 16 50308 45068 736516 0 0 0 0 1001 75 0 1 99 0 0 新規インストール&スワップ領域切る作業などをやる機会はないと思うが、 スワップが発生という言葉はよく聞くので、どういう状態なのか理解しておく 対策 ・プログラムの消費メモリ減らす。 ・メモリを増設する。 ・サーバを増設して負荷分散する。 この値が0でない場合、スワップが発生している
  32. 32. 32 Linuxの学習方法 触る&理論を学ぶの繰り返し 前者に関しては現代は非常に恵まれた環境  5年前... 使ってないPCにLinuxをインストール→設定間違えて再インストール! 専用サーバ借りる→月額8000円! Linux本 LPI Japanの「Linux標準教科書」はよく纏まってると思います(無料)  PDF http://www.lpi.or.jp/linuxtext/text.shtml Kindleストア、Mac App Storeにもあります Amazon Web Service Redhat Enterprise Linux、Windows Server、ミドルウェアであればOracleなんかも使える AWSはmicroインスタンスであれば一定時間無料(クレジットカード必要)  http://aws.amazon.com/jp/free/ 個人でAWS使う場合にはクラウド破産しないようにAWS Billing Alertsは設定しておこう!  →設定した額を超えるとメール通知してくれる
  33. 33. END Enjoy Linux/UNIX Life!

×