ことはじめ

Linuxに関するいろいろなことをまとめてあるサイトを見つけたので、自分に有益な部分だけをまとめて行きたいと思う。

参考文献

これです

俺が思うLinux中級者向けのコマンド達

中級者というか、今の時点で俺が知らない、もしくは使いこなせていないコマンドって感じかな。

find

ファイルを検索する。

find <検索パス> -name <ファイル名>

ファイル名の一部 的にやるのもだいぶいいと思うけど。

useradd

新規ユーザの作成

id

ユーザの確認

stress

dmesg

lsmod

ロード済みのカーネルモジュール一覧を表示する

ちなみに、カーネルモジュールとは「カーネルの機能を拡張するためのバイナリファイルです。 例としては、ディスク・ネットワークカード等をLinuxカーネルで使用可能にするためのデバイスドライバなどがあります。 デバイスドライバは各ハードウェアベンダーから提供されることが多いです。

初期のUNIX系OSでは新しいハードウェアを使うにはカーネルの再構築が必要でしたが、 現在のLinuxカーネルは、必要ありません。 起動時に常駐カーネルがメモリにロードされ、必要に応じてロード・アンロードが出来るようになっています。 です。いつか自分でも自作してみたいきはだいぶしていますねー。

modprobe

カーネルモジュールのロード、アンロードを行うコマンド 「カーネルモジュールとは、Linuxカーネルの機能の一部を、カーネル本体とは別にロード、アンロードできるように分離したサイズの小さいバイナリファイルです。多くの場合、ハードウェアにアクセスし、操作するためのドライバ部分がカーネルモジュールとなっています。

 ドライバ自体をカーネルに組み込む古い方式では、ハードウェア構成を変更した場合に、カーネルの再構築が必要になります。現在では、ほとんどのドライバがモジュールとして提供されているため、ハードウェア構成変更後は、必要なカーネルモジュールをロードしてカーネルに組み込むだけで対応できるようになっています。

 modprobeは、モジュールの依存関係を確認し、必要なモジュールがあれば同時に組み込むといった処理も行います。モジュールの組み込みには内部的に「insmod」コマンドを用いており、取り外しでは「rmmod」コマンドを使っています。 」 ってことですね。

FHS (Filesystem Hierarchy Standard)について

/bin

コマンドファイルが入っている。すべてのユーザが利用するコマンドが保存されているディレクトリ。lsとか、echoとか。 ここに入っているコマンド全部覚えておいて損はないと思いますけどね。

bash           fusermount      netcat         su
bunzip2        grep            netstat        sync
busybox        gunzip          networkctl     systemctl
bzcat          gzexe           nisdomainname  systemd
bzcmp          gzip            ntfs-3g        systemd-ask-password
bzdiff         hciconfig       ntfs-3g.probe  systemd-escape
bzegrep        hostname        ntfscat        systemd-hwdb
bzexe          ip              ntfscluster    systemd-inhibit
bzfgrep        journalctl      ntfscmp        systemd-machine-id-setup
bzgrep         kbd_mode        ntfsfallocate  systemd-notify
bzip2          keyctl          ntfsfix        systemd-sysusers
bzip2recover   kill            ntfsinfo       systemd-tmpfiles
bzless         kmod            ntfsls         systemd-tty-ask-password-agent
bzmore         less            ntfsmove       tar
cat            lessecho        ntfsrecover    tempfile
chgrp          lessfile        ntfssecaudit   touch
chmod          lesskey         ntfstruncate   true
chown          lesspipe        ntfsusermap    udevadm
chvt           ln              ntfswipe       ulockmgr_server
con2fbmap      loadkeys        openvt         umount
cp             login           pidof          uname
cpio           loginctl        ping           uncompress
dash           lowntfs-3g      ping4          unicode_start
date           ls              ping6          vdir
dd             lsblk           ps             wdctl
df             lsmod           pwd            which
dir            mkdir           rbash          ypdomainname
dmesg          mknod           readlink       zcat
dnsdomainname  mktemp          red            zcmp
domainname     modeline2fb     rm             zdiff
dumpkeys       more            rmdir          zegrep
echo           mount           rnano          zfgrep
ed             mountpoint      run-parts      zforce
egrep          mt              sed            zgrep
false          mt-gnu          setfont        zless
fbset          mv              setupcon       zmore
fgconsole      nano            sh             znew
fgrep          nc              sleep
findmnt        nc.openbsd      ss
fuser          nc.traditional  stty

/lib

共有ライブラリを保存するディレクトリです。 共有ライブラリが何なのかわかる?

ビルド ≒ コードをコンパイルしてオブジェクトファイルの生成 + ライブラリのリンク
なわけだけれど、ライブラリにはスタティックリンクとシェアードリンクの2種類があると。で、共有ライブラリのリンクはさらに、

1. 実行形式のメモリへのロード時にリンクされる、動的リンクライブラリ

2. 必要に応じてメモリへロード、リンクされる、動的ローディング
の二つがある。

<br>
なるほど、静的リンクってのは、ライブラリをリンクして実行ファイルを作るときにライブラリバイナリも実行ファイルに組み込む。これは、ある静的ライブラリが何回も使われるとき、システムのメモリ上に同じバイナリが何個も存在することになるので冗長、無駄が多いですよね。
<br>
この、「冗長で無駄が多くなってしまう」という問題を解決するのが共有ライブラリですね。
動的リンクライブラリを使っているバイナリは、ファイルシステム上ではまだライブラリがリンクされていない状態で保存されています。実行時にメモリにロードされるときにはじめて、ライブラリがメモリ上に展開されて、リンクされるんですね。しかもそのライブラリを使うバイナリが他にも存在するときは、異なるバイナリがメモリ上で同じライブラリのbinaryを参照するということで、ライブラリを共有しているから共有ライブラリ、と呼ばれるんですね。
<br>
さらに、必要に応じてメモリにライブラリをロードするのが動的ろ―ディングですね。

て感じですね。共有ライブラリが入っています。よろしくお願いします。

/root

rootユーザのホームディレクトいr

/sbin

ルートユーザが実行するコマンドを保存

/usr

マシン間で共有可能なファイル

/var

サイズが変化するファイル。ログとかはここに置くよね。

package管理システムについて

ここはかなり大事だと思う。

そもそもpackageとは?

パッケージとは、ソフトウェアの実行に必要なファイルをまとめたものです。
具体的には、
1. 実行ファイル
2. ライブラリ
3. モジュール
4. 設定ファイル
等

ちょっと一瞬ライブラリについて語りたいと思う

ライブラリとは、「再利用可能な形でまとめたプログラム ライブラリ単体では動かない」わけです。システムライブラリってのは、アプリケーションがカーネルを呼び出すためのライブラリです。これは、glibcに入っています。そう、システムコールはここに入っているんですね。

リポジトリとは

packageの保管場所 (配布サイトのこと) iosでいうapp store、windowsでいう窓の杜。

package管理システムの機能

packageの依存関係を自動で解決してくれるのがこれなんです。いいね。

systemdについて

systemdとは、Linuxの起動処理 (init) やサービスの管理を行うソフトウェア一式。 initはカーネルが最初に起動するプロセスで、すべてのプロセスの親。まあ、神ってことや。

ユニットについて

ユニットとは、一つのサービスとそれに関する起動処理などをまとめたもの。次の情報をカプセル化する。

・システムサービス
・ソケットのリッスン
・init システムに関連するその他のオブジェクト

まあ、systemdにデーモン起動をお願いするために必要な設定って感じですね。

ユニットのタイプ

1. サービスユニット
2. ターゲットユニット
3. 

まあいっぱいありますね。

ユニットファイルの場所

ファイルの書き方

下に一例を示しておきます。

[Unit]
Description=Command Scheduler
After=auditd.service systemd-user-sessions.service time-sync.target

[Service]
EnvironmentFile=/etc/sysconfig/crond
ExecStart=/usr/sbin/crond -n $CRONDARGS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=30s

[Install]
WantedBy=multi-user.target

まあこんな感じね。 まあただ、最近はベアメタルでサービスを動かすことも少ない というのもdockerを使うからだよね。Docker-composeがこれに相当するのかな?そんな気がしますね。

デバイスに関して

デバイスとは、まあ、コンピュータにつながった機械だと考えていいと。

udevについて

udevはデバイスファイルを作成するためのルール?的なもの。 特定のディレクトリに*.rulesってファイルを作ると、/dev/以下にデバイスファイルができる。まあ、これについては今度でいいでしょう。

LVMについて

LVM とは、複数のストレージを、1つのボリューム (連続した記憶領域) と扱える機能です。

これは便利な機能ですねーーー。だいぶ便利な機能だと思います。

プロセス間通信 (IPS)について

inter process communicationってことだね。はい。 めっちゃめちゃ種類があるってことだよね。俺が知ってるのは、パイプとソケット、ドメインソケットだけだな。

1. パイプ
2. 名前付きパイプ
3. シグナル
4. メッセージキュー
5. セマフォ
6. 共有メモリ
7. メモリマップ度ファイル
8. ソケット
9. ドメインソケット