linuxカーネルのビルドが謎の失敗 ~ こんにちは、そしてさようならkbuild cache
linuxカーネルのmake実行時に、途中で呼ばれるshellコマンドをキャッシュしておくkbuild cacheという機能がlinux v4.15に追加されました。
しかしこの機能は色々なコーナーケースに対処しきれておらず、原因不明のビルドエラーが発生することがわかったためにlinux v4.18では早くも削除される見込みです。
キャッシュした結果はソースディレクトリの直下、.cache.mkファイルに保存されているため、これまで起きなかった謎のビルドエラーが発生した場合は当該ファイルを削除すると問題が起きなくなる可能性があります。
なぜ私がこんなことを知っているかというと、自分がまさにkbuild cacheが原因のビルドエラーに遭遇したからです。具体的にはlinux v4.17.4においてmakeコマンドを実行したら" Compiler lacks asm-goto support."というメッセージと共に失敗しました*1。手持ちのコンパイラは"asm-gcc"機能をサポートしているにも関わらず、です。この事象は上記の通り.cache.mkを削除すると起きなくなりました。
このトラブルシューティングによって30分溶けました。みなさんもお気を付けください。以上
*1:make helpやmake cleanでさえも動かない
WIndowsからWSLへのカットアンドペーストができなくなった(解決済)
手元のマシンでWIndows UpdateかけたらWindowsからWSLへの右クリックによるカットアンドペーストができなくなりました。WSLからWIndows,WSLからWSLではOKでした。色々調べた結果、
- WSLの窓の左上にあるUbuntuのアイコンをクリック
- 「プロパティ」をクリック
- 「オプション」タブを選択
- 「Ctrlキーショートカットを有効にする」のチェックを外す
という手順によって問題が解決しました。
この話には続きがあって、別のPCでは上記のチェックは有効であるにもかかわらず右クリックによるカットアンドペーストができるんですよね。なんでだろう。しかし
- 既に問題は回避できている
- 回避方法によるデメリットはとくに感じていない
ことによりこれ以上の追求はしないことにしました。時間は有限をもっと大事なことに使います。
技術書典4に出す本の宣伝
はじめに
明日開催される技術書典4に参加いたします。第二回に初めて参加してから連続して3回目の参加です。
以前はサイボウズのご厚意でサイボウズブースを間借りしていましたが、今回は独立してwindholeブースです*1。場所は「け51」です。
今回は次の5冊を頒布いたします。
上から4冊は同人誌で、いまのところ一般販売はしていません*2。一番下は同人誌ではなく技術評論社から出て書店に並んでいる本ですが、ついでに売ります。本エントリではそれぞれについてコメントを付けて宣伝しておきます。
図解でわかるMeltdown(新刊。紙&電子)
2018年の年明け早々世間を騒がせたMeltdownという脆弱性についての解説書です。この脆弱性は前提知識さえあれば理解は決して難しくありません。しかし必要な前提知識の数が多い、かつそれぞれOSカーネル以下あたりの低レイヤのものが中心なため、一般的なソフトウェア開発者にとってはなかなか敷居が高いのが実情です。
本書はレイヤを問わずあらゆるソフトウェア開発者のためにMeltdownおよびその理解に必要な前提知識をひっくるめて図解しています。「この脆弱性について興味はあったもののなんだか難しそうなので手付かずだった。最短距離で手っ取り早く理解したい!」というかたにおすすめです。
Btrfsの薄い本(既刊。紙&電子)
BtrfsというLinuxのファイルシステムについての解説書です。Linuxのファイルシステムといえばext4やXFSが有名です。Btrfsはこれら2つと同様の使い方もできますが、通常「Linuxのファイルシステム」と言われて普通の人が思いつくものとは大きく異なる豊富な機能を備えています。Btrfsはまた多くのLinuxディストリビューションで実際にサポートされています。
本書はこのファイルシステムが一体どういうものなのかという概要を書くと共に、それを読んでさらに興味が出たかたむけに使い方、トラブルシューティングから歴史までを説明しています。ファイルシステムについて新しい知識を得たいかた、刺激が欲しいかたにお勧めです。きっと「こんなことができるの?」と思うはずです。
カーネルモジュール作成で学ぶLinuxカーネル開発の基礎(既刊。電子のみ)
Linuxカーネルを自分で改変するためには覚えておかなければならない作法があります。これらの作法は一旦わかってしまえば大したことはないのですが、やたらと数が多いので参入障壁が高いです。本書ではそのお作法をカーネルモジュールの作成という方法を通して学びます。まずは単純な機能を追加してから次第に複雑な機能を作り込んでゆくというインクリメンタルな説明方法になっているので、カーネルになじみのないかたにもとっつきやすくなっています。お作法のうちの大して重要ではないところについては自動化して飛ばすツールを紹介しているのもポイントです。
「Linuxカーネルをいじってみたいけど、何をすればいいのかさっぱりわからない」というかたにおすすめです。
Linuxカーネルで学ぶC言語マクロテクニック(既刊。電子のみ)
Linuxカーネルのソースを読むにあたっての大きな障壁のひとつがトリッキーなC言語マクロたちです。本書はこれらのうちの多く使われていて、かつ初見殺しなものを抜粋して解説しています。これからLinuxカーネルソースを見てみたいというかた、およびC言語マクロ黒魔術の世界をのぞいてみたいかたにおすすめです。
Linuxのしくみ
これについては技術評論社のWebサイトにある紹介ページをごらんください。
おわりに
いかがでしたでしょうか。1冊でも興味のあるかたはお手数ですが当日ブースに来ていただければと思います。試読もできるようになっていますのでお気軽にお立ち寄りください。紙の本は数に限りがあるので「絶対に電子版は嫌」というかたは早めにお越しください。
*2:そのうちWebで電子版を売るかもしれません
Ubuntu 16.04のVagrantでpublic Vagrant boxにアクセスできなくなった問題(解決編)
下記の過去記事の解決編です。
satoru-takeuchi.hatenablog.com
現状を確認したくて久しぶりにこの問題の再現試験をしたところ、なにもworkaroundを使わずに期待した動作をしました。しかしupstreamのissueはcloseしていませんでした。
vagrant box update - Fails with 404 Not Found error · Issue #9442 · hashicorp/vagrant · GitHub
ではdistroで修正したのかなと思い、Ubuntu 16.04のvagrantパッケージのchangelogを見ると、次のような項目を見つけました。
... vagrant (1.8.1+dfsg-1ubuntu0.1) xenial; urgency=medium * debian/patches/0013-Switch-to-vagrantcloud.patch: Switch from Atlas to Vagrant Cloud. Closes LP: #1747426. -- Daniel Watkins <daniel.watkins@canonical.com> Mon, 05 Feb 2018 18:00:06 -0500 ...
これに対応するUbuntuのissueは次の通り。
Bug #1747426 “Vagrant <2.x can no longer fetch box metadata from...” : Bugs : cloud-images
Ubuntuのひとたち、ありがとう。
出版物の原稿の管理方法について
わたしは自分が作成したソフトウェアのソースコードをすべてgithubにおいてOSSとして公開しています。これは自分がプログラマとして生きていられるのは先人が作ったOSSのおかげという思いがあるから、自分も先人と同じようにしようという考えからです1。ソースコード以外にもいくつかのドキュメントもgithubやqiita上で公開しています。
これらは利害関係者が自分しかいない、無償で見てもらって誰も困らない記事や同人誌の原稿です。
最近は書店で売る書籍も書くようになったので、githubに課金して($7/month)、本の原稿をプライベートリポジトリとして管理するようにしました。ソースコードと同様に原稿を公開するという手もあるのですが2、色々考えた結果、プライベートリポジトリで管理することにしました。
- できれば一人で書きたい。執筆方針は執筆開始時点のものから変えたくないし、それを貢献してくれる意図がある人に逐次わかってもらうコストをかけられない
- ソースコードと違って、公開したいという強いこだわりが無い
- なるべく多くの人に読んでもらいたいという思いはあるが、これまで溜めてきた知見を導入して膨大な手間をかけて書いたものなので、対価は得たい
- 原稿を公開することが売り上げに良い影響をもたらすのか否かという判断材料を持っていない。売れなくなると自分だけではなくて出版社を含めた利害関係者すべてが困る
では読者の意見は無視するのかというとそうではなくて、たとえば最近書いた本ですと、twitterなどから直接いただいたりエゴサしたりして集めたりしたご意見をまとめて共有のgoogle spreadsheetとして公開しています。公式サイトのフォームからもご意見を受け付けています。
とりあえずこのように運用して、困ったことがあればやりかたを変えていきます。
-
と、偉そうなことを言っているものの、今のところ世界中で使われているような大物は無いですが…↩
-
最近だと江添さんが書かれた江添亮の詳説C++17が有名です↩
拙著"[試して理解]Linuxのしくみ "が発売されました
わたしの初めての著書が本日出版されました。
副題の通り、実験と図解によってOSとハードウェアの基礎知識について学ぶのが本書の目的です。難解な理論の話やカーネルのソースコードは一切出てこないこと、および、サンプルソースの中身を見なくても読み進められることによって、プログラマ以外のかたがたにも理解できるようにしています。
本書を執筆しようとした動機は次のようなものです。
- あまねくITエンジニアはOSやハードウェアについて少しばかりの知識があるだけでコンピュータシステム全体への理解が一気に高まると思っている
- OSについての既存の書籍は開発者向けの理論や実装詳細の解説を主としているものがほとんどなため、OS開発者以外にとってはしきいが高い
- わかった気にさせて終わるのではなく、実際に読者自身が実験によって知識を体得できるようなものがいい
- 無いなら自分で書こう
このコンセプトを実現できたかどうかは読者の審判をあおぎたいと思います。もしよろしければ書店で本書を手にとって、一瞥してみて、よさそうだと思えば買っていただけたらなと思います。
最後になりましたが、本書の編集を担当してくれた風穴江さんと技術評論社の細谷謙吾さんに深く感謝いたします。おふたりの協力がなければこの本の完成はありえなかったでしょう。それに加えて推薦文を書いていただいた小崎資広さん、発売前に本書をレビューしていただいた皆さまにも感謝いたします。
Ubuntu 16.04のVagrantでpublic Vagrant boxにアクセスできなくなった問題
本日、普段使っているpublic Vagrant boxに対してvagrant box add
を実行したところ、404 not foundになってしまいました。
$ vagrant --version Vagrant 1.8.1 $ vagrant box add --provider libvirt elastic/ubuntu-16.04-x86_64 The box 'elastic/ubuntu-16.04-x86_64' could not be found or could not be accessed in the remote catalog. If this is a private box on HashiCorp's Atlas, please verify you're logged in via `vagrant login`. Also, please double-check the name. The expanded URL and error message are shown below: URL: ["https://atlas.hashicorp.com/elastic/ubuntu-16.04-x86_64"] Error: The requested URL returned error: 404 Not Found $
比較的マイナーなboxだったので、作者が提供を辞めてしまったのかなと思ったものの、ちゃんとサイトはありました。
Vagrant box elastic/ubuntu-16.04-x86_64 - Vagrant Cloud
もっとメジャーなUbuntu公式イメージをaddしようとしても同じ問題が発生しました。
$ vagrant box add --provider libvirt ubuntu/trusty64 The box 'ubuntu/trusty64' could not be found or could not be accessed in the remote catalog. If this is a private box on HashiCorp's Atlas, please verify you're logged in via `vagrant login`. Also, please double-check the name. The expanded URL and error message are shown below: URL: ["https://atlas.hashicorp.com/ubuntu/trusty64"] Error: The requested URL returned error: 404 Not Found $
先月同じコマンドを実行したときには動いていたはずなので、なんかおかしいなあと思って色々調べていたら、Vagrantのgithubに、つい二日前に登録された怪しいissueを見つけました。
vagrant box update - Fails with 404 Not Found error · Issue #9442 · hashicorp/vagrant · GitHub
issueはvagrant box update
に関するものでしたが、わたしのケースとすごく似ています。斜め読みしたところ、問題はpublic Vagrant BoxのURLとしてatlas.hashicorp.com
を受け付けなくなって、vagrantcloud.com
を指定しなくてはならなくなった、ということのようです。どうやら、すくなくともUbuntu16.04は全部影響を受けるらしい。
issueの中に、次のようなworkarundを見つけたので、試してみることにしました。
vagrant box update - Fails with 404 Not Found error · Issue #9442 · hashicorp/vagrant · GitHub
とりあえず、自分の環境でこれと同じ問題が出るか、および、workaroundを使って問題が解決するかを確かめました。Vagrantfileの変更が必要なので、とりあえずは当該ファイルを使わないvagrant box add
ではなく、`vagrant initを使いました。
- workaround適用前
$ vagrant init elastic/ubuntu-16.04-x86_64 $ vagrant up --provider=libvirt Bringing machine 'default' up with 'libvirt' provider... ==> default: Box 'elastic/ubuntu-16.04-x86_64' could not be found. Attempting to find and install... default: Box Provider: libvirt default: Box Version: >= 0 The box 'elastic/ubuntu-16.04-x86_64' could not be found or could not be accessed in the remote catalog. If this is a private box on HashiCorp's Atlas, please verify you're logged in via `vagrant login`. Also, please double-check the name. The expanded URL and error message are shown below: URL: ["https://atlas.hashicorp.com/elastic/ubuntu-16.04-x86_64"] Error: The requested URL returned error: 404 Not Found $
期待通り(?)失敗しました。
- workaround適用後(initの後にVagrantfileを編集)
$ vagrant up --provider=libvirt Bringing machine 'default' up with 'libvirt' provider... ==> default: Box 'elastic/ubuntu-16.04-x86_64' could not be found. Attempting to find and install... default: Box Provider: libvirt default: Box Version: >= 0 ==> default: Loading metadata for box 'elastic/ubuntu-16.04-x86_64' default: URL: https://vagrantcloud.com/elastic/ubuntu-16.04-x86_64 ==> default: Adding box 'elastic/ubuntu-16.04-x86_64' (v20171130.0.0) for provider: libvirt default: Downloading: https://vagrantcloud.com/elastic/boxes/ubuntu-16.04-x86_64/versions/20171130.0.0/providers/libvirt.box ... $
成功しました。続いて、上記コマンドの実行結果から得たboxファイルをもとにvagrant box add
が成功するかを試しました。
$ vagrant box add elastic/ubuntu-16.04-x86_64 https://vagrantcloud.com/elastic/boxes/ubuntu-16.04-x86_64/versions/201711 30.0.0/providers/libvirt.box ==> box: Box file was not detected as metadata. Adding it directly... ==> box: Adding box 'elastic/ubuntu-16.04-x86_64' (v0) for provider: box: Downloading: https://vagrantcloud.com/elastic/boxes/ubuntu-16.04-x86_64/versions/20171130.0.0/providers/libvirt.box ... $
こちらも成功しました。私が遭遇した問題は上記issueと同根と見てよさそうです。
ここから最終的にはvagrant box add --provider libvirt elastic/ubuntu-16.04-x86_64
を正しく動くようにしたいのですが、上記の方法が今のわたしにとってはworkaroundとして十分なので、とりあえずはこれで放置。後はUbuntuで修正されるのを待ちます。