Linuxの勉強

# この投稿について
まとめノートをどこからでも見れるようにするため、途中ですが投稿します。
投稿後に、ちょっとずつよくしていきます。
リンクは、まだリンク先を作っていないものも含まれています。
※勉強中ノートなので、間違った情報流しているかもしれません。

# 絵で見てわかるLinux OSアーキテクチャ

![alt](https://image.slidesharecdn.com/thelinuxnetworkingarchitecture-150302205644-conversion-gate01/95/the-linux-networking-architecture-4-638.jpg?cb=1425591486)

PCを組み立てるときに、cpuやメモリなどを配置しますが、これを読み込んだり連携するのがカーネル。

図を見ると、

- CPUと連携しつつ、Process managementがあり、
- RAMと連携しつつ、Memory management,
- HDD,SSD等と連携しつつ、File system,
- 各種端末とDevice drivers,
- Network adopterとNetwork
というように、ハードと対応するコンポーネントがカーネルに用意されており、
それらをユーザスペース側のアプリケーションからシステムコールで呼び出してハードを使い、これらを連携して仕事を行っているようです。
（ちなみに、 [shellはユーザスペース側にいる](https://www.oskarth.com/unix01/) ようです）

# File system

![alt](http://apprize.info/linux/dummies/dummies.files/image173.png)

![alt](http://image.wikifoundry.com/image/1/c_QDwRSP6M3uc7x9y77p9w30675)

Windows脳のままLinuxを見るとファイルシステムがわかりませんでしたが、これらの図を見て、なるほどと思いました。
Windowsだとパーティション毎にドライブを割り当てるけれど、
Linuxはルートファイルシステムを持ち、ルートファイルシステムが各パーティションのファイルシステムにマウントする形で連携して１つのファイルシステムとして使えるということだと理解しました。

## ルートファイルシステム

- ルートディレクトリ(/)と同一のパーティションに存在するファイルシステム
- 他のすべてのファイルシステムにマウントしている（自分がしていない）ファイルシステム
- ブートで使われるファイルシステム

    - /bin システムに必要なコマンド、プログラムが含まれている
    - /sbin システムに必要なコマンド、プログラムが含まれている 
    - /etc 各種設定
    - /lib ライブラリ
    - /dev デバイスファイル



## パーティション

１つのディスクを論理的に分けた区画。

### BIOSベース

- 基本パーティション　１つのディスクに４つまで(MBR方式)。128まで(GPT) /dev/sda1〜/dev/sda4
- 拡張パーティション　内部に論理パーティションをもつ基本パーティション。基本パーティションのうち１つだけ選択できる。
- 論理パーティション　/dev5〜.

### UEFIベース

- EFIシステムパーティション　他のパーティションの管理など
- 基本パーティション1
- 基本パーティション2
- 基本パーティション..


## ファイルシステムの種類

### ext系
多くのディストリビューションで採用されている。

- ext2: Linux標準
- ext3: ext2 + ジャーナリング機能
- ext4: ext3を機能拡張

### XFS系
RHL7で標準となっているジャーナリングファイルシステム。

## FHS




## ファイルとiノードとディレクトリ
## ファイルシステム周りの操作


パーティションを管理する
・fdisk
・gdisk
・parted

ファイルシステムを作成する
・mkfs
・mke2fs(etx2,etx3,etx4)
・mkswap(スワップ領域作成)

ディスクの利用状況確認
・df <-- ディスク/iノードの利用状況確認  
・du <-- ディレクトリの容量確認

ファイルシステムをチェックする <-- unmount / 読み取り専用にしておく
・fsck
・e2fsck

ファイルシステムの管理
・tune2fs
・dumpe2fs

XFSファイルシステムを管理する
・mkfs.xfs
・xfs_info
・xfs_db
・xfs_check
・xfs_admin
・xfs_fsr

ファイルシステムをマウント・アンマウントする
・/etc/fstab
・/etc/mtab
・mount
・unmount

ファイルシステムの利用容量制限をかける(quota)
・quotacheck
・quotaon / quotaoff
・edquota
・repquota







---














# システムとコマンド

## cpu情報を確認する

- `cat /proc/cpuinfo`


## メモリの利用状況を調べる

- `free`

## システムの稼働時間を調べる

- uptime

## システムのアーキテクチャやOSを調べる

- uname

## デバイス/usb

- lspci


- lsusb

- lsmod
 - デバイスドライバのロード
 - 必要な情報をカーネルに読み込む


------ ブート ----------------------------
>> ブートローダ(ブートマネージャ) = GRUB
>> GRUB Legacy / GRUB2
>> MBR
>> SysVinit
>> systemd
>> ランレベル


ブートローダGRUBをインストールする
・grub-install /dev/sda

ブートローダの設定をする
・vi /boot/grub/menu.lst
・vi /boot/grub/grub.cfg
・grub-mkconfig

ブートオプションの指定
・起動時にEを押す
・オプションを選ぶ

起動時のイベントを確認する
・dmesg
・cat /var/log/messsages
・cat /var/log/dmesg
・cat /var/log/boot.log

シャットダウンと再起動
・shutdown

ランレベルの確認と変更
・runlevel
・init 
・wall (他のユーザへ警告メッセージ)
・ls /etc/rc3.d

サービスの管理
・systemctl

--- 共有ライブラリ ---------
>> 共有ライブラリ ( /lib , /usr/lib ) 
>> /etc/ld.so.conf, etc/ld.so.cache, 環境変数LD_LIBRARY_PATH


必要な共有ライブラリの確認
・ldd コマンド (ldd /bin/cat)

共有ライブラリの変更を反映する
・ldconfig


--- パッケージ管理 ----------
----- debian --------
>> パッケージ名の命名規則
・dpkg
・apt-get
・apt-cache
・aptitude
----- RPM -----------
>> パッケージ名の命名規則
・rpm 
・yum
・yumdownloader





-----ファイル / ディレクトリ / リンク -------
>> ファイル / ディレクトリ / iファイル
>> シンボリックリンク / ハードリンク
>> メタキャラ(*,?,[],{})

ファイルを探す
・find
・locate
・updatedb

ファイルの圧縮、回答
・gzip
・gunzip
・bzip2
・bunzip2
・xz

アーカイブを作成する
・tar

アーカイブファイルにコピーしたり、そこからファイルをコピーする
・cpio

ファイルをコピーする
・cp
・dd

リンクを作成する
・ln

リンクをコピーする
・cp -d

その他
・ls
・cp
・mv
・mkdir
・rmdir
・touch
・file

-----テキスト操作----
>> 正規表現

・cat
・nl
・od
・head
・tail
・cut
・join
・paste
・tr
・sort
・split
・uniq
・pr
・fmt
・expand
・unexpand
・wc
・xargs
・grep    <-- 拡張正規表現が使える(-E)
・egrep   <-- 拡張正規表現が使える
・sed     <-- 非破壊的 (d,s,yコマンド)



-------ファイルやディレクトリの権限まわり-------------
>> 権限のアーキテクチャ

権限を確認する
・ls -l / ls -ld

権限を変更する
・chmod (SUID, SGID, StickeyBit）

デフォルトマスクを確認する
・umask

ファイルの所有者を変更する
・chown

グループを変更する
・chgrp



----- プロセス -----------
>> プロセス

実行中のプロセスを確認する
・ps
・pgrep
・pstree (ps -f)
・top

プロセスの終了
・kill
・killall
・pkill

プロセスの実行優先度を確認する
・ps -l (PRI列）

コマンド実行時に優先度を指定する
・nice -n -10 (コマンド)

実行中プロセスの優先度変更
・renice


----- シェル ------------------------
>> シェル / カーネル
>> 環境変数（主なものだけでよい）
>> 内部コマンド / 外部コマンド (シェルに組み込み / 独立したPG）
>> コマンドの実行方法
>> 引用符 '' ""(変数展開) ``(コマンド展開)
>> whatisデータベース
>> 標準入出力

処理を中止 / 一時停止
・Ctrl + C / Ctrl + Z

画面をロック / ロック解除
・Ctrl + S / Ctrl + Q

端末内で仮想端末を作成する
・screen

変数を定義して、確認する
・key=value
・echo $key

変数を削除する
・unset key

環境変数を一覧表示する
・env
・printenv
・set  <-- 環境変数とシェル変数を両方表示できる

外部コマンドを実行できるように環境変数PATHに通す
PATH=$PATH:/opt/bin (/opt/bin を通した）

コマンドの履歴を確認する
・history
・↑ / Ctrl + p
・↓ / Ctrl + n
・!文字列
・!?文字列
・!!
・!履歴番号


コマンドの実行方法
・;
・&&
・||
・!履歴番号
・(;)
・{;}

ページャーでみる
・less   <-- 操作方法

コマンドについて調べる
・which
・whereis
・type
・man   <-- manページ見出し、セクション
・whatis (man -f)  <-- 完全一致
・apropos (man -k) <-- 部分一致

キーワード検索用データベースを作成する
・makewhatis

実行結果を標準出力とファイルに出力する
・tee

ヒアドキュメントで入力する
・cat > sample.txt <<EOF



----- ジョブ in シェル --------------
>> ジョブ
バックグランドで実行する
・&
・nohup

実行中のジョブを確認する
・jobs

ジョブのモードを変更する
・Ctrl + Z  <-- 一時停止
・bg        <-- バックグランドへ
・fg        <-- フォアグラウンドへ




------ vi エディタ -----
viの使い方を覚える
・vimtour