Linux での ReactOS のビルド 2019-06-21 (金) 01:20:00+09:00

メモ

まず、Build Environment`ReactOS Build Environment for Unix-compatible Operating Systems Version 2.1.2' から RosBE をダウンロードし中身を展開する。

RosBE-Unix-2.1.2/sources/make.tar.bz2 アーカイブの中にある configure を編集し、

# if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION

を、

# if _GNU_GLOB_INTERFACE_VERSION >= GLOB_INTERFACE_VERSION

と変更し、アーカイブの中身を更新してから、

$ cd RosBE-Unix-2.1.2

$ ./RosBE-Builder.sh

として、表示に従い RosBE のインストール先を指定し RosBE をインストールする( configure の編集をしないまま RosBE-Builder.sh を実行すると alloca の未定義参照のエラーで RosBE のソースのコンパイルに失敗する。(※1))。デフォルトでは /usr/local/RosBE にインストールされるので、その場合は前もって su で root 権限をもたせておく。

次に、

git clone https://github.com/reactos/reactos.git

を実行し、reactos のソース環境をクローンする。

それから、

$ cd RosBE

$ ./RosBE.sh

のようにして RosBE のシェルに入り、

$ cd reactos

$ ./configure.sh

とすることで reactos/output-MinGW-i386/ 以下が作成される。

この後、

$ cd output-MinGW-i386

で reactos/output-MinGW-i386 の中に移動するが、そのまま ninja bootcd を実行したのでは、 gcc がコンパイル中にプリコンパイルヘッダのエラーが起きビルドが通らない(※2, ※3)ので、 reactos/output-MinGW-i386/CMakeCache.txt を編集し、

PCH:BOOL=1

を、

PCH:BOOL=0

のように変更してから、

$ ninja bootcd

とすることで ReactOS のブートCDが作成される。


※1:Install older version of gnu-make in Ubuntu 18.04

※2:RosBE problems

※3:Cannot build on Debian Stretch amd64

キーワード: RosBE ReactOS


VMware Player をインストールして使用する場合に、 `Create a New Virtual Machine' から guest OS の iso イメージを読み込み起動しようとしたとき、 modconfig がモジュールを更新しようとするときがある。その際に vmmon のコンパイルのところで止まってしまい実行出来なかった。

止まってしまう原因はいくつかあって、まず、 vmmon, vmnet のソースコードの一部が最近のカーネルと不整合を起こしているためコンパイル時にエラーとなることと、 script の実行時にもエラーが出ること、そして、コンパイルして作成されるカーネルモジュール vmmon.ko, vmnet.ko に署名がされていないため起動に失敗することだ。

まず、カーネルコードとの不整合については、 Michal Kubeček 氏の GitHub に修正版のソース一式を挙げてくださっているので、そちらを使用させていただく。

sudo /etc/init.d/vmware stop

としてサービスを停止しておいてから、氏の GitHub の INSTALL に記述されている通り、

wget https://github.com/mkubecek/vmware-host-modules/archive/player-14.1.1.tar.gz

tar -xzf player-14.1.1.tar.gz

cd vmware-host-modules-player-14.1.1

make

make install

としてやれば vmmon.ko, vmnet.ko の修正版がインストールされる。( 14.1.1 のところは使用する VMwarePlayer のバージョンに置き換える。ただし、氏の GitHub に修正版が上がっていることが前提。)

これで vmmon, vmnet のコンパイル時のエラーは解消される。

このとき、 make したとき、

./scripts/***: *** 行: printf: 0x十六進数ダンプ:: 無効な十六進数です

といったエラーも出るが、これは LANG=C make とすることで解消できる。

この後、 make install した後そのまま、

sudo /etc/init.d/vmware start

とした場合、

Starting VMware services:

Virtual machine monitor failed

Virtual machine communication interface done

VM communication interface socket family done

Blocking file system done

Virtual ethernet failed

VMware Authentication Daemon done

のように2つのモジュールの起動に失敗するが、これは UEFI の validation 機能が有効になっている場合に更新したカーネルモジュールに署名がされていないためなので、

sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der /*/*.ko

のようにして vmmon.ko, vmnet.ko に署名してやると起動できるようになる。 MOK.priv, MOK.der は事前に作成しキーを登録しておかなければいけない。

VMware が自動的にモジュールを更新しようとしたとき、この署名の操作をしないため、 UEFI の validation が有効になっていると更新に失敗するはずだ。( VMware はなぜこの問題に対応しないのだろう? )

キーワード: VMware Player modconfig


こちらのサイト を参考にした。

切替可能な gcc を一覧に登録するには、

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70

とする。ここで、 70 は優先順位を表し、大きい数値ほど優先順位が高くなる。

このとき、同時に、

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 70

とすると、 gcc と g++ の2つのリストをそれぞれ別々に管理して別々に切り替えできそうに思うが、これだと g++ の方を設定しようとしたとき、 g++ は gcc のスレーブなのでだめ、と怒られエラーになる。

gcc, g++, gcov のバージョンを連動させて切り替える場合、 g++, gcov は gcc のスレーブなので、

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 48 --slave /usr/bin/g++ g++ /usr/bin/g++-4.8 --slave /usr/bin/gcov gcov /usr/bin/gcov-4.8

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 50 --slave /usr/bin/g++ g++ /usr/bin/g++-5 --slave /usr/bin/gcov gcov /usr/bin/gcov-5

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-6 --slave /usr/bin/gcov gcov /usr/bin/gcov-6

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70 --slave /usr/bin/g++ g++ /usr/bin/g++-7 --slave /usr/bin/gcov gcov /usr/bin/gcov-7

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 80 --slave /usr/bin/g++ g++ /usr/bin/g++-8 --slave /usr/bin/gcov gcov /usr/bin/gcov-8

として、連動して切り替わるように設定する。

この状態で、

sudo update-alternatives --config gcc

とすると、切り替え可能な gcc の一覧が表示され、 gcc のバージョンを選択することで、使用する gcc, g++, gcov のバージョンを連動させて選択することができる。

キーワード: gcc g++ gcov ubuntu


JPNIC を見ると、ドメイン名とは、ウェブアドレスまたは電子メールアドレスの内、下の下線の部分で、ドット (.) で区切られた各部分を「ラベル」と呼び、右端のラベルから左に向けて、トップレベルドメイン、第2レベルドメイン、第3レベルドメイン、・・・と呼ばれるらしい。

・電子メールアドレスの場合:

email@bar.co.jp

・ウェブアドレスの場合:

www.foo.co.jp

また、文字列の長さについては、

  • ドメイン名全体では、253文字以下。
  • 1つのラベルは、63文字以下。
  • 日本語ドメインの場合は、ラベル1つは、15文字以下。

使える文字は、

ラベルには大文字、小文字の区別はない。

  • 英字(A-Z)。
  • 数字(0-9)。
  • ハイフン(-)。
  • 日本語ドメインの場合は、上に加えて全角ひらがな、カタカナ、漢字、全角記号。

だが、 JPNIC の説明には、ドメイン名全体およびラベル1つの最長の文字数については書かれていても、最短で何文字以上必要かが言及されていない。

.jp ドメイン名の登録管理は JPNIC がしているんじゃないのか、もっときちんとした説明はないの?と検索してみると、どうも2000年に JPNIC 総会で新会社設立が決議され同年設立された JPRS という企業に移管したようで、現在はそこが管理をしているようだ。

JPRS の「使用できる文字」によると、

  • 英数字 .jp ドメイン名の場合、3文字以上63文字以下
  • 日本語 .jp ドメイン名の場合、1文字以上15文字以下

と、しっかり明記されていた。つまり、 a.jp (半角のみ)はダメだが、あ.jp (全角の ‘あ’ 1文字)はオーケー、ということになる。( こちらによると .cn ドメインでは取得できるらしい。管理団体の考え方によってまちまち、ということか?)

ちなみに、同じページに、「全角ひらがな・カタカナ・漢字・半角英数字(A~Z、0~9)・半角のハイフン「-」上記以外に「・」「ヽ」「ヾ」「ゝ」「ゞ」「々」「ー」なども使用可能」とあるので、意外だが全角アルファベットは日本語ドメイン名としては使用できない。全角アルファベットは半角アルファベットと区別されない仕様のようだ。実際 chrome の URL 入力欄に全角アルファベットで英数字ドメイン名を入力してみると、英数字ドメイン名に置換され何もなかったかのようにページが開いた。

キーワード: ドメイン名 文字数


これまでに何度か google code-prettify を用いて記事中にソースコードを挿入してみて、コツが分かってきたのでメモしておく。

(1)ソースコード以外の部分を入力し、 Wysiwyg 表示モードで確認しておく。

(2)ソース表示モードにして、

(a) ”<pre><code class=”prettyprint linenums lang-*”>”

(b) “</code></pre>”

を入力する。( lang-* の * の部分は、貼りつけたいソースコードの種類から、 code-prettify が持っている lang-* の中から最も近い構文のものを選ぶ。(例) “lang-css” など)

(3) (a) と (b) で囲まれた部分に、ソースコードを貼りつける。貼りつけるソースコードの改行はテキストの状態で改行しておく改行コードは LF だと余計な改行が勝手に追加されてしまうので、 CRLF にする。1行目は (a) の直後に改行せずつないで書き、最終行は (b) の直前にこちらも改行せずつないで書く。(そうしないと、空白行が出来てしまう。)

(4)ソースコードを挿入したら、 Wysiwyg 表示モードなどに切り替えず、ソース表示モードにしたまま、記事を投稿する。(モードを切り替えてしまうと、ソースコードの改行が削除され、ずらずら1行につながってしまう。

これで、きれいにソースコードが挿入される。