VFS not found でkernel panic。grub.cfgの設定

gentooのemergeシステムは、コンパイルの難しさや依存関係を自動的にやってくれて、しかも、自分の環境に合った効率的な実行ファイルをビルドする、素晴らしいシステムですが、中核となるカーネルだけは、ほぼ自分でmakeする必要があります。
そして、make installしたカーネルを、grub2に登録し、再起動して新しいカーネルで起動させますね。

私はたまたま早々に64bit EFI環境に移行したため、grub2-9999の頃からの長いおつきあいです。
あの頃はドキュメントが少なすぎて大変でした。

さて、しばらくぶりにカーネルアップデートして再起動すると、kernel panicに遭遇します。

そして、毎回のことなのに、作業を忘れます。
kernel panicの内容は

kernel panic – not syncing: VFS: Unable to mount root fs

ルートファイルシステムがマウントできません。

/boot/grub/grub.cfgを見ると、今までブートできていたのは、

linux   /kernel-4.9.34-gentoo root=/dev/sda3 ro  

ですが、起動できなかったのは、

/vmlinuz-4.9.95-gentoo root=2270e722-6fa3-4ebf-a3e0-8225cd61f291 ro  

vmlinuzは名前の変更忘れなので関係ないとして、root=がデバイス名称なのかUUIDなのかの違いで、UUIDでは起動しないようです。
決して"kernelの.configにFS_VFS=yを記入し忘れたから"ではありません。
kernelの.configにVFSの項目はありませんでした。

で、手動で/boot/gurb/grub.cfgの内容を書き換えても良いのですが、そうすると次回のカーネルアップデートの時にまた忘れます。
そこで、grub-mkconfig(人によってはgrub2-mkconfig)の時に、自動的にroot=/dev/sda3を記入するように設定します。

/etc/default/grub

GRUB_DISABLE_LINUX_UUID=true
GRUB_DEVICE="/dev/sda3"

設定のテンプレートに"GRUB_DEVICE="の項目はありませんので、ご自身で追加を。

これで、grub-mkconfig時に"root=/dev/sda3"が設定されます。

GCC6.4のemergeエラー(コンパイルエラー)

GentooにインストールしているHomeAssistant (HASS)をアップデートした時に、GCCも6.4にバージョンアップしたのですが、その時にハマったにもかかわらず、リビルドで同じハマり方をしたので、備忘録。

GCC6.4は、特に原因不明のセグメンテーションフォルトでemergeが進みませんでした。
しかも、再度emergeしなおすと、別な場所でエラー。
どうも、「メモリーが少ないのでは?」というアドバイスが巷にあふれていましたが、自分のマシンはサーバーで、グラフィックチップへのメモリ割り当ても最低限で、TOPコマンドを見ても余っている様子はなさそうでした。

英語のフォーラムで、
「MAKEOPTS="-j○"の○の数字が大きすぎるとセグメンテーションフォルトが起こるよ。試しに-jでやってみて。」
って書いてあったので、/etc/portage/make.confの中MAKEOPTSを、MAKEOPTS="-j1"にしてみたらemergeが通りました。

それまではMAKEOPTS="-j7"でしたが、自分のマシンは4コアなので、MAKEOPTS="-j4"でリビルドしましたが、それでも通りました。

カーネルコンパイルが慎重にシングルスレッドでコンパイルする理由が垣間見えた気がします。

Gentoo readlineのslot conflictでemergeが進まない

Gentooのpipを使おうとすると最新のPythonを要求され、最新のPythonをemergeしようとしたら、最新のgccをemergeしなければならない。と、なったのが先日の話。
gccをアップデートしたなら、

emerge -uDN @world

をやらねば、なんだったらカーネルもアップデートしないと、"gccのバージョン違うドライバだよ!"って言われたりするので、やりたいなぁ。なんて思います。(思わないか?)

んで、やると、readlineというツールでslot conflictが発生します。

!!! Multiple package instances within a single package slot have been pulled
!!! into the dependency graph, resulting in a slot conflict:

sys-libs/readline:0

  (sys-libs/readline-7.0_p3:0/7::gentoo, ebuild scheduled for merge) pulled in by
    >=sys-libs/readline-7.0:0= required by (app-shells/bash-4.4_p12:0/0::gentoo, ebuild scheduled for merge)
    ^^                  ^^^^^^                                                                                                                                                       

  (sys-libs/readline-6.3_p8-r3:0/0::gentoo, installed) pulled in by
    sys-libs/readline:0/0= required by (sys-apps/util-linux-2.30.2:0/0::gentoo, installed)
                     ^^^^^                                                                                                   
    >=sys-libs/readline-6.2_p5-r1:0/0=[abi_x86_64(-)] required by (sys-libs/slang-2.3.0:0/0::gentoo, installed)
                                 ^^^^^                                                                                                             
    >=sys-libs/readline-4.1:0/0= required by (net-misc/ntp-4.2.8_p10-r1:0/0::gentoo, installed)
                           ^^^^^                                                                                                   
    >=sys-libs/readline-4.1:0/0= required by (dev-lang/python-2.7.14-r1:2.7/2.7::gentoo, installed)
                           ^^^^^                                                                                                       
    sys-libs/readline:0/0= required by (sci-libs/libqalculate-0.9.9:0/6::gentoo, installed)
                     ^^^^^                                                                                                     
    >=sys-libs/readline-4.1:0/0= required by (dev-lang/python-3.6.3-r1:3.6/3.6m::gentoo, installed)
                           ^^^^^                                                                                                       
    sys-libs/readline:0/0= required by (dev-libs/libpcre-8.41-r1:3/3::gentoo, installed)
                     ^^^^^                                                                                                 
    >=sys-libs/readline-6.2_p5-r1:0/0=[abi_x86_64(-)] required by (dev-db/unixODBC-2.3.4-r1:0/0::gentoo, installed)
                                 ^^^^^                                                                                                                 
    sys-libs/readline:0/0=[abi_x86_64(-)] required by (dev-db/sqlite-3.20.1-r1:3/3::gentoo, installed)
                     ^^^^^                                                                                                               
    sys-libs/readline:0/0= required by (net-wireless/bluez-5.47-r1:0/3::gentoo, installed)
                     ^^^^^                                                                                                   
lang/python-3.5.4-r1:3.5/3.5m::gentoo, installed)
                           ^^^^^                                                                                                       
    >=sys-libs/readline-5.2:0/0= required by (sys-block/parted-3.2-r1:0/0::gentoo, installed)
                           ^^^^^                                                                                                 
    sys-libs/readline:0/0= required by (app-text/hunspell-1.6.1-r1:0/1.6::gentoo, installed)
                     ^^^^^                                                                                                     
    sys-libs/readline:0/0= required by (dev-lang/ruby-2.2.9:2.2/2.2::gentoo, installed)
                     ^^^^^                                                                                                 
    sys-libs/readline:0/0= required by (app-crypt/gnupg-2.2.0:0/0::gentoo, installed)
                     ^^^^^                                                                                               

It may be possible to solve this problem by using package.mask to
prevent one of those packages from being selected. However, it is also
possible that conflicting dependencies exist such that they are
impossible to satisfy simultaneously.  If such a conflict exists in
the dependencies of two different packages, then those packages can
not be installed simultaneously.

For more information, see MASKED PACKAGES section in the emerge man
page or refer to the Gentoo Handbook.

すみません。いくつかのパッケージ端折ってます。
これ、どうにかするには、

/etc/portage/package.use

に、

dev-lang/python sqlite

という1行を追加して、pythonのUSEフラグに"sqlite"を追加し、

emerge dev-lang/python

で、pythonをemergeし直してから、@worldをemergeすると、slot conflict問題は解決するそうです。

出典
Gentoo Forums :: View topic - [SOLVED] sys-libs/readline slot slot conflict

ひかりTVのブロックノイズ(緑色のノイズ)への対処

今月の頭くらいから、ひかりTVにブロックノイズが乗るようになりました。

f:id:naoyukinagano:20180513183059j:plain

音声も途切れ途切れで見れたもんじゃありません。

気づいたのが5/2だったので、てっきりひかりTVを運営するぷららの障害だと思っていました。

www.plala.or.jp

ところが、いつまで経っても直りません。

ひかりTVNGN網内にサーバーがあるので、NGNへの接続が遅いのかと思い、フレッツ情報サービスサイトでスピードテストを実施してみました。

https://flets-east.jp/

f:id:naoyukinagano:20180513183901p:plain

うちはマンションタイプの中でも珍しいLAN配線方式なので、下り100Mbpsが上限のため、80Mbpsも出るのであれば問題ありません。

ひかりTVビデオの品質確認動画でも最高の25Mbpsがヌルヌルと再生されます。

これはもう、セットトップボックスの故障なのではないか!?と思ってきました。

サポートに電話しようかな? と、その前に、ネットで同じような状況になっている人がいるかも? と、思い、「ひかりTV ブロックノイズ」で調べると、悩んでいるどころか、解決している方を見つけました!

 

犯人は、同一ネットワークセグメント(もしかして同じハブも?)にいる、Wake on LAN(WOL)でスタンバイしているパソコンでした。

f:id:naoyukinagano:20180513220040j:plain

最近使っていなかったので電源が壊れていることに気づかなかったのですが、電源のコンデンサを付け替え修理を施し、よみがえったのでしたが、まさかWake on LANのスタンバイをしているとは。

Windows Media Centerとして使っていたので、リモコンで電源を入れることはあったんですけどね。

パソコンの電源を切った状態で、ネットワークだけWake on LANで生きているときは、10Mbpsでリンクアップされるそうでして、ひかりTVで利用しているIPv6マルチキャストがその10Mbpsのほうに引きつられ、マルチキャスト通信に遅延が発生するそうな。

 

さて、わかったところでWake on LANをOFFにしていきます。

このリビングPCにはPCI-EスロットにIntel PRO 1000PTを積んでいます。オンボードのLANが1Gbpsのくせにジャンボフレームに対応していないので、BIOSオンボードのLANをDisableにしております。

バイスマネージャのネットワークアダプタにあるIntel PRO 1000PTのプロパティを出し、電力の管理タブにあるWake on LANチェックをどんどん外していきます。

f:id:naoyukinagano:20180513221930j:plain

すいません。キャプチャがめんどくさくて写真です。

そしてシャットダウンしてひかりTVを見てみます。

f:id:naoyukinagano:20180513222108j:plain

お!ブロックノイズなく、ちゃんと映りました!

めでたしめでたし。

Homeassistantのアップデート

f:id:naoyukinagano:20180418000100p:plain

Homeassistantの話題なのにPythonのロゴなのは、Homeassistantのアップデートをしようとしたら、Pythonの仮想環境(Python venv)のアップデートに手間取ったからです。

コンフィグの紹介をすっかり忘れ、Google Assistantの連携にうつつを抜かそうとしたら、Homeassistantのアップデートが必要そうだと言うことがわかり、じゃ、アップデートしようとしたら、Pythonのバージョンが古いと怒られ、仕方なくPythonをバージョンアップした(といっても、GentooのプロファイルアップデートやGCC6.4.0のアップデートという行く手に阻まれながら・・・)。なのに、それでもPythonのバージョンが古いからダメよ、といわれます。

そして、古いのはPython仮想環境だけ、という始末。

gentoo # python -V 
Python 3.6.3
gentoo # su homeassistant
homeassistant@gentoo ~ $ cd /home/homeassistant
homeassistant@gentoo ~ $ source bin/activate
(homeassistant) homeassistant@gentoo ~ $ python -V
Python 3.4.5
(homeassistant) homeassistant@gentoo ~ $ exit
gentoo #

じゃ、Python仮想環境のアップグレードを、と思ってやってみます。

gentoo # su homeassistant
homeassistant@gentoo ~ $ cd /home/homeassistant
homeassistant@gentoo ~ $ python3 -m venv --upgrade /home/homeassistant
homeassistant@gentoo ~ $ source bin/activate
(homeassistant) homeassistant@gentoo ~ $ python -V
Python 3.4.5
(homeassistant) homeassistant@gentoo ~ $ 

変わりません。
この状態でHomeassistantのアップデートしてみます。
アップデートはインストールコマンドの最後に”-U”です。

(homeassistant) homeassistant@gentoo ~ $ python3 -m pip install homeassistant -U
Collecting homeassistant
  Downloading https://files.pythonhosted.org/packages/b0/ed/9497c6009a0ac1a4e787298776329276e7ccecfa1bad0dc29bd71ba0a503/homeassistant-0.65.6-py2.py3-none-any.whl (7.8MB)
    100% |????????????????????????????????| 7.8MB 80kB/s
homeassistant requires Python '>=3.5.3' but the running Python is 3.4.5
(homeassistant) homeassistant@gentoo ~ $ 

怒られました。
さて、では仮想環境のpythonはどこにあるのでしょう?

(homeassistant) homeassistant@gentoo ~ $ which python3
/home/homeassistant/bin/python3
(homeassistant) homeassistant@gentoo ~ $

では、ls -alで見てみましょう。

(homeassistant) homeassistant@gentoo ~ $ ls -al /home/homeassistant/bin/python3
lrwxrwxrwx 1 homeassistant homeassistant 38  117 23:47 /home/homeassistant/bin/python3 -> /usr/lib/python-exec/python3.4/python3
(homeassistant) homeassistant@gentoo ~ $ exit
gentoo #

おや、シンボリックリンクが張ってあるだけじゃないですか。
では、このシンボリックリンクを消して、もう一度Python仮想環境を作れば良いということですね。

gentoo # su homeassistant
homeassistant@gentoo ~ $ cd /home/homeassistant/bin
homeassistant@gentoo ~/bin $ rm python3
homeassistant@gentoo ~/bin $ python3 -m venv /home/homeassistant

では、Python仮想環境でアップデートしましょう

homeassistant@gentoo ~/bin $ cd /home/homeassistant
homeassistant@gentoo ~ $ source bin/activate
(homeassistant) homeassistant@gentoo ~ $ python -V
Python 3.6.3
(homeassistant) homeassistant@gentoo ~ $ python3 -m pip install homeassistant -U
Collecting homeassistant
  Downloading......()

お、成功したようです。
では、hassを再起動します。

次回こそはconfigを公開したいな。

Android向けにHome Assistant on Gentoo

いままでiOS向けにHomebridgeの環境を整えていました。
が、iOSのHomeKit以外にHomebrigeとやりとりするようなアプリケーションがありません。
私のメインスマホはGalaxy S7 Edge。バリバリのAndroidです。
なので、家のIot機器(といっても、ほとんど電灯スイッチ)をAndroidからも扱えるようにしたい。

Linuxサーバー上動くホームオートメーションサーバーアプリケーションは、Domoticz、OpenHABなどがあるようですが、ここはGentooで簡単に動きそうなHome Assistantにしました。
「日本語がない」というのが欠点ですが、どうせそんなに難しい英語は使いません。
LivingとかLightとかですよ。中学生英語です。

そして、Home AssistantはAndroidアプリがあるのもイイ!!

LaymanにeBuildを置いてくれているツワモノもいるようですが、ここは公式に則って手動でインストールします。
と、言っても、環境を汚さないように/home配下に専用のホームディレクトリを作って、専用のユーザー権限で動かします。

やりかたは、ほぼこの公式ページです。
home-assistant.io

ただ、この公式ページは「初心者向け」って書いてあるのに、あんまり初心者向けじゃなさげ。

まずは、ユーザーとディレクトリを作成します。

gentoo ~ # useradd -m /home/homeassistant -G homeassistant homeassistant

(あるていど設定が終わってから、シェルの設定を/bin/falseにします。)

suでhomeassistatになります。

gentoo ~ # su homeassistant
gentoo ~ $

で、/home/homeassistantディレクトリで、公式ページに書かれているインストール作業を実施します。
まずは、Python3の仮想環境を構築します。ってもたったの1行。

gentoo ~ $ python3 -m venv /home/homeassistant

そしてその環境に入ります。といっても、ソースコマンドで環境変数が変わるだけかもしれませんが。

gentoo ~ $ cd /home/homeassistant
gentoo ~ $ source bin/activate

そして、homeassistantのインストールです。

gentoo ~ $ python3 -m pip install homeassistant

ここまで来れば、仮想環境を抜け出してかまいません。
というか、ルートにもどれば良いだけだと思います。

で、公式サイトに書いてある自動起動スクリプトは、Gentooには通用しないので、Gentooのお作法で、自分でインストールしたアプリケーションは/etc/local.d/の中に入れます。

/etc/local.d/homeassistant.start

#!/bin/sh
sudo -u homeassistant -H /home/homeassistant/bin/hass --pid-file /home/homeassistant/hass.pid  --daemon > /var/log/home-assistant.log 2>&1

/etc/local.d/homeassistant.stop

#!/bin/sh
kill $(cat "/home/homeassistant/hass.pid") 2>&1

これで(自動)起動する準備は整いました。
でも、起動しても、うまくいって日の出日の入りとか、chromecastやUpnp(DLNA)デバイスが見つかる程度だと思います。
(それでも、自動でみつかるだけマシですが。)

/etc/init.d/localを再起動すると、起動するはずです。

gentoo ~ # /etc/init.d/local restart

で、ブラウザ(Firefox等のmozilla系がいいです。)で、8123番ポートにアクセスします。
http://サーバーのip:8123/


f:id:naoyukinagano:20180121234519p:plain
すみません。写真は設定し終わった後なので、いろんな電灯スイッチや情報が入っています。
このあたりの設定は次回に。

FlashAir(W-04)の画像をGoogle Photos(Picasa Web)のアルバムにアップロードするスクリプトを改善

前回、FlashAir(W-04)の画像をGoogle Photos(Picasa Web)のアルバムにアップロードするスクリプトを作りました。

gentoolinux.hatenablog.com

で、テストして成功したと喜んでおりましたが、なんだか遅い。
特に、猫写真を撮る際は連写をするため、何枚もアップロードしなければなりませんが、遅すぎる。

原因は簡単。
FlashAirから画像リストを取得、ダウンロード済みかどうか確認し、1枚ダウンロード、PicasaWebにアクセスするためのトークンをゲット、ようやくアップロード、日付ディレクトリに移動、最初に戻る。
というのをいちいち繰り返していたため、遅いのです。

もちろんアップロード中にカメラの電源を消すことも出来ません。

で、FlashAirからの画像ダウンロードを全て行ってから、PicasaWebにアップロードするようにアルゴリズムを変更します。
アルゴリズムといっても、単にスクリプトの行を入れ替えただけ。

#!/bin/bash

#初期変数一覧

#Flashairのアドレス
FLASHAIR_IP="http://192.168.x.161"

#DCIMフォルダの名称
DCIM_FOLDER="CANON"


#現在のディレクトリに移動
cd `dirname $0`

#プロセスIDを保存
echo $$ > pid_flashair.txt

#DCIMフォルダのURLを生成
WGET_PRE_URL=${FLASHAIR_IP}"/DCIM/"



while :
do

#Flashairを死活監視
ALIVE=$(/usr/bin/wget -nv --spider --timeout 60 -t 1 ${FLASHAIR_IP} 2>&1 | grep -c '200 OK')

        #もし死活監視で生きていたら
        if [ $ALIVE -eq 1 ]; then

                #配列を初期化
                echo "Flashair - Format Arrys."
                DCIM_LIST=()
                JPG_LIST=()
                FLASHAIR_DONE=()

                #DCIM配下のディレクトリを配列に代入
                echo "Flashair - get under DCIM directory list."
                DCIM_LIST=(`/usr/bin/wget ${WGET_PRE_URL} -q -O - | grep 'wlansd.push({"r_uri"' | sed -e 's/wlansd.push({"r_uri":"//' -e 's/", "fname":"/\//' -e 's/", "fsize".*//' | grep ${DCIM_FOLDER}`)

                #フォルダの数だけループ処理を実施
                echo "Flashair - Starting loop under DCIM directory."
                DCIM_LOOP=${#DCIM_LIST[@]}
                DCIM_LOOP=$((DCIM_LOOP - 1))
                while [ $DCIM_LOOP -ge 0 ];
                do

                        #フォルダの中のファイルを配列に代入
                        echo "Flashair - Get file list under "${DCIM_LIST[DCIM_LOOP]}
                        JPG_LIST=(`/usr/bin/wget ${FLASHAIR_IP}${DCIM_LIST[${DCIM_LOOP}]} -q -O - | grep 'wlansd.push({"r_uri"' | sed -e 's/wlansd.push({"r_uri":"//' -e 's/", "fname":"/\//' -e 's/", "fsize".*//'`)

                        #ファイルの数だけループ
                        echo "Flashair - Starting loop under "${DCIM_LIST[DCIM_LOOP]}
                        JPG_LOOP=${#JPG_LIST[@]}
                        JPG_LOOP=$((JPG_LOOP - 1))
                        while [ $JPG_LOOP -ge 0 ];
                        do

                        #アップ済みのファイルかどうかをチェック
                        echo "Flashair - Check FLASHAIR_DONE "${JPG_LIST[JPG_LOOP]}
                        if ! `cat flashair_done.txt | grep -q "${JPG_LIST[JPG_LOOP]}"` ; then

                        #アップ済みになかった場合の処理
                        #wgetによるファイルの取得
                        echo "Flashair - Get file "${JPG_LIST[JPG_LOOP]}
                        /usr/bin/wget -q -N --no-host-directories --no-directories ${FLASHAIR_IP}${JPG_LIST[JPG_LOOP]}

                        #flashair_done.txtにファイル名を追加
                        echo "Flashair - Output to flashair_done.txt "${JPG_LIST[JPG_LOOP]}
                        echo ${JPG_LIST[JPG_LOOP]} >> flashair_done.txt

                        fi

                        JPG_LOOP=$((JPG_LOOP - 1))
                        done


                DCIM_LOOP=$((DCIM_LOOP - 1))

                #ダウンロードした全てのJPGを2048pxにリサイズ
                echo "Flashair - Resize Images"
                /usr/bin/mogrify -resize 2048x2048 -quality 100 *.JPG

                #ディレクトリ上にあるJPGファイルをpicasaweb APIでアップロード
                echo "Flashair - Uploading Images"
                ./upload_images_in_dir.sh

                #ディレクトリ上にあるJPGファイルを日付ディレクトリで整理
                echo "Flashair - Move Images to YMD directory "
                /usr/bin/exiftool -q '-Directory < CreateDate' -d %Y%m%d *.JPG

                done

        fi

        sleep 10
done

そう、リサイズ、アップロード、ディレクトリ整理を一つだけループの外に置いただけ。
これだけでだいぶ早くなりましたし、アップロードが始まったのを見て、カメラの電源も切ることが出来るようになりました。