豪鬼メモ

一瞬千撃

レンタルVPSにUbuntu 20をインストールする手順

レンタルのVPSで自分のLinuxサーバを運用しているわけだが、その再インストールと再設定を行った。新しいドメイン名を取得して、新しいOSを入れて、Webサーバを立てて、開発環境を構築する。これはその手順の自分用のメモだが、似たようなことをしたい人には役立つかもしれない。


今までドメイン名はfallabs.comだったのだが、Tkrzwの公開を機に変えた。dbmx.net というのを取得した。理想的にはdbm.netというドメイン名にしたかったのだが、当然ながらdbmとかいう短い名前だと旧来のgTLDは全て取られている。キラキラ系gTLDの中から選んでdbm.worldというのも選択肢としては考えたのだが、新しめのgTLDは取得費は安くても更新費が高いので、やはり.comと.netと.orgから選ぼうということになった。で、dbmにxをつけてdbmx.net。Space XとかProject XとかRockman Xとかそんなノリで。

ドメインムームードメインで取ったが、そこの管理画面でDNSの設定をする。カスタム設定なる画面で、AレコードにVPSの外向けIPアドレスである49.212.133.108を設定して、dbmx.netがそのアドレスに解決されるようにする。CNAMEレコードを設定してwww.dbmx.netをdbmx.netの双方を有効にする手もあるが、かえって運用が面倒になるので省略。最近の人はURLにwwwって無意識につける癖はなくなっているだろう。ところで、以前はG Suiteの無料プランを使っていてそのためにGoogleのサーバを指すMXレコードを設定していたが、無料プランがなくなったのでそれらの設定は省略。

レンタルVPSは、さくらVPSの2GBプラン(月額1522円)を契約しているので、それをそのまま使う。ディスクが200GBしかないのは不満だが、それより高いプランだとコスパが悪いので、我慢する。というか、メモリ2GBでHDD 200GBというプランはもう存在していなくて、同じ値段のプランだとメモリ2GB SSD 100GBになるらしい。同じ価格帯でもうちょいストレージ容量に性能を振ったプランがあったら嬉しいのだが、他社を比較してもそういうのはなかった。

OSは現時点で最新のUbuntuの20.04のサーバ版にした。慣れているディストリビューションから敢えて乗り換える必然性を感じないので、Ubuntu一択。GCCのバージョンができるだけ新しい方がいいが、後で入れるのは面倒なので、やはり最新バージョンがいい。Ubuntuの公式サイトからISOイメージをダウンロードして、さくらVPSの管理画面でアップロードできる。そして、同じく管理画面からカスタムOSを指定して、インストールを始める。

ネットワークの設定はインストール時のダイアログで手動で行うが、"manual" を選択してから、VPSの管理UIの記述をそのまま写せばOK。サブネットのCIDR記法が厄介なのだが、この辺のツールを使って計算すると楽だ。今回の場合、以下の設定になる。IPアドレス等は公知の情報なので伏せない。

  • Subnet: 49.212.132.0/23
  • Address: 49.212.133.108
  • Gateway: 49.212.132.1
  • Name Server: 210.224.163.3,210.224.163.4
  • Search Domain: dbmx.net

ディスクのパーティションはカスタムレイアウトにして、以下のように切る。/homeの下には写真データを置きまくったり各種の実験データを置いたりするのだが、溢れた場合にシステム運用に支障が出ないように、パーティションを分けている。私の利用法だご、それ以外は細かく分けても無駄が増えるだけで意味がない。

  • / = 16GB, ext4
  • swap = 4GB
  • /home = 180GB, ext4

スワップ領域のサイズをどうするかには正解がないのだが、とりあえず実メモリの2倍くらいという格言を踏襲する。スワップ領域なしでも動くわけだが、実メモリが逼迫された時にOOMキラーが突然動き出してプロセスを殺し始める事態は避けたいので、ある程度のサイズのスワップ領域は必要だ。とはいえ作業メモリがスワップを繰り替えしている状態では全体的な動作が遅くなりすぎて通常運用には耐えないので、スワップ領域はごくたまにしか使われないという前提でよいだろう。そう考えると4GBは多すぎる嫌いがあるが、保険として大きめに取っている。何らかの理由で休眠プロセスが蓄積した場合に、それらの作業メモリがスワップ領域にページアウトする余地も残しておきたいし、遅くてもいいから大きいメモリが確保できるかというテストは行えるようにしておきたい。

インストールが終わって再起動したマシンにログインしたら、すぐにsudo apt-get updateとsudo apt-get upgradeをしてシステムを最新状態にする。それに続けて、ファイアウォールの設定を確認する。sudo su - でスーパーユーザになってから、以下の一連のコマンドを実行する。ssh用の22番とhttps用の443番とhttp用の80番だけが開いていることを確認する。セキュリティに関わる作業は優先して行いたい。

ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow https
ufw allow http
ufw enable
ufw status

そして、旧システムのバックアップから.bashrcと.emacsと.sshをコピーしてくる。それから、sudo apt-get install xxx などとして、ひたすら追加パッケージを入れまくる。Ubuntuのサーバ版を入れたのであれば、make、automake、tar、gzip、bzip2、vimwgetcurlperl、gitあたりは最初からインストールされている。

追加パッケージとしては、主にWebサーバとソフトウエア開発関連のライブラリやツールを入れることになる。パッケージ名がわからない時は、apt-cache search xxx などとして探す。ライブラリ関係のパッケージで、-devという接尾辞があるものがあれば、ヘッダファイルが分離されていることを意味するので、そちらを優先して入れる。-dev付きパッケージを入れれば-devなしのライブラリ本体(バイナリ)も自動的に入れられる。

  • emacs
  • apache2
  • g++
  • autoconf
  • pkg-config
  • zlib1g-dev
  • libbz2-dev
  • liblzo2-dev
  • liblzma-dev
  • zip
  • libxml2-dev
  • python3-dev
  • python3-sphinx
  • python3-pip
  • ruby-dev
  • liblua5.3-dev
  • golang
  • doxygen
  • valgrind

Emacsの追加パッケージとして、google-c-style.elとcolumn-marker.elを各配布元からダウンロードして、/usr/share/emacs/site-lispに置く。JDKのパッケージを本家から入手して、パッケージを展開して、/usr/java に手動でコピーする。gtestとgrpcも公式サイトを見て手順通りにインストールする。cmakeとかProtocol Buffersとかもその過程でインストールする。

Let's Encriptのパッケージを入れて、証明書を取得し、Apacheを設定する。細かいことはこの文書この文書を読めばわかる。python-certbot-apacheというパッケージがpython3-certbot-apacheに変更されていることには注意。私の場合、なぜか "Invalid argument: AH02027: Failed to acquire SSL session cache lock" というエラーログが出るようになったのだが、調べても全然原因がわからない。パーミッションの問題ではないっぽい。とはいえ、HTTPSで普通に通信できているようなのでとりあえず放置。

デスクトップ版を入れる手順だとこの後、日本語入力や漢字変換エンジンの設定をやって苦労するのが通常なのだが、サーバ版なのでその必要はない。日本語は端末越しのクライアントから入力するからだ。なお、作業ユーザのロケールは en_US.UTF-8 か ja_JP.UTF-8 にしておいた方がいい。そうしないとPythonとかがマルチバイト文字を読み込んだ時にエラーを吐くので。


画像処理の趣味があるので、ImageMagickを入れたい。ImageMagickの最新版(7.0)をほぼフルスペックで入れるには、以下のパッケージを事前にインストールしておく必要がある。その上で、ImageMagickの最新版をGitHubからダウンロードしてきて、./configure --enable-hdri で設定してからビルドとインストールを行う。

  • libopenexr-dev
  • libjpeg-dev
  • libtiff-dev
  • libpng-dev
  • libpng++-dev
  • libheif-dev
  • libjbig-dev
  • libwebp-dev
  • libopenjp2-7-dev
  • liblqr-1-0-dev
  • liblcms2-dev
  • libfreetype-dev
  • libfontconfig1-dev
  • libpango1.0-dev

以下のパッケージもよく使うので入れる。あと、ExifToolも本家から入手して入れる。

  • enfuse
  • dcraw
  • ffmpeg
  • libopencv-dev

ImageMagickとEnfuseとFFMpegOpenCVのパッケージはどれもやたら広範囲の依存関係を持つので、ミニマリストには推奨されない。というか、それらをメンテしている人々はめちゃくちゃ苦労が多いと思う。よくそんなの把握できるなと。

仕上げに、自作のソフトウェア群をインストールする。各種ライブラリと、英和辞書と、文書検索と、写真管理ツールだ。各種処理系のバージョンが上がると微妙に非互換性があったりして驚くことがある。GCCの新しい警告が出るようになったり、Pythonの標準ライブラリのあるメソッドが削除されていたり。それらを直す。


ここまで全部入れると、/ パーティションの利用領域は8.9GBになる。16GBを確保しているので、通常運用には余裕がある。これが10GBとかだとなんだか怖いので、/ は16GBくらいで残りを /home にするのが単純明快で良いと思う。

前はUbuntu 16.04を使っていたのだが、今回のインストールのおかげで、様々な作業の体感速度が上がっている気がする。全体的にキビキビしているというか。カーネルの更新のおかげと、GCCの更新のおかげと、その他各種言語の処理系の更新のおかげだろう。ImageMagickもバージョン7からかなり速くなっている気がする。安価なプランのVPSの上で動作しているわりには、まったく問題なく開発作業もサービス運用もできる。素晴らしい時代だ。

ところで、なぜ開発作業をVPS上で行うようになったのか。ノートPCでLinuxMacの開発環境を構築した方が高速に動作して快適だし、大量のリソースを使っても安心だし、ネットワークに繋がっていない環境でも作業できてよい。しかし、所詮はノートPCなので、安いVPSよりと大して速度は変わらないし、あんまり頑張らせると発熱したりファンが回ってうるさかったりするので実際は快適ではない。所詮ノートPCなので、大量のリソースを使えるといっても、たかが知れている。どのみち、CPUの性能もメモリの性能も、私が想定する実サービスにおける典型的な環境とは大きく異なるので、そこでベンチマークテストを行うことはない。ならば大量のリソースを使う必要はほとんどない。画像処理や言語処理や統計処理を行う場合にも力不足だ。それらを実行するには強力なデスクトップPCか、どこぞの分散処理システムを使いたいが、普段の開発作業でそうする必要はない。むしろ、VPSの貧弱な環境でも動くようにしておくことの方が大切だ。ネットワークに関してだが、最近はどこに行ってもWi-Fiが使えるし、そうでなくてもスマホテザリングすればいちおう作業はできるので、スタンドアローンで開発できるメリットは少ない。というか、全てのレイヤーが複雑化したこのご時世、どの開発言語でも、標準ライブラリやその他のライブラリのインターフェイスの仕様やベストプラクティスを調べながらでないともはや作業できないので、Web検索できない状態で開発するのは厳しい。ネットにつながっていることが前提なら、もはやスタンドアローンの利点はないのだ。

てことで、VPSでの開発はお勧めだ。自分で好きな環境を構築できるし、ネットワークサービスも運用できるし、停電や故障の心配もないし、家でも出先でも同じ環境で作業できるし、高くて高性能なノートPCを買い続ける必要がなくなるし、良いことだらけだ。年間2万円くらいの維持費なので、3年毎に15万円のノートPCを買い変えるよりは遥かに安い。