Gentoo Linuxでのrubyのバージョン管理について
少し前の記事
と関連した話です。
・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だし、どうでもええわ
と思いましたが、GentooとUbuntuのmikutterの比較で使うために環境は整えてる状態なのでまた1からやり直すのは面倒だということで、Ubuntuを復旧させることにしました。
元々レガシーなgrub.confの時代にWindowsとGentooのデュアルブートをしていたので、そのときのやり方ならわかるのですが今の時代は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での電源管理
・電源管理
GentooでGUI環境を導入してもたいがいの場合電源管理のメニューが正常に動作しない。
現状,最も無難なやり方としては,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テザリングを有効にする
・カーネル
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ファイルを
に置き換える(または名前を変えたものをもう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と同様に出来るか確認
をしないとカーネルの設定だけではドライバが有効にならない場合がある
それ以外に
/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
をオフにする
Gentooで絵文字を表示させる
パッケージ名だけの話ですが
emerge symbola
emerge noto
emerge noto-cjk(多いので要らんかも)
このあたりを