seraphyの日記

日記というよりは過去を振り返るときのための単なる備忘録

すごく古いノートPCにCloudReadyによるVSCode編集環境を作る

すごく古いノートPC(HP4510s)に、CloudReadyによるVSCode編集環境を作る

要約

2020/12にGoogleに買収されたCloudReadyだが、今月(2022/2)にGoogleからオフィシャルのCloudReadyともいえる「Chrome OS Flex」の提供アナウンスがあった。

https://japanese.engadget.com/google-chrome-os-flex-075046045.html

このニュースを見たわけではないが、これに先立って、少し前に、かなり古いノートPCにCloudReadyを入れて、Ubuntu20.04の仮想Linux環境と、サーバー版VSCode(code-server)を導入した。

本記事は、その手順について思い出しながら記録したものである。(自動更新を停止する必要がでできたので、末尾に追加した。2022/3/5追記)

現在、これにより、12年以上昔のHP ProBook 4510sを、ネットブック & VSCode編集機として実用環境にできている。

WindowsXP, 8, 10とOSを移ろいいった、このマシンも、たぶん、これが、このマシンの最後のOSとなるような気がする。(ハード的に破損しつつあるので。すでにテンキーの「0」は壊れてしまった。)

インストール後のVSCodeを起動するまでの操作手順

CloudReady上にLinux仮想環境を作成し、code-serverが導入できたことで、CloudReadyのブラウザ上からVSCodeを快適に使えるようになるのだが、起動するまでには、毎回、少し手順が必要である。

  • ブラウザでCTRL+SHIFT+Tを押してcroshターミナル画面にする。croshはウィンドウメニューからアプリとして独立できる。(ただし、固定はできない。毎回、この操作は必要)
  • croshでshellと入力すると、CloudReadyのbashに入る
  • sudo enter-chrootで、Croutonの仮想Ubuntu上のbashに入る。
  • code-serverで、サーバー版VSCodeを起動する。アクセスするためのURLとパスコードが表示される。(パスコードは初回のみ)
  • Chrome上から、localhost上のcode-serverにアクセスする。(初回のみ、パスコードを入れる必要がある。)
  • このタブをウィンドウメニューからアプリとして独立させることで、CodeServerアプリとしてDock上に固定できる。(次回以降は、サーバのcode-server起動後は、これをクリックする。)

環境構築について

HP ProBook4510s

HPProBook4510Sは、2009年夏ごろの低価格ノートPCで、たしか6万円ぐらいだったと思う。

日本ヒューレット・パッカード(株)が発売した新しいビジネスユーザー向けノート「HP ProBook 4510s/CT Notebook PC」(以下ProBook 4510s)は、ネットブック並みの価格ながら、使いやすいサイズのディスプレーとキーボード、そして充実したスペックを備えるといった、脅威の高コストパフォーマンスを持つノートパソコンである。 ASCII ネットブックよりお買い得 15.6型ノート ProBook 4510s

12年以上前のノートPCであるが、低スペックCPUでもサクサク動く、ChromeBookが案外使えるというウワサをふと思い出して、ためしに、CloudReadyを入れてみようと思い立った。

CloudReadyでサポートされているマシンであるかの確認は、公式ページのCertified Models List で確認できる。

https://guide.neverware.com/supported-devices/

ここでは、HP4510sも条件つき、若干の既知の問題があるものの、動作確認済みのマシンになっている。

HP Probook 4510s
Certified until Aug. 2022

- Installation (1)
- Sleep/Resume
- Wifi & Ethernet
- Bluetooth
- Audio Input
- Audio Output
- Volume & Brightness Control (2)
- Input Devices
- USB (3)
- SD Card
- Webcam
- Video Output (4)
- Video Playback
- 3D Rendering

(1) This device may have installation problems on older BIOS revisions.
  If you experience installation issues, update your BIOS to F.20 or higher following instructions on HPs website.
(2) Brightness may change unexpectedly when plugging in or unplugging this model.
  To return brightness to normal levels, use F6 and F7.
(3) A small percentage of HP Probook 4510s laptops have a USB controller that requires a 45 second delay during startup.
  These devices are not visually distinguishable from others, but may sit at a black screen for 45 seconds when booting CloudReady, prior to proceeding as normal.
(4) Video output on this machine may not work as expected.
  Try unplugging and replugging in the display cable, or closing and re-opening the lid to initiate a video output connection.

前提条件であるBIOSはすでに最新版になっている。

なので、CloudReadyのインストールUSBメモリを作成して、あとはなんの問題もなくスムーズにHDDにインストールはできた。

なお、このマシンのHDDは大昔に128GのSSDに交換済みである。HDDインストール前に事前にUSBメディアからのブートを試してみたが、USB2.0ということもあるのか、それ以外の原因があるのかは定かではないが、非常にもっさりとしていて、USBからの起動では常用はできないという印象は受けた。

SSD上にCloudReadyをインストールして、あとは画面に表示される手順に従って勧めてGoogleアカウントを指定すれば、Chromeブラウザが使えるようになった。

SSDにインストール後のブラウザの使用体感としては、Google Spreadsheetなどを使っても、いろいろなホームページなどブラウジングしても、ほとんどストレスなく使える。遅いという印象はなく、快適につかえている。(とはいえサクサク速いわけではない。強いて言えば、リモートデスクトップで作業しているくらいの遅さはある。)

まあ、もとからWindows8 → Windows10で動かしていても、それほどレスポンスがもっさりしている、というほどの感じはなかったので、当然かもしれない。Core2Duo 2.4GHzぐらいのマシンであれば、10年前のマシンでもブラウザ利用ぐらいはなんのことはないのだと思う。

とりあえず、ブラウザで作業するには十分なノートPCが出来上がった。

ちょっとした不満点/注意点

1ヶ月ぐらい軽く使ってみて、普段使いするのに不便なところは無いのだが、強いて言えばSleepまでの時間を調整することができないのは厄介である。

スリープに入るとCroshが閉じる性質があるので、時間のかかる作業中にスリープに入られるのはよろしくない。電源接続時はスリープしない、という設定にしておく必要はある。

また、スリープをさせたくない場合に、この設定を簡単に切り替えられるように、Keep Awakeという拡張が役に立つかもしれない。

Keep Awake - Chrome ウェブストア

ブラウザ上部に「夜間」「日中」のアイコンボタンがでて、日中アイコンボタン中のときはスリープモードに入らない、というようなカスタマイズができる。

あと、まあ、これは仕様ではあるが「F1〜F12キー」の動きは、HP4510sに刻印されている機能とは当然異なる。

  • F1「Back」F2「Next」F3「Reload」F4「Full」
  • F5「Align」F6「Bright Down」F7「Bright Up」F8「Mute」
  • F9「Vol Down」F10「Vol Up」(F11:Full?)
  • F12「Developer」

ウィンドウの切り替えが頻発するので、ALT+TABより、F4/F5での画面の管理が、わりと効率的になってくるように思われる。

CromeOSはLinuxが使えるらしい

ただ、Chromeが入っているだけのOSとして考えると、なんかもったいない気がしてきた。とくに、SSDは128GBあるのに、おそらく、10%も使ってない。

なにか有効利用する方法はないのかなー、と漠然とネットをみていたら、なんと、ChromeOSはLinux仮想環境を入れることで、Linuxマシンとして使えるということがわかった。

(というよりも、ChromeOS/CloudReady自身がLinuxで動いており、その中に更にUbuntu仮想環境を標準機能として入れることができるようになっている。)

この古いHP4510sの使い道として、CloudReadyを入れてみようと思うまで、ChromeBookが実質、低価格LinuxPCとして使えるということを知らなかったのだが、UbuntuX11が動くのであれば、それはChromeOSも人気にもなるというものだ。

ChromeOSが人気の理由が、ようやくわかった。ブラウザだけでなんでもできるわけではなく、Linuxがフルに入るから、とりあえずなんでもできるのだ。

それで、私もLinux環境を入れてみようと思い立ったのだが、だが、HP4510S特有の問題があり簡単ではなかった。

まず、このマシンのCPUの情報としては、以下のようになる。

$ cat /proc/cpuinfo (抜粋)
model name      : Intel(R) Core(TM)2 Duo CPU     P8600  @ 2.40GHz
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts nopl cpuid aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm pti tpr_shadow vnmi flexpriority dtherm ida
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit

この中で重要なのは、flagsのところであり、この中にはCore2DuoのCPUバグをBIOSで修正していること示す、l1tf などのフラグがない。

ChromOS/CloudReadyは、それ自身がLinux上で動いているが、更に標準機能として「設定」から「詳細設定」→「デベロッパー」から、「Linux開発環境」というスイッチをOnにするだけで、Ubuntuの仮想環境がインストールされるようになっている。

この公式のLinux環境をサポートする機能は、Crostiniと呼ばれているようである。

だが、残念ながら、HP4510sには、標準ではCrosiniは動作しない。先に示したCPUのバグ修正フラグ「l1tf」などの、いくつかのフラグが存在しないため信頼できないCPUとして仮想環境作成時にエラーにされるようになっている。(昔は見ていなかったようで、この仕様変更を知らなかった人たちがLinuxを有効化できなくなっており、バグではないか?と報告するブログがいくつか見つかる。)

私も悩んで、いろいろ探していたら、結局、公式に、きちんと書かれていた。

[How do I enable virtualization?]

To enable virtualization enter your device’s BIOS on boot and look for a virtualization settings. Make sure all of those are enabled. Terms like "virtualization", "virtual machines", "vt-x", and "vt-d" may all apply.

If your BIOS settings do not show any relevant settings, and the Linux (Beta) menu is not available as described previously, virtualization may not be supported on your device.

[How do I check if my device has any unmitigated CPU vulnerabilities?]

The following steps can only be done on CloudReady Home Edition. To check whether you have unmitigated vulnerabilities preventing virtualization:

  1. Log in on a CloudReady Home Edition device
  2. Enter crosh by pressing Ctrl + Alt + t
  3. Enter shell by typing shell and pressing enter
  4. Type cat /sys/devices/system/cpu/vulnerabilities/l1tf and press enter
  5. If the output doesn’t contain: VMX: cache flushes or VMX: flush not necessary the device has unmitigated CPU vulnerabilities. Examples of bad results:
  6. Mitigation: PTE Inversion; VMX: conditional cache flushes, SMT disabled
  7. Mitigation: PTE Inversion; VMX: conditional cache flushes, SMT vulnerable

[What can I do if my device has any unmitigated CPU vulnerabilities?] CPU vulnerabilities are patched via microcode updates. CloudReady does not offer microcode updates at this time. For some models, updating your BIOS will apply the needed patches. Check on your device’s manufacturer’s site to see if they offer BIOS updates and follow their instructions to update the latest BIOS available.

https://cloudreadykb.neverware.com/s/article/Linux-Beta-support

BIOSが対応する以外、さしあたりCloudReady側がCPUにパッチを当てるようなことをする気はないらしく、HP4510Sは保守終了品でありBIOSアップデートも2012年くらいで終わっているので、公式での対応は見込めない。

しかし、ChromeOSが公式にLinuxをサポートするCrostini以前からも、ChromeOSでLinuxを使えるようにする方法は、いくつかある。

CloudReady自身がLinuxで動いており、Brewもある。

まず、CloudReady自身がLinuxで動いているので、その環境を直接使ってしまうことが考えられる。

以下のような定番ツールは、はじめから入っている。

これだけあれば十分に使えるかもしれない。

gitとPythonが入っているので、それだけで十分な人もいるのではないか?

また、不足している場合でもChromeBrewで、定番ツール類をインストールすることができる。

https://github.com/skycocker/chromebrew

ChromeBrewのインストール方法は簡単である。

curl -Ls git.io/vddgY | bash

(ちなみに、あえてshにパイプで流し込んでいるのは、ChromOS/CloudReadyは、ユーザーがデータを読み書きできるフォルダ(ユーザーランド上)からはシェルスクリプトファイルを実行できないためらしい。)

あとは、

crew list available

といったふうに、crewコマンドで、自分のほしいパッケージがみつかれば、そのパッケージをインストールできる。

また、CloudReady/ChromeBookはデフォルトでファイアウォールが起動しており、外部からのアクセス(sshdさえ)閉じられているが、以下のようにすれば開くことができた。

sudo iptables -I INPUT -p tcp --dport 8080 -j ACCEPT

この範囲でよければ、Linux仮想環境を作る必要もない。

CroutonでUbuntuを導入する

もう1つの方法は、標準では動かせないCrostiniのかわりに、似たような仮想Linux環境を作ってくれるCroutonというツールを導入する方法がある。

https://github.com/dnschneid/crouton

ここの「The easy way (assuming you want an Ubuntu LTS with Xfce)」の手順に従って操作すれば、X-Windowも起動できるUbuntu20.04を導入できる。

インストーラをダウンロードして所定の場所にinstallで配置すれば、あとは、それを実行すれば、あとは対話的にインストールは進む。難しいコマンドは必要ない。

詳しくは、以下を参考にさせていただいた。

CroutonでUbuntu 20.04をインストールすると、これでインストールされたUbuntuの実体ファイルは、/mnt/stateful_partition/crouton/chroots/focal/に作成されており、だいたい8GBぐらいのようである。

ここは名前のとおり、ステートフルなパーティションであるのでChromOSの特徴ともいえる、Downloadsフォルダ(とMyFiles)以外はクリーンナップされるという制約の影響を受けない。

(なので、Ubuntu20.04内での作業も、クリーンナップされることはない。)

普通のUbuntuと同等であるので、sudo apt updateなどのパッケージマネージャが使える。

Ubuntuへのログイン方法

Cromeブラウザ上から、Ubuntu仮想環境を起動しログインするには、まず「CTRL+SHIFT+T」でCroshコンソール画面を開く。

Croshコンソールのタブは、ブラウザのウィンドウメニューからアプリケーションとして独立させることができる。(ただし、固定化することはできず、起動するたびにChrome上からCTRL+SHIFT+Tをする必要はある。)

このCrosh上からshellコマンドでbashを起動し、のちにsudo enter-chrootで、仮想Linux環境に入る。

crosh> shell
chronos@localhost / $ sudo enter-chroot
Entering /mnt/stateful_partition/crouton/chroots/focal...
dbus[4826]: Unknown username "whoopsie" in message bus configuration file
(focal)seraphy@localhost:~$ 

その名前のとおり、仮想マシンではなくchrootによるコンテナ化のようなもののようである。

(dbusのエラーはよくわからないので無視している。)

CloudReadyでは、ユーザーがデータを保存できる場所として「Downloads」と「MyFiles」というフォルダがあるが、標準では、このDownloadsのみが共有されている。

この共有フォルダは、仮想環境側の/etc/crouton/sharesの中で定義されており、以下のようにMyFilesも共有に追加できる。

$ cat /etc/crouton/shares
...(前略)...
# Share the downloads folder of the current user's profile
downloads ~/Downloads
myfiles ~/MyFiles
shared /mnt/stateful_partition/crouton/shared

細かなルールがあり、なんでも共有できるわけではないようだ。また、MyFilesの中にDownloadsがあるのだが、共有した場合は、共有したMyFilesの中のDownloadsにはアクセスできないので、MyFilesとDownloadsは別のものとして共有しなければならないようである。

screenコマンド

croshを閉じると仮想環境も終了するので、あまり意味はないのかもしれないが、コンソールセッションを裏で保持することのできるscreenコマンドを使う場合には、セッション情報を書き込む/var/run以下にアクセス権がないため通常ユーザーでは使えない。

これは.bashrc環境変数SCREENDIRを自分の読み書きできる場所に設定することで回避できる。

export SCREENDIR=$HOME/.screen

◆ Xfce4の起動

同様に、X-Windowを起動するには、Crosh上から以下のようにする。

crosh> shell
sudo startxfce4

で、数秒間黒い画面が開いたのちに、xfce4デスクトップが開かれる。

初期のままでは、X-Windowとしては日本語入力に難があり、解決するのは難しそうだったので、とりあえず、私はXを使う予定もないので、日本語表示設定をするぐらいにとどめた。とはいえ、たまにGUIで確認したいようなものがあるかもしれないので、あるにこしたことはないとは思う。(キーボードがJP106にならないことと、日本語入力以外には不満はなさそうだった。)

なお、Chromeタブではなく、独立したアプリのウィンドウとして管理できたほうが良いのでCrouton用のChrome拡張Crouton Integrationを入れてある。

サーバー版VSCodeであるCode-Serverのインストール

Code-Serverは、VSCodeのバックエンド側をサーバに持っていて、普通のブラウザをフロントエンドとして使うエディタである。

使えるプラグインや操作性はVSCodeと、ほとんど同じである。

https://github.com/coder/code-server

これが、ChromeOS/CloudReadyと非常に相性が良いといわれている。

先のようにX-Windowでは日本語入力に難があるが、フロントエンドがChromeOSのブラウザ側にあれば、そのような問題はない。

また、バックエンドがLinux上で動いているので、各種のツールがChromeOS/CloudReadyの制約を受けない。

たとえば、Linux仮想環境でsudo apt install texlive-fullなどで、TeX環境を作成したあと、code-server拡張機能としてLaTeX Workを入れれば、TeXを編集してpdf化するのも自由自在である。

インストールも簡単であり、Linux仮想環境に入ったあと、インストーラをダウンロードして実行するだけである。あとは対話的にインストールが進む。

sudo enter-chroot
curl -fsSL https://code-server.dev/install.sh | sh

インストール手順については、ここが詳しい。

https://qiita.com/BonyChops/items/8e40b377e14b04cd5a9d

このあと、code-serverは以下のようにして実行する。

(focal)seraphy@localhost:~$ code-server 
[2022-02-21T10:08:25.100Z] info  code-server 4.0.2 xxx
[2022-02-21T10:08:25.102Z] info  Using user-data-dir ~/.local/share/code-server
[2022-02-21T10:08:25.144Z] info  Using config file ~/.config/code-server/config.yaml
[2022-02-21T10:08:25.145Z] info  HTTP server listening on http://127.0.0.1:8080/ 
[2022-02-21T10:08:25.145Z] info    - Authentication is enabled
[2022-02-21T10:08:25.145Z] info      - Using password from ~/.config/code-server/config.yaml
[2022-02-21T10:08:25.145Z] info    - Not serving HTTPS 

デフォルトではポート8080でリスンしているので、Chrome側から、http://localhost:8080/で、よく見慣れたVSCodeに似た画面がブラウザ上で開く。

f:id:seraphy:20220221203147p:plain
code-server-cloudready

(初回のみパスコードの入力が必要となる。パスコードは~/.config/code-server/config.yamlにかかれている。)

ただし、本物のLinuxサーバであれば、自動起動に設定できるところが、Croutonでは、毎回、code-serverコマンドを入力して、手動で起動する必要がある。これは、ChromOS上の仮想環境のLinuxであるかぎり、宿命のようである。

Jupyter nootbookも試してみた

マシン性能的に実用であるかは疑問ではあるが、Jupyter NotebookLinux仮想環境上に作ってポート8888でリスンするようにしておけば、Chrome側で、わりと手軽にPythonで遊べるようになるだろう、と思いつつ、実際に試してみた。

(focal)seraphy@localhost:~$ python3 -m venv jupyterenv
(focal)seraphy@localhost:~/jupyterenv$ . bin/activate
(jupyterenv) (focal)seraphy@localhost:~/jupyterenv$ python -m pip install pip
Requirement already satisfied: pip in ./lib/python3.8/site-packages (20.0.2)
(jupyterenv) (focal)seraphy@localhost:~/jupyterenv$ python -m pip install notebook

ChomeOS/CloudReadyでは、Downloads(とMyFiles)フォルダのみユーザーデータを保存でき、そこだけでデータの管理を行うポリシーであるので、Jupyter Notebookのワークディレクトリも、設定でDownload下を指すように設定しておく。

(jupyterenv) (focal)seraphy@localhost:~/jupyterenv$ jupyter notebook --generate-config
Writing default config to: /home/seraphy/.jupyter/jupyter_notebook_config.py

(jupyterenv) (focal)seraphy@localhost:~/jupyterenv$ mkdir /home/seraphy/Downloads/JupyterWork

以下のように設定ファイル~/.jupyter/jupyter_notebook_config.pyを編集する。

c.NotebookApp.notebook_dir = '/home/seraphy/Downloads/JupyterWork'

このあと、Jupyterを起動するのだが、Linux仮想環境側からはブラウザを自動的には開けないので、手動でパスをコピーする必要があった。

(jupyterenv) (focal)seraphy@localhost:~/jupyterenv$ jupyter notebook
[I 20:47:59.026 NotebookApp] ローカルディレクトリからノートブックをサーブ: /home/seraphy/Downloads/JupyterWork
[I 20:47:59.028 NotebookApp] Jupyter Notebook 6.4.8 is running at:
[I 20:47:59.028 NotebookApp] http://localhost:8888/?token=xxxx
[I 20:47:59.028 NotebookApp]  or http://127.0.0.1:8888/?token=xxx
[I 20:47:59.028 NotebookApp] サーバを停止し全てのカーネルをシャットダウンするには Control-C を使って下さい(確認をスキップするには2回)。

一応、普通に使えるようではある。(まあ、当然ではあるだろうが。)

f:id:seraphy:20220221203046p:plain
Jupyter-CloudReady

結論

HP ProBook 4510sは、もう少し延命できそうです。

電源ボタンを押してBIOS含めて25秒でログイン画面となり、パスワードを入れて5秒ほどでChromeブラウザが前回開いていたページを復元する、という、なかなかにフットワークの軽いノートPCになりました。とても手軽に使えるデバイスになりました。(電源を落とすのも早い。)

このはてなブログの記事も、HP4510sのCloudReady上のcode-serverで書きました。VSCode同様にマークダウンのプレビューを見ながら、とくに不満点はなく、普通に使えます。

実際使ってみて、CloudReady(ChromeOS Flex)による古いPCの延命/再生は、かなり実用的と思います。

CloudReady Home Editionの自動更新の停止方法 (2022/3/5追記)

現在、CloudReadyのHome Editionを使っている。現行バージョンでは、Home Editionは、デフォルトで開発者モードであり、CTRL+ALT+Tで、croshというシェルに入ったあと、shellコマンドで普通のbashが使えるようになり、ファイルシステムにいろいろ手を加えることができた。 しかし、今後、大幅な変更が入るとのアナウンスがあった。

  • v96以降はneverware社からではなく、Googleから更新が提供されるようになる。
  • ファイルシステムへの変更が許可されなくなる
  • v96以降のHome Editionでは、shell が使えなくなる。(改善する予定はあるとのこと。)

さしあたり、これらの自動更新を行わないようにするためには、以下の手順に従う必要がある。

https://cloudreadykb.neverware.com/s/article/Disable-Auto-Updates-on-Home-edition

まず、ファイルシステムへの変更を許可するように設定する。

sudo disable_verity
sudo reboot

を2回繰り返す。

sudo mount -o rw,remount /

ファイルシステムを読み書き可能で再マウントして、etc以下を編集する。

lsb-releaseをバックアップをとったのちに、これに編集を加える。

sudo cp /etc/lsb-release /etc/lsb-release.bak 
sudo vim /etc/lsb-release

この中にあるCHROMEOS_AUSERVERCHROMEOS_DEVSERVERが指すURLを、存在しないダミーのURLに 変える。これによって自動更新を阻止する、というものらしい。

$ diff /etc/lsb-release /etc/lsb-release.bak 
6,7c6,7
< CHROMEOS_AUSERVER=https://cloudready-free-no-update-server-2.neverware.com/update
< CHROMEOS_DEVSERVER=https://cloudready-free-no-update-server-2.neverware.com/
---
> CHROMEOS_AUSERVER=https://cloudready-free-update-server-2.neverware.com/update
> CHROMEOS_DEVSERVER=https://cloudready-free-update-server-2.neverware.com/

これで本当に自動更新が停止されるのかは、まだ確かめようがないのだが、shellが使えなくなるのは大問題なので処置を入れておくことにしたい。

参考

以下、大変お世話になりました。

以上、おわり