4pkのLinuxメモ

Linux(主にGentoo Linux)に関するメモを書き残すブログです。

Gentoo Linuxでのrubyのバージョン管理について

少し前の記事

mikutter4pk.hatenablog.com

と関連した話です。

 

・rdocの更新がこける

emerge -uDN worldの過程でrdocの更新が入りました。

通常,rubyを入れるとruby23がまず入るわけですが,当環境では最新版のruby25までemergeしています。ruby25を入れるとついでにruby24も入ることになります。(特別なことをしない限り)

ruby23でmikutterを使えることを確認して,上記リンクのような対策を行いruby25でもmikutterを使える状態にしていました。

この状態でrdocをemergeすると次のような問題が起こります。

 

rdocはruby23,ruby24,ruby25全てに依存しています。

各バージョンに応じたgemを使ってビルドすることになる。

今の運用だとruby24は入れただけでほとんど空の状態なので,ruby24のコンフィグフェーズでgemが足りなくてこけてしまいます。

 

前回の話では,rubyのバージョンに対するbundleのgemが正常に反映されないということでしたが,今回は大元の各バージョンのgemが足りなくて怒られるという話です。

 

対策としては,

①ruby24に切り替えてから足りないgemを補う

②ruby24もUSEフラグに追加し,gemパッケージを再emergeする

 

実際,行ったことは,

①eselect ruby set 2(ruby24)

 gem install rake markdown kpeg

②USE="ruby24" emerge kpeg 

③eselect ruby set 3(ruby25に戻す)

 

実際は,rdocのエラー内容を見ながらあれこれ対処するしかないです。

gem install kpegだけでいけると思ったのですが,USEを追加してemergeしないとうまくいかないのは意外でした。

 

rubyのバージョン管理

Gentooではeselectによりrbenvなどを用いなくてもバージョン管理が出来るのが特徴ですが,それゆえにbundlerの指定がruby23と固定のバージョンだったりしたときにバージョン管理がうまくいってないことが気付きにくいこともあります。

このような状態でエラーが出た場合,エラー内容を見てもなんでエラーになっているか非常に分かりにくいです。

そのため,バージョン管理に関しては予め理解をしておく必要があります。

まとめると,こんな感じ?

①eselectによるバージョン管理

②そのバージョンに応じたgem

③そのバージョンに応じたbundler

④bundlerに応じたgem

⑤各gemが参照しているrubyのバージョンを確認

⑥上記gem達がglobalを参照しているのかlocalを参照しているのか

 

一番楽なのは,各gemにrubyで関連付けて,eselectでバージョン管理することですね。

bundlerしか確認していませんが,他のgemも最初に入れたruby23を参照してたらかなり面倒ですね。

bundlerに関しては,前回の記事ではruby25に変更と書きましたが,rubyに変えた方が良いと思います。(今はrubyにしてる)

 

Gentoo初心者による記事でありますが,ここらへんの話って検索しても一般的なことしか出てこないんですよね(rbenvとかbundler単体の話しか出てこない)

結果的には同じことだと思いますが,Gentooのeselectで管理しようと思ったときに各gemパッケージがどのような参照になっているかは通常の管理と中身が異なってくることもあるかもしれません。

また,gemコマンドでgemパッケージを追加するのが普通ですが,Gentooの場合mikutterなどを入れるとgemのパッケージ自体がemergeでどさっと入ってくるので管理が複雑になりがちです。

 

と同じようなことで悩んだことがある人が全くいないわけではないだろうと言うことで私なりにまとめてみました。

アウトプット力がゴミに等しく分かりにくい文章だと思いますが,頭の中に確かな情報はあるので分かりにくい箇所に質問などあれば気軽にしてください。

 

Gentoo(メイン)とUbuntu(サブ)をデュアルブートするときの話

・注意

説明を書きますが、現時点の私の知識で裏付けが取れているわけではないので、多少間違ってるところもあるかもしれません。

間違いがある場合ご容赦ください。

現状私のマシンでは下記の設定で動いてるので、そういう状況証拠的な話として受け止めてください。

マシンは、MacBookAir3.1(2010)でMacなのでUEFIです。

 

・構成について

今回書くのは以下のような構成の場合の話です。

/dev/sda1 BIOS bootパーティション(Macの場合空けといたほうが良いらしい)

/dev/sda2 bootパーティション

/dev/sda3 swapパーティション

/dev/sda4 Gentoo本体

/dev/sda5 Ubuntu本体

先にGentooをインストールしてから、UbuntuインストールディスクのマネージャーにしたがってUbuntuを追加で入れたような状態です。(Ubuntuの導入方法まで書かなくていいよね?)

 

・いきさつ

Ubuntuなので、自動で勝手にgurbまでやってくれて自動でデュアルブート環境が出来ていたのですが

当環境は、MacBookAirなのですが、電源ボタンを押すとpeep音が鳴り止まないという怪奇現象(有名なやつ)が起こりました。

手順に従い、SMCリセット、NVRAMリセットを行いました。

peep音は鳴らなくなり一見落着したのですが、

grubの画面がUbuntu導入前に戻ってしまい、Ubuntuがブートできなくなってしまいました。

 

まあUbuntuだし、どうでもええわ

 

と思いましたが、GentooUbuntuのmikutterの比較で使うために環境は整えてる状態なのでまた1からやり直すのは面倒だということで、Ubuntuを復旧させることにしました。

元々レガシーなgrub.confの時代にWindowsGentooデュアルブートをしていたので、そのときのやり方ならわかるのですが今の時代はgrub2でgrub.cfgになり設定が変わっていたので結構ハマりました。

 

・grub2によるマルチブート

/dev/sda2でgrubを立ち上げ、そこから/dev/sda4のGentooと/dev/sda5のUbuntuを立ち上げると言う具合でマルチブート出来るようにします。

ブート関連のオプションを追加する際は、/etc/grub.d/40_customと言うファイルに情報を追記していきます。

メインがGentooなので、/dev/sda4のGentooの/etc/grub.d/40_customを追記しました。(多分メインが逆の場合は逆でしたほうが良いと思います)

デフォルトの状態だと、

 

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.

 

と書かれていると思います。

ここの下に追記して、ブートを増やしていきます。

とりあえず、具体的な追加内容は以下のとおりです。

 

menuentry "Ubuntu"{
insmod part_gpt
insmod ext2
set root='(hd0,gpt5)'
linux /boot/vmlinuz-4.13.0-45-generic root=/dev/sda5
initrd /boot/initrd.img-4.13.0-45-generic

}

 

ざっと説明すると下記のとおりです。

 

・menuentry

表示名

・insmod

gpt形式とext2ファイルフォーマットを指定している。

多分この部分がなくても起動できると思います。

・set root

ここでは、/dev/sda5をブート対象としてます

(hd1,gpt4)にすると、/dev/sdb4になります。

今回は、gpt形式なのでこのような書き方をしていますが、(hd0,5)でも通る気がします。

linux /boot/vmlinuz-4.13.0-45-generic root=/dev/sda5

Ubuntuの/boot/ディレクトリにある同じような名前のファイルを指定してあげてください。

root=の部分については、自分にあったものを指定してください

・initrd /boot/initrd.img-4.13.0-45-generic

これも上記と同じで、指定するだけです。

この2つのファイルを指定することで、ブートすることが出来るようです。

そこらへんはまだ勉強不足なので詳しく分かり次第また別の記事で書くと思います。(多分書かない)

 

上記内容を追記できたら、

# grub-mkconfig -o /boot/grub/grub.cfg

で内容反映させます。

最終的にこのgrub.cfgに反映させるのですが、基本的にこのファイルを直接触るのではなく今回変更した40_customのようなファイルだけを編集するようにしてください。

そこが、grub.confの時代と感覚が異なる気がします。

 

rebootすれば、Gentooの下にUbuntuが出てきてUbuntuでもブート出来るようになるはずです。

 

※備考

/etc/default/grub のオプションもちょっと変更しました。

必要なことだったかもしれません。確認取れれば追記します。

 

Gentoo Linuxでの電源管理

・電源管理

GentooGUI環境を導入してもたいがいの場合電源管理のメニューが正常に動作しない。

現状,最も無難なやり方としては,tlpを入れる,xfce用の電源管理ソフトを入れる。

というものである。

 

・ tlp

laptop-mode-toolsと言う似たようなものもあるが,うちの環境では起動した瞬間にフリーズしてしまうと言う状態でどうやったら使い物になるかわからない状況

マストドンGentooを使っている方に色々教えてもらったところ,このtlpを使うのが無難であることでこれを導入します。

 

インストール方法。(下記のgitを参照)

https://github.com/dywisor/tlp-portage

概略

①laymanの導入

wget "https://raw.github.com/dywisor/tlp-portage/maint/layman.xml" -O /etc/layman/overlays/tlp.xml

③layman -f -a tlp

④emerge tlp -av

⑤/etc/tlp.confで, TLP_ENABLE=1にする

⑥systemctl enable tlp.service

⑦systemctl enable tlp-sleep.service

※備考

tlp-1.1が最新。やたら古いやつの場合ダウンロードリンクが切れていてエラーになる。

 

 

・xfce4-power-manager

emerge xfce4-power-manager

 

※備考

デスクトップ起動時に立ち上げる場合は,.xinitrcに

xfce4-power-manager

追記

 

・バックライト関係のアレ

カーネルのオプションで色々有効にする必要があるが,色々いじってどこをどうしたら良いのか正確に把握できておらず。

逆にカーネルのオプションを設定していてもドライバがないと動かないので,上記のようなドライバとなるソフトを入れてあげる必要がある。

 

 

Gentoo Linuxでrubyのバージョンを上げたときにbundleが前のバージョンのままになる問題

・/usr/local/bin/bundle

現在のGentooで普通にrubyを入れるとruby23がまず入ることになる。

gemもそれに対応したバージョンであり、この状態でbundlerを入れるとbundlerの参照するrubyがruby23になってしまう(自分の環境ではそうなっていた)

具体的には、

/usr/local/bin/bundleの一行目が

#!/usr/bin/ruby23
となっていた。

この状態でrubyのバージョンを上げてしまうと(例えばruby25へ),bundleが参照するrubyは23のままなのでruby25を実行してるのにbundleはruby23で動いていて合わなくなってしまう。

対策としては,ruby23固定になっているので、rubyなりruby25なりに変えてやれば正常に動作するようになる。(そもそも、ここの参照先はrubyであるべきなのでは?)

#!/usr/bin/ruby23→#!/usr/bin/ruby25(私の行った変更)

他にも色々この手の問題はあると思いますが,Gentooとして起こりそうなのはこんなものかなぁと言うことで

GentooLinuxでAndroidのUSBテザリングを有効にする

カーネル

wiki通りに設定するだけ(カーネル4.4.6以降)

Device Drivers --->
    [*] Network device support --->
        <M> USB Network Adapters --->
            <M> Multi-purpose USB Networking Framework
                <M>  CDC Ethernet support (smart devices such as cable modems)
                <M>  CDC EEM support
		<M>  Host for RNDIS and ActiveSync devices
                <M>  Simple USB Network Links (CDC Ethernet subset)
                     [*] Embedded ARM Linux links (iPaq, ...)

カーネルコンパイル後,再起動してAndroid端末からUSBテザリングを実行すると

ls /sys/class/net

とか,つないだときに出てくるデバイス名が表示されるので

# dhcpcd デバイス

などでAndroidの回線を使ってネットにつなぐことが出来るようになる

GentooInstallCDなどでは標準でこの機能が使えるので,Wifiなどが最初から機能出来ない場合よく使う手法である

※と言いつつも,私はWifiが認識されない場合,USB上で動くUbuntuとか使ってます(MacBookAirにGentoo入れるときとか)

MacBookにGentooLinuxをインストールする(未完)

MacBookがブートを認識するための方法

一般的には、元々Macの機能にあるrEFItを使うようだ

今回、私のMacには元々Macがない状態であり、その方法を使えないしそんなMacに依存する方法なんて元々やる気がない

そういうときのやり方として以下の方法がある 

/boot以下にあるefiファイルを

/boot/efi/boot/bootx64.efi

に置き換える(または名前を変えたものをもう1つ作る)

 

・boot時にエラーが出る(カーネルパニック

fb: switching to radeondrmfb from EFI VGA

とエラーが出た場合

grubの画面でeを入力して

下の方にあるlinux〜の最後のro の後に nomodeset

を追記して起動(f10)

nano /etc/default/grub

GRUB_CMDLINE_LINUX="nomodeset"

にしてコメントアウトを外し追記し保存

その後

update-grub

grub-mkconfig -o /boot/grub/grub.cfg

を叩く

grub.cfgは自分で作るものなので当環境とは若干ディレクトリの名前が違う可能性あり

 

 ・xdamageがnot found

radeon搭載のMBPでは,/etc/portage/make.confに

INPUT_DEVICES="radeon"を追記する必要がある

 

 ・タッチパッドが反応しない

Device Drivers --->
Input device support --->
[*] Mice --->
# For trackpad support
<*> Apple USB BCM5974 Multitouch trackpad support

emerge xf86-input-synaptics lipinput xf86-input-libinput

あたり

 

・バッテリ残量表示

Power management and ACPI options --->
ACPI (Advanced Configuration and Power Interface) Support --->
<*> Smart Battery System

emerge acpitool 

acpitool と叩くと出る

 

Wi-Fiが有効にならない

MacBookAirと同様に出来るか確認

emerge linux-firmware

をしないとカーネルの設定だけではドライバが有効にならない場合がある

それ以外に

/etc/wpa_supplicant/wpa_supplicant.conf

/etc/systemd/network/デバイス名.service

を作成しないといけない(#gentooinstallbattle の記事に記載内容)

 

・gitがemerge出来ない

emerge curl

をやり直したら通るようになった。libcurl関連のエラーだとこの対処法っぽい。

 

・startxがしばらく立ち上がらない

タッチパッドを有効にすると反動でstartxがしばらく立ち上がらなくなる

7 urandom warning missed due to rate-limiting

と言うメッセージが出るまで立ち上がらないようだ

対策として、havegedを導入する

emerge haveged

systemctl enable haveged

再起動すればすぐに立ち上がるようになるはず

 

・/dev/kmsg buffer overrunが無限に表示される

これだけ見てもわからないと思いますが,

んでんでーwwにゃんでーwww

って気持ちになります

 ログが無限にながれることでここまでLinuxを使えなく出来るとはと感心すらする

対処法は,カーネル

CONFIG_POWER_SUPPLY_DEBUG

をオフにする