Linux 使いになりたい人向けの Intel N100 ミニ PC で構築する開発環境(1) - 構築する開発環境について
はじめに
これは、Linux 使いになりたい人向けに Intel N100 ミニ PC を使って開発環境を構築する方法を解説する記事の第1弾です。使用する Intel N100 ミニ PC の仕様は次のものを前提とします。
項目 | 内容 |
---|---|
OS | Windows 11 Pro |
CPU | Intel N100 |
メモリ | 16GB |
ストレージ | SSD 512 GB |
画面出力端子 | HDMI×2 |
WiFi | 5G/2.4G |
イーサネット | RJ45×1 |
Bluetoot | BT4.2 |
USB | USB3.0×2/USB2.0×2 |
このマシンで最終的に Windows と Ubuntu Desktop が使えるように環境構築することを目指します。zenn.dev を購読している人のレベルを考えると、画面キャプチャはそれほど必要がないと考えているため少なめです。また、説明についても明示しないとわかりにくいと思われるものに絞っているので少なめです。
今回は、構築する開発環境についての説明なので、文章だけになっています。
構築する開発環境について
ここで構築する開発環境は次のようなものを考えています。
- 仮想化ソフトウェア (Hyper-V + WSL2 + VirtualBox)
- コンテナーソフトウェア (Docker Compose + Docker Engine)
- 開発エディタ (Visual Studio Code )
- バージョン管理システム (Git + Git for Windows + Forgejo)
- CI/CD (githooks or Gitness or Woodpecker CI or GitBucket + gitbucket-ci-plugin or Jenkins)
Intel N100 ミニ PC の特徴は低価格でありながら、仮想化機能を備えており、VirtualBox や Hyper-V といった仮想化ソフトウェアを動作できることが大きな魅力です。メモリ 16GB で SSD 512 GB のものであっても3万円から4万円程度で購入(2024年1月時点)できます。これだけの性能があれば、WSL2、Hyper-V、VirtualBox といった仮想化ソフトウェアを贅沢に使うことができます。
また、最近の開発環境では必須と言える Visual Studio Code、Docker Engine、Git システムも利用ができるようになります。Git システムについては、Forgejo のような課題管理や Wiki の機能も使える Web ベースの環境がプライベートの開発環境にもあった方が何かと便利です。
贅沢を言うなら、プライベートな開発環境で費用を気にせずに使える CI/CD も用意しておきたいところです。ただし、CI/CD については、基本的に Intel N100 ミニ PC にそのまま用意するよりは、CI/CD 用の別マシンを用意して稼働させた方が良いと考えています。そのため、Intel N100 ミニ PC では軽く動かせる Git Hook で CI/CD 関連の処理を動かすことを検討し、必要に応じて、Gitness、Woodpecker CI、GitBucket + gitbucket-ci-plugin、Jenkins といったものを使えるようにします。
Intel N100 ミニ PC を使って開発環境を構築することのポイントを整理すると次のようになります。
- 低価格ながら仮想化機能やメモリ、ストレージの性能が十分
- 仮想化機能により、WSL2、Hyper-V、VirtualBox といった仮想化ソフトウェアを動作可能
- Visual Studio Code、Docker Engine、Git システムも快適に利用可能
- CI/CD については、別マシンで稼働させることを前提に試用目的で Intel N100 ミニ PC で動作確認
Intel N100 ミニ PC を使う理由
今回、Intel N100 ミニ PC を使った開発環境を構築するのですが、なぜこのマシンを選んだのか説明しておきます。メリットをリストにすると次のようになります。
- 場所を取らず、値段が安いため、情報工学系の大学生や駆け出しの開発者でも入手しやすい。
- メインマシンとは別にプライベートサーバーとして動かせるスペックがある。
- Ubuntu Desktop のような Linux 系の OS も動作させることができる。
- サブマシンとして用意しておくことで、メインマシンを安定した環境に保つことができる。
- リモートデスクトップを使って、リモートから利用できる。
- 試しに動かしたいソフトウェアを Hyper-V の仮想マシンへインストールして使うことができる。
これらについて、順番に説明します。
まず、このマシンはミニ PC なので、小さくて場所を取りません。また、値段が安いということから、情報工学系の大学生や駆け出しの開発者でも入手しやすいということがあります。
次に、Windows 11 Pro、16GB のメモリ、512GB の SSD というスペックのものであれば、メインマシンとは別にプライベートサーバーとして動かしておくこともできます。セットアップ時はディスプレイやキーボードが必要ですが利用時はそれらがなくても稼働できます。
また、基本的に Ubuntu Desktop のような Linux 系の OS(Operating System、オペレーティングシステム)を使って動作させることもできます。このため、Linux を使えるようになりたいと思っている人が、Windows を使いながら Linux も試せる環境として使うことも出来ます。
メインマシンは、普段の仕事や学習をするときに使い、できるだけ安定した環境にしておきたいものです。一方、新しいソフトウェアを試したり、学んだりするときは、理解していないことも多いため、よくわからない環境になってしまうことが多くあります。メインマシンをよくわからない環境にはしたくありませんから、そういった場合のことを考えると、Intel N100 ミニ PC のようなマシンをサブマシンとして1台手元に用意しておくと良いのです。
メインマシンではないので、リモートから利用できることも考慮して、Windows Pro が使えるものを採用しています。また、Windows Pro であれば、Hyper-V の仮想マシンが使えるため、試しに動かしたいものは仮想マシンへインストールするといったことが出来るようになります。こうすることで、Intel N100 ミニ PC 自体の環境についても安定させることができます。
以上の説明からわかるように、Intel N100 ミニ PC は、プライベートサーバーや開発環境を構築するのに適しているといえます。Intel N100 ミニ PC を利用するポイントを整理すると次のようになります。
- コストパフォーマンスが高い
- 仮想化機能に対応している
- Linux も動作可能
- メインマシンを安定した環境に保つことができる
継続的な環境構築
最近のソフトウェア開発では、使用しているソフトウェアの更新頻度が高いため、それに合わせて継続的に使用できる開発環境を構築することが重要となっています。
そのため、Intel N100 ミニ PC だけで動けば良いという考えではなく、長く使えるように改良をしたり、他のマシンでも動かせるようにしておくことも考慮して、ソフトウェアの選定や設定をすることが必要になります。
次に継続的な環境構築をする上で重要な事項を挙げておきます。
- Prep(準備)→ Do(実行)→ Review(評価)という PDR サイクルで繰り返し改善
- 便利なソフトウェアの利用を少しでも早く開始してスキルアップ
- 失敗の経験もスキルアップに活かすマインド
- 使用しながら必要になったことを追加して、使いこなすための知識を獲得
- 継続的な改善が習慣となるように意識すること
- 仮想化ソフトウェア、コンテナーソフトウェア、バージョン管理システムの活用が有効
順番に説明します。
資格試験のための勉強や、学校での勉強では、「テストで良い点を取るために勉強する」といったマインドとなりやすく、そういった姿勢で学習していると、「使いこなせるようになってから運用利用する」といった発想になりやすいです。
理論体系が整理されているものについては、それで良いのですが、ソフトウェア開発では目に見えないものを扱ってプログラムを作成するため、ブラックボックスとなっている部分が多くあります。それらを理解するのは時間がたくさん必要となるので、「トライアルでも良いから始めて PDR サイクルを回せるようにする」という姿勢で学習するのが良いと考えています。
PDR サイクルというのは、「Prep(準備)→ Do(実行)→ Review(評価)」を1つのサイクルとして、繰り返し改善していく方法です。似たようなものに PDCA サイクルという有名な方法があります。そちらは「Plan(計画)、Do(実行)、Check(評価)、Action(改善)」という仮説・検証型プロセスを循環させるのですが、こちらは、それよりも簡易版のもので、実行することを重視したサイクルです。
あるソフトウェアについて、使いこなせるようになるまで利用を先延ばしにしていると、せっかくの便利なソフトウェアの活用が先送りとなってしまい、スキルアップすることができません。あまりわからないまま使い始めると、失敗することもありますが、そういった経験もスキルアップになるとポジティブに考えるマインドを持つようにして、とにかく使ってみるということが重要です。
使ってみることで、説明されている用語の意味や使われ方がわかるようになっていくものです。そして、使用しながら必要になったことを追加していくことで、各ソフトウェア利用による恩恵を受けながら、使いこなすための知識を身につけることができます。
各ソフトウェアの機能について、説明だけではあやふやだったことも、使っていれば具体的にどんなことを指しているのかイメージがしやすくなり、理解できる部分が増えていきます。そうすると、興味も湧きますし、構築した開発環境を自分にとって使いやすくするためにカスタマイズすることへのモチベーションも上がります。
経験の蓄積は少しでも早い方が良いので、今から始めましょう。最初は少しでも OK で、始めたら習慣化することが大切です。習慣化するためには、継続的に改善できる開発環境となるように構築していくことが必要です。
継続的に改善できる開発環境を構築するにあたっては、仮想化ソフトウェア、コンテナーソフトウェア、バージョン管理システムの活用が必須なので、これらについての理解をしておくのが良いということになります。
仮想化ソフトウェアを使う理由
開発環境の構築にあたって、仮想化ソフトウェアを使うとしました。ここでは、その理由を説明します。
仮想化ソフトウェアを使うメリットは次のようになります。
- メインマシンは安定した環境にしておきたいので、新しいソフトウェアや環境を試すときは、仮想マシンを使う
- 仮想マシンを使えば、新しい環境を試しても、メインマシンに影響を与えず、また、試した環境を簡単に削除できる
- ストレージ管理やネットワーク管理などの作業をするときにも、仮想マシンを使うと便利
- 仮想マシンを使えば、誤った操作をしても、メインマシンに影響がない
- 仮想マシンならメインマシンと違って OS や環境を簡単に再構築できる
これらについて順番に説明します。
この前にも少し出てきましたが、メインマシンは安定した環境にしておきたいので、できるだけ良く使うもの以外は変更したくありません。しかし、パソコンを使い続けているとわかるのですが、良く使うソフトウェアというのは、時間が経過すると変わってきます。
学習や開発の例でいうと、「今月まではプログラミング言語 Python を使っていたけど、来月からはプログラミング言語 JavaScript を使うことになる」といったことが起きます。「これまで Node.js 16 を使っていたけど、来月からは Node.js 18 を使う」といったことも起きます。
こういったことがあったときに、「これまで使っていたものをアンインストールして、新しく使うものをインストール」ができると良いのですが、並行して利用し続けるということが良くあります。そのため、これらを共存させた環境を構築することになり、これを維持することが負担となってきます。
そういうときに、仮想化ソフトウェアを使うと、「これまで使っていた環境は仮想マシンの中に維持するように移行して、新しく使うものをメインマシンへインストールする」ということができるようになります。
他にも、ストレージ管理(ディスク管理)やネットワーク管理などの作業をするにあたって、物理マシンだと試しにくいことも、仮想マシンだと試しやすくなります。
使い慣れないディスク管理ツールやネットワーク管理ツールを使っていて、誤った操作をしてしまうと、OS が起動しなくなったり、ネットワークが使えなくなったりします。仮想マシンなら、OS の用意からやりなおしをするという選択がしやすいですが、物理マシンだとやり直しをする際の手間が多すぎて選択しにくいことが多いです。
例えば、Ubuntu インストーラーの USB メモリへの書き込みや、Linux インストール先の SSD のディスクフォーマット作業などは、メインマシンで作業をしていて間違えるとメインマシンがクラッシュしてしまいます。一度、こういった作業を経験していて、ツールの使い方に慣れていれば、誤操作をする心配はあまりないので、仮想マシンを使って慣れておくのが良いのです。
コンテナーソフトウェアを使う理由
次に、コンテナーソフトウェアを使う理由について説明します。
コンテナーソフトウェアを使うメリットは次のようになります。
- 仮想マシンよりも軽量で、性能に優れている
- 複数のコンテナーを同じハードウェア上で実行できるため、リソース効率が良い
- 異なるソフトウェアバージョンを簡単に切り替えられる
仮想化ソフトウェアを使うと仮想マシンを使って色々試すことができるという説明をしました。これは便利なのですが、利用するときに必要となるリソース(コンピュータ資源)が問題になるときがあります。
仮想マシンは、物理マシンのハードウェアを仮想的にソフトウェアで実装したものなので、実際のハードウェアよりも性能が劣ります。また、複数の仮想マシンが同じハードウェアのリソースを利用できるようになっているので、物理マシンで利用できるよりも少ないリソースしか使えません。
こういったことからわかるように、あるソフトウェアを利用するにあたっては、物理マシンで動かした方が仮想マシンで動かすよりも性能的には有利となります。この性能差が大きい点が問題になることがあります。
一方、コンテナーソフトウェアは OS のリソース管理機能を使って仮想マシンのようなものを実行できるようにするものです。物理マシンのハードウェアを仮想的にソフトウェアで実装するというものではなく、OS の機能なので、性能的には仮想化ソフトウェアの仮想マシンよりも有利です。
ただし、複数のコンテナーが同じハードウェアのリソースを利用できるようになっているので、物理マシンで利用できるよりも少ないリソースしか使えないという点は、仮想化ソフトウェアと同様です。
ここで、コンテナーソフトウェアでのコンテナーは OS の機能をそのまま使うため、コンテナーが使う OS を変更することはできません。つまり、コンテナーでは、コンテナーソフトウェアを動かす OS で動作するソフトウェアしか実行できません。
仮想化ソフトウェアの仮想マシンであれば、別の OS をインストールして動かすことができます。そのため、仮想化ソフトウェアが動く OS では動かなくても仮想マシンにインストールした OS で動くものなら利用できます。具体的に説明すると、Linux OS にインストールした仮想化ソフトウェアなら仮想マシンで Windows OS をインストールして利用できます。一方、Linux OS にインストールしたコンテナーソフトウェアでは、Windows OS は使えません。
ここまでの説明からわかるように、コンテナーを使うと「コンテナーソフトウェアを動かす OS で動作するソフトウェアの実行が可能」ということになります。これだと、OS へ直接ソフトウェアをインストールして実行した方が良いように思えることでしょう。
しかし、コンテナーを使うと、「コンテナーソフトウェアを動かす OS の実行環境から隔離された状態で、ソフトウェアを実行可能」となります。OS へ直接ソフトウェアをインストールして実行する場合と違って、ユーザーからすると別の仮想マシンでソフトウェアを実行しているかのように見えます。
コンテナーを使って実行できるソフトウェアは、使用している OS で動作可能なら、基本的にはコマンドラインツールでも、サーバーソフトウェアでも実行することができます。ただし、特別なハードウェアを利用するものは、コンテナーソフトウェアが対応していないと利用できません。
以上のようなことから、「コンテナーは OS から隔離されたソフトウェア実行環境」という説明するのが個人的にはしっくりきます。ただし、これがしっくりくるのは、コンテナーについて理解が深まってきてからでしょう。
ここで、コンテナー技術が普及したのは Docker というコンテナーソフトウェアの人気が出てきたからです。これは「簡単にサーバーソフトウェアを実行できるようになる」という用途から普及したものです。この用途からすると、「軽量な仮想マシンのようなもの」と思ってイメージをしておく方がしっくりくるかと思います。
いずれにせよ、仮想マシンを用意しなくても、コンテナーを使うことで、Node.js 16 と Node.js 18 といった異なるソフトウェアバージョンを実行する環境を手軽に用意することができるようになります。
そのため、開発環境を構築するにあたっては、コンテナーソフトウェアを使えるようにしておきます。
バージョン管理システムを使う理由
次に、バージョン管理システムを使う理由ついて説明します。
バージョン管理システムを使うメリットは次のようになります。
- 継続的な開発環境の構築には、更新・切り戻し・差分の把握が容易な環境が必要
- 開発環境用のコンテナーの設定ファイルやスクリプトファイルの管理が可能
- ソフトウェア開発で必須となっているため、どのマシンでも利用可能
継続的な開発環境の構築をするには、更新しやすい環境となっているだけでなく、切り戻しがしやすい環境となっている必要があります。また、更新をするときの差分を把握しやすくなっていることも必要でしょう。
こういった情報を管理するには、バージョン管理システムが便利です。プログラムを実行する環境については、コンテナーソフトウェアの普及により、コンテナーの設定をテキストファイルで宣言的に指定することができるようになっています。宣言的に指定しにくい部分、例えばソフトウェアのインストールや設定をするための処理はスクリプトファイルで用意することができます。
バージョン管理システムを使って、これらのテキストファイルやスクリプトファイルのバージョン管理をすれば、開発環境のバージョン管理ができるようになります。
また、最近のソフトウェア開発では、Git などのバージョン管理システムを使うことが主流となっています。バージョン管理システムを使用するためのソフトウェアは、開発用のマシンならインストールして使えるようになっていることでしょう。また、運用で利用するマシンでも何らかの方法でバージョン管理システムと連携する設定をするはずです。
以上からわかるように、バージョン管理システムはいずれにせよ利用することになるので、使うことを前提として環境構築をします。もちろん、バージョン管理システムが使えるスキルはソフトウェア開発者としては、当然必要となりますから、プライベートな開発環境でも使うようにして、スキルアップをしていきたいことでしょう。
開発エディタ、CI/CD を使う理由
ここでは開発エディタ、CI/CD を使う理由について説明します。
開発エディタ、CI/CD を使うメリットについては次のようになります。
- ソフトウェア開発時に使用する開発エディタと同じものを利用
- 充実した開発機能を備えた開発エディタを使うことで、生産性や品質の向上が期待できる
- CI/CD の利用は、ソフトウェア開発の効率化や品質向上に有効な手法
- CI/CD 関連技術のキャッチアップはソフトウェア開発のスキルアップになる
- CI/CD でテストしやすいプログラミングを意識することはスキルアップになる
開発エディタについては、改めての説明は不要でしょう。実際の開発をするときにも開発エディタを使いますから、それを利用すれば済みます。コンテナーソフトウェアのおかげで、開発環境に必要な設定ファイルやスクリプトファイルは開発エディタで普通にコーディングできるようになりました。
OS に標準搭載されているエディタを使っても開発はできますが、充実した開発機能がある開発エディタを使った方が生産性も高いですし、高品質のコードを開発することが期待できます。
CI/CD の利用については、ソフトウェア開発の効率化や品質向上に有効な手法として普及しています。テスト駆動開発といった用語もあるように、最近のソフトウェア開発では CI/CD を前提とした開発が一般的となっています。
手元に CI/CD の環境があれば、関連技術のキャッチアップがしやすくなり、それはソフトウェア開発のスキルアップになるはずです。CI/CD を使っていれば、環境変数や環境変数ファイルを利用して実行環境に応じて動作を切り分けるソフトウェアの必要性を理解しやすくなるでしょうし、具体的にどうコーディングしておくと CI/CD システムで扱いやすいのかがわかるようになるはずです。
また、CI/CD でテストしやすいプログラミングを意識するということも、ソフトウェア開発のスキルアップになるはずです。手動でのテスト実行では問題とならないコードでも、自動でテスト実行しようとすると修正が必要になったりします。そういったコーディングのコツといったことも、普段から慣れていないとわからないものです。
ただし、プライベートな開発環境で CI/CD が必須かというと、それについては微妙だと考えています。手元で npm run test
や pytest
が実行できれば十分なソフトウェアを開発していて、必要性を感じていないのなら、用意する必要はないでしょう。CI/CD システムの用途を考えると当然なのですが、いまのところ個人で環境構築をして手軽に利用するといったものではなく、チーム開発で利用しやすくなるように開発されているものが多いという印象があります。
筆者も個人環境では試用のために CI/CD システムを動かしてみることはあっても、日常的に使うところまでにはなっていません。ただ、テストしやすいソフトウェアを開発するという意識は高めに持っていたいので、日常的に使う環境を用意して利用するようにしたいという思いは持っています。
参考
手元では簡単に一通りの環境構築を Intel N100 ミニ PC で動作する Hyper-V 仮想マシン上で行ってみています。そのときの記録が Intel N100 ミニ PC で構築する開発環境(10日分の一覧) | hiro345 にあります。リンク先では、具体的にどのようにしたのかは、書いてありませんが、何を実現してみたのかの説明はしてあります。もし興味があったら、ご覧ください。
Discussion