Ubuntu14.04から16.04に上げたら起動しなくなった

途中で変な状況になっているのを、考えるのが面倒になって強引に進めただけなんですけど。起動しなくなりました。

Kernel Panic – not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

 

rootのファイルシステムが見えませんぜと言われている気がしたので、grubの設定が合わなくなったのかなと思って、grub-installとかやればいいのかな?と思ったはいいものの、マザーボードが古いのかなんなのか(2008年頃のものなので10年近く前か)USBキーボードをgrubメニューの間(後からわかったけど、カーネルが起きてくるまで?)認識してくれない。過去のカーネルで起動して作業しようと思ったけど、これじゃダメだ。Live環境が必要…

手元にあったUSBメモリに入っていたのはArchだったんだけど、強引にいけばイケるんじゃねっと思って強引に作業したら、grub shellに入るようになりました(状況悪化)

 

しょうがないので部屋のどこかにあるPS/2接続のキーボードをどうにか見つけて引っ張り出してきて、接続。grub shellから過去バージョンのカーネルで起動して、それからboot – Kernel Panic – not syncing: VFS: Unable to mount root fs on unknown-block(0,0) – Ask Ubuntuで「update-initramfsしろよな、それからupdate-grub2しろよな!」って書いてあったのでそれを実行。

 

grub> set pager=1
grub> ls
(hd0) (hd0,msdos1) (hd0,msdos5)
grub> set root=(hd0,1)
grub> linux /boot/vmlinux-3.13.0-92-generic root=/dev/sda1
grub> initrd /boot/initrd.img-3.13.0-92-generic
grub> boot

ここまでで新しいカーネル4.4.0-47じゃなくて、正常に動作していた過去のカーネル3.13.0-92で起動できる。

頭のset pager=1で常にmoreみたいな状況にする。ちなみに、lsの結果のmsdos5がswap、msdos1がrootパーティション(/bootもこの中)。

最近/bootを分ける構成ばかりだったので、つまり/dev/sda1が/、/dev/sda5が/bootだと勘違いしていた。容量もそれぞれ600GBくらいと4GBくらい。4番目の操作で間違った入力、つまりroot=/dev/sda5していると、当然起動には失敗する。非常に簡単な対話式の操作画面に入った。これに気付くまで割りと困ってた。

なにはともあれ正しく過去バージョンのカーネルで起動したらログインして、terminalから以下のような感じ

$ sudo update-initramfs -u -k 4.4.0-47-generic
$ sudo update-grub2

カーネルバージョンが不明の場合には、dpkg –list | grep linux-image-とかで調べましょう。

あとは再起動してやれば完了。

Cinnamonクラッシュ対応しようとしたらArchLinuxごと起動しなくなった

発端はCinnamonがクラッシュしたところ。Ctrl+Alt+F2でtty2に移動して$ cinnamonすると、libreadline.so.6が無いよ、と。

取り敢えず再起動しても状況は変わらない。そもそもCinnamonが起動しない。

インストールされているのはreadlineの7らへんだったので、cinnamonがまだ対応出来てないのかなと思って、じゃあreadlineを6系統にダウングレードすれば良いのでは、という強引な発想をした。

pacman -Rdd readlineしてローカルのパッケージキャッシュからインストール…

したら起動しなくなりました。てへぺろ。

 

GUIが、とかじゃなくて、そもそもログイン画面まで届かない(CUIなログイン画面にも届かない)。

しょうがないので、元に戻すことに。

 

Live環境からarch-chrootして、そこでpacman -S readlineしちゃえば良いのでは?

と思っていたのもつかの間、arch-chrootがlibreadline.so.7を要求していて出来ない。ただのchrootだとpacmanとか出来ない(/etc/mtabが無いよ、とか言ってくる)ので、arch-chrootがいいんだけど。

arch-chrootはシェルスクリプトなんですよ、というのをどこかで聞いた記憶があったので、じゃあそれの動作を一つ一つやればいいんちゃう?と思ったあたりで、archwikiを見に行くと、ズバリな記述を見つけたので、それを参考にchroot。chrootを使う – Change Root – ArchWiki

その後pacman -S readlineしたけれど、GPGME error: invalid crypto engineと怒られて出来なかった。–forceつけても変わらないので、もうめんどくさいので/etc/pacman.confでSigLevel=Neverにしてreadlineだけアップグレード、pacman.confもとに戻して、chroot抜けて再起動!

# mount /dev/sdb2 /mnt
# mount /dev/sdb1 /mnt/boot
# cd /mnt
# mount -t proc proc proc/
# mount --rbind /sys sys/
# mount --rbind /dev dev/
# mount --rbind /run run/
# cp /etc/resolv.conf etc/resolv.conf
# chroot /mnt
# vi /etc/pacman.conf
# pacman -S readline
# vi /etc/pacman.conf

そしたら起動するようになった

 

この起動はゴールではなく、最初の状況に戻ってきたってことだ。

 

変わらずCinnamonはlibreadline.so.6を要求してクラッシュし続けるので、tty2に移動して、libreadline.soで検索、ダメ元だけど、そこにlibreadline.so.6という名前でシンボリックリンクを張って再起動してみた。

ら、Cinnamon普通に起動しました。これでやっと普通に使える。

GPTなディスクをMBRにする

MBRからGPTはなんだか気づいたらなってることもおおいし(?)別にわりとどうでもいいんだけど、その逆は気づいたらなってるってことも無いのでメモ。

一発メモっておけば記憶にも残るでしょうということで。

parted /dev/sdb -s mklabel msdos

単純な感じだった。

参考:GPTをmbrに変換 – Qiita

C++でmath.hやcmathをincludeしてるのにM_PIとかM_Eとか使えない

#include <math.h>(cmath)したのに、M_PIとかM_Eの定数が使えない。

と思わせて、math.hの#define並んでるところを眺めると、

#if !defined(__STRICT_ANSI__) || defined(_POSIX_C_SOURCE) || defined(_POSIX_SOURCE) || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_USE_MATH_DEFINES)
#define M_E 2.7182818284590452354
#define M_LOG2E 1.4426950408889634074
#define M_LOG10E 0.43429448190325182765
#define M_LN2 0.69314718055994530942
#define M_LN10 2.30258509299404568402
#define M_PI 3.14159265358979323846
#define M_PI_2 1.57079632679489661923
#define M_PI_4 0.78539816339744830962
#define M_1_PI 0.31830988618379067154
#define M_2_PI 0.63661977236758134308
#define M_2_SQRTPI 1.12837916709551257390
#define M_SQRT2 1.41421356237309504880
#define M_SQRT1_2 0.70710678118654752440
#endif

の頭の行、if definedということで、それがないと有効にならないっぽい。

どれもなんだか怖いので、ケツにある_USE_MATH_DEFINESを突っ込んでおけば良いっぽい(つかえた)

DAPを作る妄想その2

その2ってお前、その1はどこだよって思うかもしれないけどその1はあるんですよ、うんうん。

DAPを作る妄想

正直言って一体いつの話だよ、という感じだけど(実際一番最初に思いついたのは3年くらい前だったりする)、多少やる気を出してきたのでちょろっと書く。具体的な作業はあまりない。

 

・モニタ

NTSC/PAL (Television) TFT Display – 2.0″ Diagonal – AdafruitをAdafruitから仕入れたのは以前の記事の通り。駆動には最低6V必要だけど、電源には余ってるモバブを使う心積もりなので(生セル買ってきてもいいけど、電源管理ちゃんと考えないといけないし爆発怖いのでやめとく)、昇圧回路が必要。

昇圧回路には最大24V出力 LMR62421昇圧型スイッチング電源モジュール基板 – 秋月電子通商らへんを考えている。30mm四方なのでそんなに場所取らないんじゃないかなという思い込み。

ここにUIをうまく表示してやろうと、昇圧回路と後述のDACが届くまで、てきとうなプッシュスイッチ使って色々実験中。(後述)

 

・制御本体

Raspberry pi を使うつもりだったけど、Raspberry pi Zeroが手に入ったので、これを使おうかと。大幅なスペースの削減を達成できるはず。

ただし、これに伴って本体から直接出力してくれなくなったので、DACが本当に必要になった。

ケース関係で頼ろうと思っている人に相談してみたら、前の記事で書いてたようなデカいDACは場所食っちゃって使いにくそうと強めに言われたので、後述のDACを使う事にしてみる。

 

・音

pHAT DAC – Pimoroniを使ってみようと思う。これならRaspberry pi Zeroと同じような面積だし場所も取らない。

ちらちら見るに音としての品質はアレみたいな感じっぽいので、不満があったらまた考える事にする。

 

・ストレージ

Raspberry pi Zeroに変えた都合で、USBポートがmicro-Bが1つのみとなった。USB Hub必須っぽい?これが地味に場所を食いそうなので、迷いどころ。目処が立たない。メインストレージのMicroSDとは別に用意したいんだけどなぁ。

 

・UI

てきとうにコンソールアプリケーションとして作ってみるテストちう。具体的な構想も何もない。実験したのは以下みたいな感じ。

1.GPIOの特定ピンをON/OFF出来る(wiringPi使ってる)
2.プッシュスイッチの様子(つーかGPIOの各ピンの様子)をC++コードから見に行く
3.コンソール画面を随時書き換えてUI風味を作る

音に関係する部分はpHAT DACが届いてから手を付けるつもり。UI風味を発展させて、ファイルシステムからデータベースを作って、そこから選択するとかを実験してみる予定。

今はPoderosaで接続しに行ってそこで開発しているけれど、本当のモニタを使わないと表示具合がわからない(特に1画面内に収められる情報量がシビアになりそうだし)。昇圧回路の用意が出来たらそっちに移行しようと思っている。

 

pHAT DACの到着を待つか、昇圧回路をとっとと入手するか、どちらかが無いと、先には進めなさそうだなぁ。