Linuxの歴史とLinuxの概要

# Linuxとは
LinuxとはOSの一種でコンピューターを動かすための基本ソフト
基本ソフトとはコンピュータを動かすソフトウェアのこと。
俗に言うOSのこと。
例えば、Windows, Max OS X, AndroidなどもOSであり、Linuxもそれらと同じOSです。

OSとはOperating Systemの略でシステム全体を管理するソフトウェアです。
タスク管理やメモリ管理デバイス管理などの役割があります。

## Linuxの歴史
そもそもOSの始まりは1960年代です。
当時はコンピュータにOSという考えはなく、計算用なら計算用のコンピュータという目的に応じたコンピュータが作られていました。
それぞれにカスタマイズする必要があり、必然的に高くなります。
大量生産ができない売り手も買い手も不便でした。

そこでこの課題を解決するために、OSを開発したのがIBMです。
それがIBM System/360で世界初の汎用コンピュータとして爆発的に売れ1960年代後半では大型コンピュータの70%以上のシェアを確保しました。
それと同時期にUNIXが誕生します。

### 1970頃 : 
アメリカのベル研究所でMulticsという多機能なOSが作られました。
しかし、多機能な分OSが大きくなりすぎ当時の非力なコンピュータでは動かすことがほぼできず失敗に終わります。
Multicsの開発に関わったケン・トンプソンがこの失敗からUNICSというOSを作成します。
mutl(複数)からuni(単独)という言葉に変わったように、UNICSはとてもシンプルな小さなOSです。
UNICSからUNIXへ名前がのちに変わります。

### 1985年頃 : 
ソースコードも公開されていたので、様々な派生版のUNIXが誕生した。
しかし派生版のUNIXが次から次へと誕生し、まとまりがなくなっていきます。
ちなみにUNIXのライセンスが存在し認められていないものはUNIX互換OSといわれます。
様々な企業がシェア取りにUNIXマシンを製造していましたが、ライセンス問題はかなり揉め企業同士の争いもあり足を引っ張り合う状態が続いた。
この争いをしている最中にMicrosoftのwindowsが登場し最終的に圧倒的シェアを獲得し標準OSの座を手に入れました。

### 1991年頃 : 
リーナス・トーバルズが学校の授業で渡されたUNIXの機能が不足していると感じターミナルエミュレータを自力で作成したが、改造というより作り変えレベルだったそうです。
これをきっかけでOSをゼロから作り直し誕生したのでLinuxです。
ちなみにリーナス・トーバルズはGitを作ってます。

Linuxは当時オープンソースではなく、勉強用として開発されましたが、周りからのアドバイスも欲しいという理由でオープンソース化しました。
UNIX系OSはライセンスで縛られ扱いにくい点、Linuxはオープンソースなので自由にカスタマイズもできるため大きく普及しました。


## Linuxの活躍場
サーバーやデスクトップをはじめ、IoTにも使われている。
エアコンとか車とかゲームとか、インターネットを介して通信するもの

とくにサーバーでは圧倒的なシェアで企業のLinux導入率は約80%程。
今後もLinuxのシェアは全体を通しても伸びていくだろうといわれています。

## Linuxのメリデメ
 ### メリット
 - オープンソースなので誰でも自由に使える
 - 世界中で使われていて信頼性が高い
 - 目的に応じたカスタマイズの自由度が高い
 - スペックの低いパソコンでも使える

 ### デメリット
 - windowsやmacで使えたアプリケーションが使えないことがある
　　 - Microsoft Ofiiceなどが動作しないとか
　　 - マルチメディア系ファイルの編集が苦手
 - 基本的にサポートが充実していない
 - 日本語対応されていない部分が多い

## Linuxを学ぶ意味
活躍場でも書いた通り幅広い用途でLinuxがつかわれているため、Linuxに触れる機会がとても多い。
そのためLinuxを知らないと対応できないことも多く発生するため学ぶ必要があると思います。

また、Linuxは長い時間をかけて開発をされてきたことで、大きな変更などもない。
一度学べば基本的に何年も使える技術を身に着けられることになる。

## Liuxカーネルとディストリビューション
![Linux_ディストリビューション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381381/adfd72ea-e9da-f3b5-303c-8e41dccb7173.png)
汚い画像ですが参考程度に・・・
Linuxという言葉は、広義ではLinuxディストリビューション、狭義ではLinuxカーネルを指します。
つまにどっちもLinuxを知るうえで両方理解しておく必要があります。

### Linuxカーネル
Linuxカーネルとは、Linuxの核を意味します。
OSの中核部分として活躍しているソフトウェアがカーネルと呼ばれます。
そもそもOSとはシステム全体を管理する仕事ですが、その中心部分の機能がLinuxカーネルです。
具体的な仕事を紹介すると
- メモリー管理
- プロセス管理
- デバイスドライバー
- システムコールとセキュリティ

などです。
Linuxカーネルに関してより詳しく知りたい方はこちらの記事が分かりやすいので見てください。
[【初心者向け】Linuxカーネルって一体なんだ？](https://qiita.com/uguis410/items/17ec1e447e9716bfdca7
 "【初心者向け】Linuxカーネルって一体なんだ？")

### ディストリビューション
ただ、カーネルはあくまでも基本的なことを仕事してくれるだけなので、やりたいことをうまく進めるためにはほかの力が必要です。
Linuxカーネルの具体的な仕事は基本的に自分たちからみてあまり関りがなく裏でうまくやってくれていることですよね。
そもそもカーネルだけではコマンド実行もできず、起動もうまくできないと思います。

つまりコマンド実行ができるようになっているのはカーネル以外のソフトウェアを利用しているため、上記の図で表現ができます。
ディストリビューションとは、カーネルとカーネル以外のソフトウェア群をまとめたものを指します。

自分たちでカーネルから必要なソフトウェアをピックアップして構成する、もしくは作ることは時間と労力がかかりますしレベルの高い知識が必要とされます。
そのためLinuxとは広義であるLinuxディストリビューションが一般的な意味になります。

ディストリビューションは単にソフトウェアをまとめているので目的に応じて組み合わせた形で配布されています。
代表的なディストリビューションとして、Redhad, ubuntu, CentOSなどがあります。
これらはLinuxカーネルを使っている点は全く同じでまとめられているソフトウェアが違うだけです。



## Linuxディレクトリ構造
ディレクトリはファイルが保存している場所のこと。(フォルダと同じ概念)
ディレクトリは入れ子構造になっている。
一番上のディレクトリをルートディレクトリと呼ぶ。
ルートディレクトリを頂点として階層構造になっており、これを「ディレクトリーツリー」と呼ぶ
>root/
　├ bin/
　├ etc/
　├ usr/

### Linuxとwindowsの違い
windowsはドライブからディレクトリ構造が始まるため、下記の場合はディレクトリーツリーが2つ存在する。
一方Linuxは1つのディレクトリツリーのみのシンプルな構成。
> c:drive
├ document
├ download
d:drive
├ hoge

### 主要ディレクトリの役割
 #### /bin
一般ユーザーや管理ユーザーの両方が使用するcommandの実行ファイルが格納されている。
ほかにもいろんな場所に実行ファイルはありますが、重要度の高い実行ファイルが格納されている。
cpやchmodなどシステムを管理する上で基本的なcommandが入っている。

#### /dev
デバイスファイルを格納。
デバイスファイルとは、キーボードやマウスなどのデバイスとのやり取りするファイルです。
デバイスにはデバイスドライバというデバイスを動かすために必要なソフトですが、このデバイスドライバに命令するのを簡単にしてくれるのがデバイスファイルです。
人間がしてほしいことをデバイスファイルに伝えることで、デバイスファイル→デバイスドライバ→デバイスへ伝達して実際に動いてくれています

#### /etc
設定ファイルを格納している。
Linuxで動作するアプリケーションの設定ファイルやLinux自身の設定ファイルなどが置かれている

#### /home
ホームディレクトリ(ユーザーごとに割り当てられている個人用ディレクトリ)
僕たちはここに自由にファイルやディレクトを作成できる

#### /sbin
管理者用のcommand実行ファイルを格納している

#### /tmp
一時的なファイルを格納する
アプリケーションを実行する際に一時的にファイルとして保存する場合などに使用します。
システムの再起動や一定期間アクセスがないとファイルが消える

#### /usr
各種アプリケーションとそれに付随するファイルを格納する

#### /var
変化(動的)するデータを格納する
アプリケーションのログなどを格納してたりする。
一時的なデータとしては/tmpも一緒ですが、こちらは消えない

## 代表的なディレクトリ操作コマンド

### cdコマンド
cdは「change directory」の略です。
```terminal
$ cd [オプション] [ディレクトリ]
$ cd / # ルートディレクトリへ移動
$ cd ~ # homeディレクトリへ移動
$ cd .. # 現在のディレクトリから1つ前のディレクトリへ移動
$ cd /home/ryo # 絶対パスでhomeディレクトリへ移動
$ cd home # 相対パスでhomeディレクトリへ移動
```
あまりオプションは使わないので省略します。
cd コマンドで使えるショートカットコマンドは複数存在しますので、覚えておくとよいかと思います。
homeディレクトリは/homeではなくて、/home/ryoのうようなアカウント場所がhomeディレクトリなので注意してください。
余談ですが、こういったコマンドはshellを通してLinuxカーネルに伝えられ、Linuxカーネルからshellにコマンド結果を返して僕たちに伝わります。

![shell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381381/76473630-563d-e2d6-5a8a-338e2e3dfd91.png)

コマンドを実行する際にターミナルも使いますが、このターミナルと shellも別々のソフトウェアということです。


### pwd
pwdは「Print Working Directory」の略です。
英語の通り、作業中のディレクトリを表示するということです。
```terminal
ホームディレクトリで作業中...
$ pwd [オプション]
$ pwd # /home/ryo
```
こちらもあまりオプションは使わないので省略します。

### ls
lsは「list segments」の略です。
```terminal
$ ls [オプション] [ファイルまたはディレクトリ……]
$ ls # 今いるディレクトリのファイルやフォルダを表示する
$ ls /home/ryo # ryoのファイルやフォルダを表示
$ ls -a # 今いるディレクトリのファイルやフォルダをすべて表示する
```
オプションはたくさんあるので一番使われる-aを紹介しましたが、これは非表示フォルダなども見ることができます。

### mkdir 
mkdirは「make directory」の略です。
新しくフォルダを作ります
```terminal
$ mkdir [オプション] ディレクトリ名
$ mkdir sample # 今のディレクトにsampleディレクトリが作られる
```

### rmdir
rmdirは「remove directory」の略です。
```terminal
$ rmdir [オプション] [ディレクトリ名]
$ rmdir sample # sampleディレクトリが削除される
```
注意点は削除するとwindowsのようにゴミ箱に行かず本当に削除されるので注意してください。
またsampleディレクトリにファイルなどが存在すると削除できません。


すみません・・・。
コマンド紹介はちょっとこころが折れました・・・。
ファイル操作などたくさんのコマンドがあるので調べてみるとよいかと思います。

また、標準入出力やパーミッション(権限)やプロセス・ジョブ管理など、管理や入出力先を変えて実行結果をファイルに書き込むことも可能です。
できるようになると幅が広がると思うのでぜひtryしてみてください。


# おすすめな本
https://www.amazon.co.jp/gp/product/4274064069/ref=ox_sc_act_title_1?smid=AN1VRQENFRJN5&psc=1

Unixの歴史や設計思想なども学べてとてもいい本だと思います。
学習を終えたときに一度読んでみると得られるものが多いかなと思います。