OS・シェルの基礎を学びPCの動作を理解する - レアゾン・ホールディングス 2025新卒エンジニアOS/Shell研修 -
こんにちは! 2025年度に新卒エンジニアとして株式会社レアゾンホールディングスに入社しました、鈴木健介です。
私は大学・大学院で情報科学を専攻し、IoT、ネットワーク、マイコン、Web技術など幅広く学んできました。研究活動に加え、インターンシップや業務委託を通じて実践的な開発経験も積んできました。常に新しい技術にアンテナを張り、興味を持った分野を深く掘り下げることを心がけています。
そんな私ですが、これまでの経験の中でOS(オペレーティングシステム)については、大学の講義や趣味で断片的に触れる程度で、体系的に学ぶ機会は多くありませんでした。そのため、OSがどのように動いているのか、正直なところ「なんとなく」の理解に留まっている部分がありました。
しかし、今回レアゾンホールディングスの新卒研修でOSとシェルについて深く学べる講義があると知り、「これは知識を整理し、深める絶好の機会だ!」と感じました。
そこで、この研修での学びや自身で調査した内容をもとに、ブログ記事としてまとめることにしました。
研修の講義内容(流れ)について
講義は以下のような流れで進みました。
- OSの概要解説
- チーム別課題調査・発表(カーネル、メモリ管理、ストリームなど)
- シェルの講義
- シェル(CLI)を用いた実践演習
- Dockerについて
- シェルスクリプトについて
記事も基本的にはこの流れに沿って進めます。
ただし、OSの理解を深めるためには、まずPC(パーソナルコンピュータ)の基本的な仕組みを知っておくことが役立つと考えました。そのため、OSの説明に入る前に、少しだけPCの概要について触れたいと思います。
PC(パーソナルコンピュータ)について
皆さんは普段、どのくらいPC(パーソナルコンピュータ)を利用されていますか?
お仕事やプライベートで、現代生活においてPCは非常に身近な存在ですが、「どうやって動いているの?」と疑問に思う方もいらっしゃるかもしれません。
実は、複雑に見えるPCも、基本的には大きく分けて5つの要素から成り立っています。それは「演算装置」「制御装置」「記憶装置」「入力装置」「出力装置」です。これらは「コンピュータの五大装置」とも呼ばれます。
これらの役割を具体的に見ていきましょう。
演算装置 (Arithmetic Unit): 計算(足し算、引き算など)やデータの比較を行います。
制御装置 (Control Unit): 他の装置が正しく連携して動作するように、全体の流れをコントロール(制御)します。
記憶装置 (Memory Unit): データやプログラムを覚えておく(記憶する)場所です。これには、作業中のデータを一時的に記憶するRAM (メモリ)や、基本的な設定を保存するROMなどがあります。
入力装置 (Input Unit): 私たちがPCに指示やデータを与えるための装置です。代表的なものにキーボードやマウスがあります。
出力装置 (Output Unit): PCが処理した結果を私たちに表示したり伝えたりする装置です。ディスプレイやプリンター、スピーカーなどがこれにあたります。
ここで重要なのがCPU(Central Processing Unit)です。CPUは「中央処理装置」とも呼ばれ、PCの頭脳にあたる中心的な部品です。上記の五大装置のうち、演算装置と制御装置の機能は、主にこのCPUが担っています。
PCの動作を、人間の情報処理に例えてみましょう。
例えば、「ノートに書かれた『11x20』を計算して声に出して答えてください」と言われたとします。
私たちはまず、目(入力装置)で問題を見ます。次に、脳(記憶装置+演算装置+制御装置)で問題を記憶し、計算方法を考えて実行し、最後に声(出力装置)に出して答えます。
PCもこれと似たような流れで動作します。
- キーボード(入力装置)から「11x20」という計算指示が入力されます。
- その指示やデータは、まずRAM(記憶装置)に一時的に保存されます。
- CPU(制御装置)がRAMからデータを取り出し、計算を実行するようにCPU(演算装置)に指示します。
- 計算結果が出たら、CPU(制御装置)がその結果をディスプレイ(出力装置)に表示するように指示します。
- ディスプレイに計算結果の「220」が表示されます。
この一連の流れ、「入力 → 記憶 → 演算 → 出力」がスムーズかつ正確に行われるように全体を指揮・管理しているのが、CPU内部にある制御装置の役割です。もし制御装置がなければ、データが混ざって計算ミスが起きたり、指示された処理が実行されなかったりするかもしれません。制御装置のおかげで、PCは複雑な処理も順番通りに正確に実行できるのです。
このように、PCは5つの基本要素が連携することで動作しています。意外とシンプルな仕組みだと思いませんか?
これでPCの基本的な仕組みについて、少しイメージが掴めたでしょうか。
次の章では、これらのハードウェアを動かすための基本ソフトウェアである「OS (Operating System)」について説明します。
コラム:メモリとストレージ — なぜ両方が必要なのか?
コンピュータがデータを扱う仕組みを、少し人間の記憶に例えてみましょう。私たちが何かを考えたり作業したりするとき、頭の中(脳)で情報を素早く処理します。これは非常に高速です。しかし、人間の脳(特に短期記憶)は、覚えていられる容量に限りがあり、時間が経つと忘れてしまうことも少なくありません。そこで、大切な情報や後で参照したいことは、ノートやメモ帳に書き留めて保管しますよね。
コンピュータの世界もこれと非常によく似ています。コンピュータには、主に二種類の記憶装置が存在し、それぞれが異なる役割を担っています。
主記憶装置(メインメモリ / RAM: Random Access Memory)
CPUが直接アクセスし、プログラムの実行やデータ処理を高速に行うための領域です。まさにコンピュータの「作業机」や、人間の「ワーキングメモリ(短期記憶)」に相当します。
- 特徴:
- アクセス速度が非常に高速。
- 揮発性 (Volatile):電源が供給されなくなると、記憶していた内容が消えてしまいます。
- 補助記憶装置に比べて容量あたりの価格が高い。
補助記憶装置(ストレージ / Secondary Storage)
ハードディスクドライブ (HDD) やソリッドステートドライブ (SSD) などが代表例です。作成したファイル、インストールしたアプリケーション、OS自体など、データを永続的に保存しておくための領域です。例えるなら「本棚」や「ノート」の役割です。
- 特徴:
- 主記憶装置に比べてアクセス速度は遅い。
- 不揮発性 (Non-volatile):電源が供給されなくても、記憶内容が保持されます。
- 主記憶装置に比べて容量あたりの価格が安いため、大容量化しやすい。
ここで、「常に高速なRAMだけを大量に搭載すれば、補助記憶装置は不要になるのでは?」と考えるかもしれません。しかし、RAMは上記のとおり揮発性であり、電源を切るとデータが消えてしまいます。また、大容量化しようとすると非常に高価になります。
そのため、現在のコンピュータは、高速だが揮発性で高価なRAM(現在の作業に必要なデータやプログラムを一時的に置く場所)と、低速(RAM比)だが不揮発性で安価・大容量な補助記憶装置(データやプログラムを長期的に保存する場所)を組み合わせて利用することで、性能、コスト、永続性のバランスを取っています。
OSは、これら性質の異なる記憶装置の間でデータを効率的にやり取りし、管理するという重要な役割も担っています。
OSについて
OS(オペレーティングシステム)とは、コンピュータのハードウェア(CPU、メモリ、ディスクなど)とソフトウェア(アプリケーションなど)を効率的に結びつけ、システム全体を動作させるための中核(コア)となるソフトウェアです。研修では「パソコンが人間の命令を受け取り、ハードウェアで実行してくれるためのプログラムの集まり」と学びました。OSがなければ、コンピュータは単なるハードウェアの集合体に過ぎず、私たちが普段使っているような便利な機能は実現できません。
このOSの役割は、少し抽象的でイメージしにくいかもしれません。より具体的に考えてみましょう。
例えば、Wordでレポートを書き、「保存」ボタンを押したとします。この単純な操作の裏側では、OSが次のような複雑な処理を仲介しています。
- ユーザーが「保存ボタンを押す」という操作をする。
- OSがキーボードやマウスからの入力を検知する。
- OSがWord(アプリケーション)に「保存処理をせよ」と命令する。
- OSがメモリの状態を確認し、書き込むべき内容をメモリ上に準備する。
- OSがストレージ(SSDやHDD)に「この内容を書き込め」と指示を出す。
このように、ユーザーが意識することなくハードウェアとソフトウェアが連携できるのは、OSが両者の間を適切に仲介しているからです。
OSの構造:ユーザー空間とカーネル空間
では、OSは具体的にどのようにして、この重要な仲介役を果たしているのでしょうか?これを理解するには、OSが持つ重要な構造、特に「ユーザー空間(User Space)」と「カーネル空間(Kernel Space)」という動作領域の分離について知ることが役立ちます。
OSの中核部分であるカーネルは、ハードウェアの直接的な制御やメモリ管理など、システムの根幹に関わる非常に重要な処理を行います。もし、アプリケーションやユーザーがこのカーネルの機能を誤って操作できてしまうと、システム全体が簡単にクラッシュ(Windowsでいうブルースクリーンなど)する危険があります。
このような事態を防ぎ、システムの安定性と安全性を確保するため、OSは動作領域を分離しています。
-
カーネル空間 (Kernel Space):
- OSの中核(カーネル)が動作する、特権レベルの高い領域。
- ハードウェアへの直接アクセスや、システム全体の管理機能を実行します。
- ユーザー空間から直接操作することはできず、厳重に保護されています。
-
ユーザー空間 (User Space):
- 私たちが普段使う一般的なアプリケーションソフトウェアが動作する領域。
- カーネル空間に比べて権限が制限されています。
- アプリケーションがハードウェアの機能(例: ファイルへの書き込み)を利用したい場合は、カーネルに対して「システムコール」という形で処理を依頼します。
このように、二つの空間を分離することで、アプリケーションがシステム全体に致命的な影響を与えることを防ぎつつ、必要な機能はOS(カーネル)を介して安全に利用できる仕組みが提供されています。
OSの重要な概念を深掘りする
研修では、チームに分かれてOSの重要な概念を調査・発表する時間がありました。ここではその内容を元に、いくつかのキーワードを深掘りします。
-
システムコール (System Call)
システムコールは、ユーザー空間とカーネル空間の「橋渡し役」です。ユーザー空間のアプリケーションが「ファイルを保存したい」「ネットワーク通信をしたい」といったハードウェア操作を必要とするとき、直接ハードウェアを触る代わりにOSのカーネルに「お願いします」と依頼を出します。この依頼の仕組みがシステムコールです。カーネルはこの依頼を受け取り、安全性を確認した上でカーネル空間で処理を実行し、結果をアプリケーションに返します。
-
プロセス (Process)
プロセスとは、簡単に言えば「実行中のプログラム」のことです。私たちがWordやWebブラウザを起動すると、それぞれが独立したプロセスとしてOSに管理されます。
近年のPCは複数のアプリを同時に動かす(マルチタスク)のが当たり前ですが、多くのPCではCPUは一つです。OSは、CPUの時間を非常に短い単位で分割し、複数のプロセスに順番に割り当てる「タイムシェアリング」という技術を使っています。これにより、あたかも複数のプロセスが同時に動いているかのように見せかけています。 -
ファイルシステム (File System)
ファイルシステムは、ストレージ上のデータを「ファイル」や「フォルダ(ディレクトリ)」という単位で整理・管理するための仕組みです。私たちがファイルに名前をつけたり、フォルダを作って分類したりできるのは、OSが提供するファイルシステムのおかげです。これにより、膨大なデータの中から目的のものを簡単に見つけ出すことができます。
-
ストリーム (Stream)
ストリームとは「データの流れ」のことです。特にコマンドラインでの操作では、以下の3つの標準ストリームが重要になります。
- 標準入力 (stdin): プログラムがデータを受け取る入力。通常はキーボードからの入力。
- 標準出力 (stdout): プログラムがデータを出力する先。通常は画面(ターミナル)。
- 標準エラー出力 (stderr): プログラムがエラーメッセージを出力する先。通常は画面(ターミナル)。 これらのデータの流れをうまく制御することが、後述するシェルを使いこなす鍵となります。
シェルについて
研修の後半は、OSを操作するための「シェル」について学びました。
そもそもシェルとは?
シェルとは、「人間がOSに命令を出すための仲介をしてくれるプログラム」です。私たちがキーボードから入力したlsやcdといったテキストコマンドを解釈し、「こういう処理をしてほしい」とOSに伝えてくれる、いわばユーザーとOSの間の通訳者です。
Windowsのコマンドプロンプトや、Macのターミナルもシェルの一種を実行するためのアプリケーションです。
なぜシェルを使うのか?
マウスで操作できるGUI(グラフィカルユーザインタフェース)の方が直感的で簡単なのに、なぜエンジニアは黒い画面(CUI/CLI)でコマンドを打つのでしょうか?研修で学んだメリットは以下の通りです。
- GUIがない環境で必須: Dockerコンテナの中やサーバーなど、GUIが用意されていない環境は数多く存在します。そのような環境を操作するには、シェルが必須となります。
- 作業の自動化: シェルには、一連のコマンドをファイルにまとめて一度に実行できる「シェルスクリプト」という機能があります。複雑な作業や繰り返し行う作業を自動化でき、業務効率を大幅に向上させることができます。
一方で、コマンドやその使い方を覚える必要があるため学習コストが高い、重要なシステムファイルを誤って変更・削除してしまう危険性がある、といったデメリットも存在します。
シェルを使ってみよう!〜基本コマンドハンズオン〜
研修では、実際に手を動かしながら基本的なコマンドを学びました。ここではその一部を紹介します。
(Mac/Linux環境を想定しています。Windowsの方はWSLなどの環境で試してみてください)
ディレクトリ操作
- pwd (print working directory): 現在いるディレクトリ(フォルダ)の場所を表示します。
- ls (list): 現在のディレクトリにあるファイルやディレクトリの一覧を表示します。
- cd <ディレクトリ名> (change directory): 指定したディレクトリに移動します。
- mkdir <ディレクトリ名> (make directory): 新しいディレクトリを作成します。
ファイル操作
- touch <ファイル名>: ファイルのタイムスタンプを現在時刻に更新し、ファイルが存在しない場合は空のファイルを新規作成します。
- cat <ファイル名> (concatenate): ファイルの中身を表示します。
- cp <コピー元> <コピー先> (copy): ファイルやディレクトリをコピーします。
- mv <移動元> <移動先> (move): ファイルやディレクトリを移動、または名前を変更します。
- rm <ファイル名> (remove): ファイルを削除します。(注:ゴミ箱には入らず即座に削除されるため、非常に危険なコマンドです。使用には細心の注意が必要です)
パイプとリダイレクション
ストリームの概念を使うと、コマンドの実行結果をファイルに保存したり、あるコマンドの出力を別のコマンドの入力として渡したりできます。
-
>: 実行結果をファイルに書き込みます。 -
>>: 実行結果をファイルに追記します。
# "hello world" という文字列を hello.txt に書き込む
$ echo "hello world" > hello.txt
$ echo "next line" >> hello.txt
-
|(パイプ): あるコマンドの標準出力を、次のコマンドの標準入力に繋ぎます。
# ls の結果を行数カウンター(wc -l)に渡し、ファイルとディレクトリの数を数える
$ ls | wc -l
権限管理
LinuxベースのOSでは、ファイルやディレクトリごとに「誰が」「何をしていいか」という権限が細かく設定されています。ls -lコマンドでその詳細を確認できます。
chmodコマンドで権限を変更したり、chownコマンドで所有者を変更したりできます。また、sudo(superuser do)コマンドを使うと、一時的にシステム管理者(root)の権限でコマンドを実行できます。これにより、普段は変更できないシステム設定なども操作できます。
シェルスクリプトで作業を自動化する
シェルスクリプトは、これまで学んだコマンドをファイルに記述して、一連の処理を自動化するためのものです。
シェルスクリプトの基本
ファイルの一行目に#!/bin/bash(シェバンと言います)と書くことで、そのファイルがBashシェルで実行されるべきスクリプトであることを示します。それ以降に、実行したいコマンドを順番に書いていくだけです。
#!/bin/bash
# hello.sh
echo "シェルスクリプトの世界へようこそ!"
echo "現在の日時は、"
date
このファイルをhello.shとして保存し、bash hello.shコマンドで実行できます。
研修の最終課題では、Webサーバーのアクセスログを解析し、「アクセスの多いIPアドレスTOP10」や「エラーの発生回数」などを集計するシェルスクリプトを作成しました。grep(文字列検索)、sort(並び替え)、uniq(重複削除)、cut(列の切り出し)といったコマンドをパイプで繋ぎ合わせることで、複雑なデータ処理も自動化できることを体感しました。
コラム:Dockerとコンテナ技術 — OSとの深い関係
Dockerは、アプリケーションを「コンテナ」と呼ばれる独立した環境にパッケージングし、実行するための代表的なプラットフォームです。近年、開発やインフラの世界で広く利用されています。
一見すると、DockerはOS本体とは別の「仮想環境」技術のように思えるかもしれません。「仮想環境とOSは直接関係ないのでは?」と感じる方もいらっしゃるでしょう。しかし、Dockerが採用するコンテナ技術は、OS、特にそのカーネルと非常に密接に関係しています。
まず、Dockerを理解するために、従来の仮想化技術(ハイパーバイザー型仮想化)と比較してみましょう。VMwareやVirtualBoxなどがこれに該当します。ハイパーバイザーは、物理マシン(ホスト)上に仮想的なハードウェア環境を作り出し、その上にゲストOS(例えば、Windowsホスト上にLinuxのUbuntu)を丸ごとインストールして動かす仕組みです。これにより、ホストOSとは異なるOS環境を完全に独立して動作させられますが、各仮想マシンごとにOS(カーネルを含む)を起動・実行するため、リソース(CPU、メモリ)のオーバーヘッドが大きいという特徴があります。
一方、Dockerが採用するコンテナ型仮想化は、根本的にアプローチが異なります。コンテナは、ホストOS(Dockerの場合は主にLinuxカーネル)のカーネルを共有します。つまり、コンテナごとに独立したOSを起動するのではなく、ホストOSのカーネル上で、プロセスやファイルシステム、ネットワークなどを互いに隔離された空間(コンテナ)で実行するのです。
なぜコンテナは「軽量」なのか?
コンテナ型仮想化の大きなメリットの一つが「軽量」であることです。その理由は、まさにこのカーネル共有にあります。ゲストOSを起動する必要がないため、コンテナの起動はアプリケーションプロセスを起動するのに近く非常に高速であり、メモリやCPUのオーバーヘッドもハイパーバイザー型に比べて大幅に削減されます。
カーネル共有は安全なのか?
「ホストOSのカーネルを共有して、コンテナ間で干渉したり、セキュリティ的に問題はないのか?」という疑問は自然です。結論から言うと、Linuxカーネルが持つ「名前空間 (Namespaces)」 や「コントロールグループ (Cgroups)」 といった機能によって、コンテナ間の分離とリソース制御が実現されているため、安全に利用できます。
- 名前空間 (Namespaces): プロセスID、ネットワーク、マウントポイントなどをコンテナごとに隔離し、あたかも独立したOSのように見せかけます。
- コントロールグループ (Cgroups): コンテナが使用できるCPUやメモリなどのリソース量を制限・管理します。
このように、Dockerコンテナのような比較的新しい技術も、OSの基本的な仕組み(カーネル、プロセス管理、リソース分離など)の上に成り立っています。一見異なる技術領域に見えても、基礎となる知識が相互に繋がっていることを発見できるのは、コンピュータサイエンスを探求する上での大きな魅力の一つと言えるでしょう。
まとめ
今回の研修を通じて、OSがどのようにハードウェアとソフトウェアを仲介し、安定したシステムを支えているのか、その基本的な仕組みを体系的に理解することができました。そして、シェルとシェルスクリプトを学ぶことで、CUI操作の強力さや作業自動化の重要性を実感しました。
長くなりましたが、最後までお読みいただきありがとうございました!
参考文献
- レアゾンホールディングス 2025年度 新卒研修資料
- Operating Systems: Three Easy Pieces
- Linuxカーネル:5.10.14
▼採用情報
レアゾン・ホールディングスは、「世界一の企業へ」というビジョンを掲げ、「新しい"当たり前"を作り続ける」というミッションを推進しています。
現在、エンジニア採用を積極的に行っておりますので、ご興味をお持ちいただけましたら、ぜひ下記リンクからご応募ください。