Linuxを始める前に読むと良いかもしれないドキュメント



Essential Linux Book(まずはこれ!)


目次

  1. 目次
  2. 注意
  3. Linuxとは
  4. ディストリビューションとは
  5. パッケージマネージャーとは
  6. GUI? CUI? どちらも一長一短
  7. ディレクトリ?ファイル? シェル? コマンド?とは
  8. Linuxを最も簡単に身につける方
  9. 言い訳・注釈

Linuxを使い始めるに当たって、必要最低限の知識を得られるような内容になっているはずです。正確性の担保等々いたしませんが、なにかの役に立てば嬉しいです。また細かい説明をしない用語/概念についても調べて見ることで学びに繋がると思うのでぜひ。 -- @uliboooo

注意


Linuxとは


主にLinux kernelと関連ソフトウェアの総称。(名称に関する詳しい話はこちら )

OSの1つで、WindowsやmacOSのような存在。Unix系でOSSとしてソースコードがGPL-2.0によりライセンスされ無料で公開されており誰でも利用できます。

AndroidはLinux kernelを使用して構築されており、Webなどのサーバーも大体Linuxが動いています。しかし、デスクトップ用途(WindowsやmacOSのような一般的なパソコンを動かすOS)ではあまり普及していないのが現状です。

tux: linuxの公式マスコット

tux: linuxの公式マスコット

https://isc.tamu.edu/~lewing/linux/

ディストリビューションとは


先程Linux kernelと関連ソフトウェアの総称と述べたようにLinux単体はKernelを示す場合が多く、Kernelだけでは通常使用するのが難しいです。焚き火しか用意されていないようなものです。

そのため蒸し料理などの道具が必要なレベルの複雑な操作を容易に行うために様々なツールを一緒にして配布されており、それらをLinux ディストリビューションと呼びます。

Linuxディストリビューションがあるおかげで、我々は自身で蒸し器などを用意せずに高度な料理を始められるわけです。(蒸し料理が高度かどうかは置いておくとして)

具体例としては

これ以外にも大量に存在しますが、多くのディストリビューションは以上の3つを祖(ベース)として開発されており、同系統のディストリビューション間ならパッケージマネージャー(次章で詳しく)も同じものを使っていることが多いです。

desc of distribution

desc of distribution

ディストリビューションについてはこちら

パッケージマネージャーとは


Linuxにはパッケージマージャーというアプリを一括で管理してくれる機能があります。スマホのアプリストアをイメージしていただければすんなり理解できるでしょう。

Windowsでは各アプリはインストーラーによって独立したバージョン管理やリソース管理を行うことがほとんど(Microsoft storeとかは例外として)ですが、Linuxでは基本的にこのパッケージマネージャーを介してアプリの管理を行います。

具体的な管理としては

アプリケーションの

などをを行います。

特にLinuxでは1つアプリが独立せず別のアプリに依存している場合やその依存関係内でのバージョン管理など複雑な操作が必要なことがあり、それらを割と自動でやってくれるツールです。(ソフトAはBに依存しているがBはまだインストールされてないなど)

具体的なコマンドについては、ディストリビューションによって異なりインストールできるパッケージも変わります。そのため細かい紹介は各種ドキュメントや今サイトのより具体的な記事(準備中)に譲ります。

また、有名なパッケージは大体どのディストリビューションでもインストール可能ですが、マイナーなツールだと特定のディストリビューションにしか配布されていないこともあります。その際は手作業でインストールするなどが必要だったりします。

代表的なコマンドを紹介します。以下のコマンドは各種パッケージマネージャーでシステム全体のパッケージをアップデートするものです。1

bash
# Ubuntu系では sudo apt update # Fedoraでは sudo dnf update # Archでは sudo pacman -Syu

ここではコマンドで紹介しましたが、最近はGUIでパッケージ管理ができる場合も増えています。GUI,CUIについては次章。

Arch向けのGUIマネージャー

Arch向けのGUIマネージャー

GUI? CUI? どちらも一長一短


GUIGraphical User Interface, CUIcharactor user interfaceの略です。

今見ているこの画面は99%GUIでしょう。GUIとはウィンドウやボタンを用いてグラフィカルに操作できるUIのことで、それらをマウスなどのポインティングデバイスで操作します。見慣れた環境です。

CUIとは黒いターミナルでコマンド(テキスト)により操作する方法です。

イメージとしては1つ操作に対して操作方法が2つある感覚です。

パッケージマネージャーを例にすると、

「システムのパッケージをアップデートしたい」

👆この操作をするために

というそれだけの違いです。

GUIは初めて使ってもある程度の操作法がわかります。インストールするならインストールボタンを、探すなら検索ボックスにアプリ名を入力すればいいのです。CUIは初見でいきなり100%使いこなせるようなツールではありません。

しかしLinuxユーザーの傾向としてCUI使いがちということはあります。なぜGUIなどという便利なツールがあってわざわざCUIを使うのか? それには様々な理由があります。それについては次章で。

ディレクトリ?ファイル? シェル? コマンド?とは


ここからはCUIの世界の話です。ハッカーの画面の話です。そして(個人的)Linuxの神髄です。

ただ、CUIの前にそれがどこでどういう風に動くのか? それをある程度理解している方がこのあと楽なので説明します。 少し断片的な説明になってしまいますが、後から全部がくっついて理解できるはずです。

ディレクトリ=フォルダ


細かい話は色々はあるようですがとりあえずディレクトリはフォルダーと同じ概念として飲み込んでください。またLinuxにおいては多くの場合ディレクトリと呼びます。2

Linuxでは以下のようなディレクトリ構造になってることが多く、すべてを覚える必要はないですがなんとなく頭に入っていると便利な情報です。これらの構造もディストリビューションによって若干変わったりします。以下はArchの例。

/はLinuxのディレクトリ構造における最上位であり、rootディレクトリと呼ばれます。全ての原初です。

txt
/ # 以下の内容の保存場所 ├── bin -> usr/bin # システム操作に必須プログラム ├── boot # Linuxの起動に必要なファイル ├── dev # マシンに接続したデバイス ├── etc # システム全体の設定ファイル ├── home # 各ユーザーのホームディレクトリ ├── lib -> usr/lib # システムが必要とするライブラリ ├── lib64 -> usr/lib # 同上 ├── mnt # 臨時のマウントポイント ├── opt # システムとは別にインストールされたプログラム ├── proc # なんか難しい仮想ファイルシステム ├── root # rootユーザーのホームディレクトリ ├── run # 揮発性性ランタイムのデータ保持 ├── sbin -> usr/bin # 基本的なシステム管理 ├── srv # サーバー固有のデータ(?) ├── sys # 仮想ファイルシステム ├── tmp # ファイルの1次置き場 ├── usr # ユーザー関連のファイル等々 └── var # 各プログラムのログなど

あなたには家が与えられる


普通にユーザーを作成してインストールしたならば、あなたには/home/user-name/というディレクトリが与えられます。基本的には作った資料やダウンロードしたファイルはこのフォルダより下位のフォルダに保存します。

この中ならば、ほとんど自由にファイルを作ったりディレクトリを作成したり、消したり変更したりできます。

あなたは常にどこかのディレクトリにいる


ここからは実際に例の黒い画面(以降ターミナルと呼ぶ)を使っていきます。

まずターミナルに入ると以下のようなテキストが表示されるでしょう。なんとも静かで何をすればいのか分からない画面です。しかしこれでもCUIはあなたに情報を与えようとしています。

bash
[alice@ubuntu ~]$

まず[]の中身について。

@の前があなたのユーザーネームです。おそらくインストールの際に名前を入力するのでほとんどの場合はそれが表示されます。今回は具体的な例があった方が良いと思うのでaliceというユーザーを仮定しました。

そして@より後ろ。

これは自身のマシン(コンピューター)の名前です。今はまだ使いませんがリモート作業などで使うことがあるので不要な情報ではありません。

その後スペースが1つ空き、~(チルダ)という記号があります。

これは現在位置を示しています。カレントディレクトリと言います。ターミナルでLinuxを操作する際は、絶対にどこかのディレクトリにあなたは居ます。LinuxのCLIとは任意のディレクトリにおいて任意をファイルを対象に命令を行うこととも言えます。

また、~はホームディレクトリ(先ほどのあなたの家です)という意味です。詳細は後述しますが$HOMEという変数としても保持されておりスクリプト等ではこちらを使うこともあります。

最後に[]が終わり$マークが表示されます。これはコマンド入力を待機しているという意味です。決して金銭をせびられている訳ではありません。

つまり、[your-name@ubuntu ~]$というのは、あなたはubuntuというマシンの~(ホームディレクトリ)に現在、位置しており、あなたのコマンドをマシンは受け付けているという意味になります。

先ほどのlinuxのディレクトリ構造においては以下の矢印の箇所にいることになっています。

txt
# 一部のフォルダを非表示にしてます / ├── bin -> usr/bin ├── etc ├── home ├── alice # <- ここにいる │ ├── Desktop │ ├── Documents │ ├── Music │ └── Pictures ├── lib -> usr/lib ├── mnt ├── usr └── var

あなたはコマンドにて命令する。


コマンドに関しては想像がつきやすいでしょう。ゲームやら何やらで聞いたことのある人は多いでしょう。コンピュータは自然言語を理解できないので3予め決めておいた単語によって人間がある程度コンピューターに譲歩して命令を行います。

このサイトの一部を例にしてみましょう。

例えば「今いるディレクトリに存在するファイルとディレクトリを一覧にして見せて」という命令は以下のコマンドで実現できます。

bash
[your-name@ubuntu linux_docs]$ ls CONTRIBUTING.md eslint.config.js package.json public src tsconfig.json vite.config.ts draft index.html package-lock.json README.md tsconfig.app.json tsconfig.node.json

またこれはコマンドの設計にもよりますが引数として処理の対象や細かいオプション(次章)を指定することができます。

lsはデフォルトではカレントディレクトリを対象にリストにしますが、以下のように特定のパスを指定することもできます。

bash
[alice@ubuntu linux-docs]$ ls public/ articles vite.svg

ただこういった実践的な内容に関しては読むより実行して経験する方がよっぽど楽に身につくと思うので、仮想環境などの安全な場所で実行しまくるのが手取り早いです。

コマンドについてより詳しい話はこれらの記事を参照。

コマンドは細かい挙動を変更できる


先ほどのlsコマンドの結果ですが、ただリストにされただけではファイルなのかディレクトリなのかが分かりにくいです。そこでもう少し細かい情報が欲しいとlsに伝えます。linuxのコマンドでは多くの場合-を用いて追加の命令(オプション)を伝えることが出来ます。

txt
[alice@ubuntu ~]$ ls -l total 208 -rw-r--r-- 1 alice alice 2340 Feb 24 23:14 CONTRIBUTING.md drwxr-xr-x 1 alice alice 286 Feb 24 22:43 draft -rw-r--r-- 1 alice alice 616 Feb 24 12:11 eslint.config.js -rw-r--r-- 1 alice alice 359 Feb 24 12:11 index.html -rw-r--r-- 1 alice alice 807 Feb 24 14:50 package.json -rw-r--r-- 1 alice alice 175651 Feb 24 14:50 package-lock.json drwxr-xr-x 1 alice alice 32 Feb 24 14:50 public -rw-r--r-- 1 alice alice 2555 Feb 24 12:11 README.md drwxr-xr-x 1 alice alice 160 Feb 24 22:18 src -rw-r--r-- 1 alice alice 732 Feb 24 12:11 tsconfig.app.json -rw-r--r-- 1 alice alice 119 Feb 24 12:11 tsconfig.json -rw-r--r-- 1 alice alice 653 Feb 24 12:11 tsconfig.node.json -rw-r--r-- 1 alice alice 197 Feb 24 14:50 vite.config.ts

-lオプションによってより詳細な情報が提供されました。各ファイル/ディレクトリの行において先頭の1文字が-ならファイル, dならディレクトリです。これ以外にもありますがそれはおいおい...

また、オプションの他にサブコマンドという操作もあり、こちらはオプションより大きな変更を与えます。というよりは親コマンドが細かいコマンドたち(サブコマンド)をまとめている感覚に近いです。

サブコマンドの具体例としてaptgitがあります。aptはパッケージ管理という大きな仕事をinstallsearchupdateと言った細かいサブコマンドに分割しています。gitstatuslogのようにgitに関する操作をサブコマンドという形で分割しています。

bash
# 親 # サブ apt update apt install apt search # サブコマンドがオプションを持つこともあるし、オプションが値(message)を持つこともある git commit -m "message"

あなたは常に何らかのユーザーであり、ファイルはあなたを認証する。


Linuxではファイルに対してRead(読み込み), Write(書き込み), Execute(実行),の3種類の権限が存在し、Owner(所有者), Group(グループ), Other(その他)の3種類のユーザー(user class)に対してそれぞれ設定します。

desc of linux permission

desc of linux permission

参考スライド

例えば先程紹介したaliceのホームディレクトリ(~,$HOME)の所有者はaliceであり、3種の権限が全て有効になっており、その他のユーザーには何の権限も与えられておらず何もできません。つまりこのLinuxにalice以外のユーザーがいたとしても、彼らはaliceのホームディレクトリを読み取ることも、書き込むことも、まして中のプログラムを実行することも叶わないのです。

また、権限を与える対象がユーザーだけでは不便なのでLinuxではグループという単位で複数のユーザーをまとめて管理できます。具体的には通常の方法で作成されたユーザーは同名のグループ(alice)や, 管理者用のsudoやwheelグループ(システム管理)に属しています。

そしてLinuxにおいて実行されるプログラムは、そのプログラムを実行したユーザーの権限を引き継いで動作します。そのため一般ユーザー(rootではない)によって実行されたプログラムは、root権限などで保護されたファイルなどにはアクセスできません。

しかしそれでは一般ユーザーはパッケージマネージャー4などのroot権限を要求するプログラムを実行できません。それを回避するためにsudoというコマンドを使ってroot権限を一時的に借り受けます。

sudo利用時にはユーザーのパスワードの入力が求められると共に、sudoを実行することができるユーザーは厳密に管理されます。そのため安全性と利便性を両立することが出来ます。

bash
# sudoを用いてaptをroot権限を借りて実行する sudo apt update # これは権限が足りないのでエラーになる apt update

Linuxの権限管理はファイルやディレクトリ側に設定されています。あなたがそのファイルにアクセスできるかどうかは、あなたが誰であるかではなく、そのファイルが誰に何を許可しているかによって決まるのです。

ユーザーや権限についてはこちら ->

sudo。職権乱用の解決策。


多くのLinuxデスクトップ環境ではrootと一般ユーザーは同一人物が利用するのでわざわざsudoを使って権限を借りる必要は無いようにも思えます(=常にrootとして操作すればいい)。しかしrootでのログインは常に強力な権限をもつ代わりに過剰な権限による事故を誘発します。過剰な権限は常に事故の可能性を孕んでいるのです。

危険なプログラムにroot権限を与えてしまうリスクはもちろん、rootで作成したファイルの所有者はrootになるため、グループやその他で特殊な管理されない限り一般ユーザーでは閲覧できず、rootの常用は利便性すらも低下させます。

root常用のデメリットとroot権限の利便性を権限の一時昇格という操作で両立させた機能がsudoなわけです。

全部テキスト。すべてを繋いで


先ほどまでlsなどのコマンドを見てきたわけですが、あれらのコマンドは基本的にテキストで結果を表示します。ファイルエクスプローラーのようにGUIで結果を表示することはありません。しかしテキストであるからこそ強力な処理の連続を記述できます。Linuxではコマンドを繋げて一連の処理の連続をその場で実行できます。コマンドの出力を|という記法を使って、次のコマンドの入力に渡すことで各処理をパイプラインとして実行できるのです。ちなみにこのプログラムの出力を標準出力、入力を標準入力と言います。

例えばクラブのメンバーの情報が記述されているmembers.txtファイルに対して、メンバーの検索と並び替えを行う場合は以下のような記述で1回で処理ができます。

members.txt

txt
Hiro, Tokyo Alice, Chiba Ann, Saitama Bob, Tokyo
bash
# members.txtを出力 # 1行ずつTokyoが含まれるか検索 # A-zでソート [alice@ubuntu ~]$ cat members.txt | grep "Tokyo" | sort # 以下が結果 Bob, Tokyo Hiro, Tokyo

このコード...5

一般的なプログラミング的に書くならこんな感じになります。(架空の言語ですが) 処理を包み込まずに**次に渡す""という処理が可能なのです。

python
sort(find("Tokyo", read("members.txt"))) Bob, Tokyo Hiro, Tokyo

一般的なプログラミング言語にはデータ型があるため、ここまでなんでも次の処理に値を渡すことは難しいです。しかしCUIなどのコマンドは基本的に文字列/テキストとしてしか値を入出力しません。これによって様々なコマンドを自由に組み合わせることができます。

そのため複雑なデータ構造などを厳密に繋げるような操作は難しいですが、一般的なデータに関しては文字として処理可能です。

個人的な体験として、一番使うのはgrepにパイプで結果を検索することです。

CLIやShellに関しては以下のページを。

Shellについて

Linuxを最も簡単に身につける方


Windowsをラインセンスごと消し飛ばし、自身にLinuxの運用を強制する

さすがにWindowsを消すというのは冗談ですが、Linuxを一番楽に学ぶ方法は実際に使うことだと考えています。まずは仮想環境などで消してもいいファイルたちなどでいろんな操作を試しながら操作や構造を覚えていくことが一番楽だと思います。

言い訳・注釈


必要最低限の知識を...

もちろん足りねぇだろと言われることが目に見えていますが、あくまで学習目的における導入ハードルを下げるための資料の1つになればという考えです。マサカリは優しく投げてください。あと、細かい話は随時別ページにて追加していく予定です。

ありとあらゆる箇所におけるLinux表記

Gnu/Linux表記は一般的でない上に新規ユーザーの解釈に負荷を掛けると判断したためLinuxと表記しました。 また、本来ならUNIXおよびUnixと表現する場においても簡単のためにLinuxと表記しました。マサカリは優しく投げてください。

Footnotes


  1. 厳密にはローカルのDBとリモートのDBの同期であることが多く、アップデートそのものはupgrade。(pacmanに関しては-Syuでアップデートまで行う)

  2. Redditより-フォルダとディレクトリの違いって何?

  3. AIの発展のせいで安易にこの表現ができなくなったことは1つの悲しいことです。ただCUIの基礎的なコマンドを自然言語で命令するメリットがそこまで高くないため、この表現はこのまま採用しました。

  4. パッケージマネージャーはシステム全体にインストールされているパッケージを操作するためroot権限が必要なことがほとんど。(brewなどの一部のユーザ以下にしかインストールしないマネージャーは別)

  5. 考えてみればgrepはファイルパスが引数にあれば中身を読んでくれるのでcatする必要ないですが、パイプの利便性ってことで。