ThinkPad e440 * Manjaro Linux x86_64 XFce 16.06

概要

これまでManjaro Linux KDEを使用してきたThinkPad e440だが、Manjaro Linux XFceに変更した。

e440のOSは安定せず、かなり変更を重ねている。これまで

  • openSUSE
  • Mageia
  • Manjaro XFce
  • PCLinuxOS FullMonty
  • Linux Mint
  • Manjaro LXQt
  • PCLinuxOS KDE
  • Manjaro KDE
  • Manjaro XFce

という流れだ。求められる条件は

  • BIOSでWindowsとのデュアルブートが可能
  • /の暗号化が可能
  • ローリング・リリースあるいは長期運用が可能
  • 先進的
  • RealTek RT8168 無線LANが利用可能

これがなかなか難しい。
ちなみに、Manjaro Linuxも現状、GUIインストーラでWindowsのデュアルブートとLUKSを両立させる場合、MBRの書き換えを防ぐことはできない。

Manjaro Linux KDEとXFceの違い

違わないようで、実は結構違う。

XFceの設定

Manjaroのパッケージ内にXFceに関する設定が不足している。特にKDEでインストールした場合は、XFceに関する設定は全くない。

XFceから新規ユーザーを作った場合は、おおよそ反映されるし、そのためパネルやアプレットが大きく異なるが、Mnajaroのメニューは階層化されていない状態になる。

LXQtとWiFi

KDEでインストールした場合、LXQtはconnmanを使おうとnm-appletを使おうと、D-BusエラーになりWi-Fiを使うことができない。XFceでインストールした場合はnm-appletが問題なく動作する

XDM

KDEはKDM、XFceはLightDMを使う。

KDEアプリの動作

XFceでインストールした場合、Akonadiが正常動作せず、KDEコンポーネントが完全には動かない。

KDEコンポーネントをフルに活用しとたKDE環境を望む場合は素直にKDEでインストールのが良い。

Wi-Fiの挙動

KDEの場合、Wi-Fiがおかしくなり、やがて接続は確立しているのに通信しなくなる。(チップはRT8168)
頻繁に発生し、再接続すれば復帰する場合が多いが、あまり放置しすぎると切断自体不可能になる。

XFceの場合は、その状態が発生しない。

また、mkwd-kernelを使うと、XFceの場合だけrt8168パッケージをインストールするようになっている。KDEの場合はndiswrapperパッケージをインストールする。これは、15.12と16.06の違いもあるのかもしれない。

アップデートアプレット

KDEの場合はOctopiを使うし、アプレットもOctopiのものになっている。

ファーストインプレッション

もちろん、Manjaroということで同じものなのだが、実際には結構な違いがある。

Plasma Workspaceが結構不安定で(ハードウェア的な問題だろう。Manjaroに限らない)、よくKWinが再起動するのだが、安定しており、最初からWi-Fiを利用することができる(速度的には有線のほうが良いが)といったメリットがある。

機能的にはXFceはかなりそろっていて、非常に使いやすい。ただし、Thunarなど一部のXFceアプリはパスを問答模様で補完するため、普通に打っていると勝手に補完されてパスが違っているということがあったりする点はマイナス。
ただ、機能的な不足はないはずだが、実感としてはやはりCinnamonのほうが使い心地は良い。

XFceでインストールすると、KDEコンポーネントを使わない設定となるため(これを変更するのはなかなか大変)、全体に動作が軽く、安定している。e440程度の性能であればこのほうが良いかもしれない。

RT8168

ThinkPad e440に搭載されているのはLinuxでの扱いの難しいRealTek製WiFiチップRT8168だ。

XFceの場合はmhwd-kernelで自動的にこのドライバを含み、適切に動作するが、RT8168にはRT8169ドライバをロードしてしまう、という問題があり、mhwd-kernelによる新カーネルインストール時にもその回避を勧められる。

# echo "blacklist r8169" > /etc/modprobe.d/r8169_blacklist.conf

およその作業記録

# pacman-mirrors -g #ミラーを並び替える
# yaourt -Syuu --noconfirm # アップグレード
# mhwd-kernel -i linux46 # Linux 4.6カーネルのインストール(現在の最新)
# echo "blacklist r8169" > /etc/modprobe.d/r8169_blacklist.conf # RT8169モジュールの無効化
# reboot
$ yaourt -S gvim vi #viがないため、visudoなどが使えない
$ sudo visudo # パスワードタイムアウトの無効化
$ sudo vim /etc/yaourtrc #ビルドディレクトリ、エクスポートディレクトリなどの変更のため
$ yaourt -S medit geany geany-plusings ruby ruby-docs zsh mate-gtk3 qterminal lxqt leafpad #エディタ及び諸環境のインストール
$ yaourt -S mate-extra-gtk3 #一部conflictがあるため、全コンポーネントはインストールできない
$ yaourt -S adobe-source-han-sans-jp-fonts ttf-ohruri ttf-komatuna ttf-meguri ttf-migu ttf-ricty ttf-vlgothic tth-vlkoruri #フォント周り
$ mkdir ~/.config/fontconfig
$ medit !!$/fonts.conf #フォント設定
$ yaourt -S sshfs
$ yaourt -S xf86-input-synaptics #Touchpad Synaptics
$ sudo cp /usr/share/X11/xorg.conf.d/70-synaptics.conf /etc/X11/xorg.conf.d #設定ファイルのコピー
$ sudo vim !!$/70-synaptics.conf # Synapticsの設定
$ yaourt -S vivaldi-snapshot opera-developer chromium google-chrome chromium-widevine #ウェブブラウザ
$ yaourt -S atom-editor-git #Atom。時間がかかる
$ yaourt -S --noconfirm fcitx fcitx-anthy fcitx-mozc-neologd-ut fcitx-kkc fcitx-gtk{2,3} fcitx-qt{4,5} fcitx-m17n fcitx-configtool # IM関連
$ yaourt -S w3m lv #日本語環境向け
$ yaourt -S xorg-server-xephyr # XDMCPリモートログイン
$ yaourt -S claws-mail # メールクライアント
$ chsh #シェルをzshに
$ vim ~/.config/user-dirs.dirs # XDGディレクトリの変更
$ vim ~/.xprofile
$ mkdir bin lib mnt #個人的に必要とするディレクトリ

MDNSの設定などは最初からされている。

Synapticsの設定。2本指スクロールの有効化とナチュラルスクロール化、サーキュラースクローリング(左下起点)の有効化を設定してある。

# Example xorg.conf.d snippet that assigns the touchpad driver
# to all touchpads. See xorg.conf.d(5) for more information on
# InputClass.
# DO NOT EDIT THIS FILE, your distribution will likely overwrite
# it when updating. Copy (and rename) this file into
# /etc/X11/xorg.conf.d first.
# Additional options may be added in the form of
#   Option "OptionName" "value"
#
Section "InputClass"
        Identifier "touchpad catchall"
        Driver "synaptics"
        MatchIsTouchpad "on"
# This option is recommend on all Linux systems using evdev, but cannot be
# enabled by default. See the following link for details:
# http://who-t.blogspot.com/2010/11/how-to-ignore-configuration-errors.html
#       MatchDevicePath "/dev/input/event*"
            Option "VertTwoFingerScroll" "on"
            Option "HorizTwoFingerScroll" "on"
            Option "CircularScrolling" "on"
            Option "CircScrollTrigger" "6"
            Option "VertScrollDelta" "-111"
            Option "HorizScrollDelta" "-111"
EndSection

Section "InputClass"
        Identifier "touchpad ignore duplicates"
        MatchIsTouchpad "on"
        MatchOS "Linux"
        MatchDevicePath "/dev/input/mouse*"
        Option "Ignore" "on"
EndSection

# This option enables the bottom right corner to be a right button on clickpads
# and the right and middle top areas to be right / middle buttons on clickpads
# with a top button area.
# This option is only interpreted by clickpads.
Section "InputClass"
        Identifier "Default clickpad buttons"
        MatchDriver "synaptics"
        Option "SoftButtonAreas" "50% 0 82% 0 0 0 0 0"
        Option "SecondarySoftButtonAreas" "58% 0 0 15% 42% 58% 0 15%"
EndSection

# This option disables software buttons on Apple touchpads.
# This option is only interpreted by clickpads.
Section "InputClass"
        Identifier "Disable clickpad buttons on Apple touchpads"
        MatchProduct "Apple|bcm5974"
        MatchDriver "synaptics"
        Option "SoftButtonAreas" "0 0 0 0 0 0 0 0"
EndSection

fonts.confの設定。

<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
  <match target="pattern">
    <edit name="dpi" mode="assign"><double>103</double></edit>
  </match>
  <match target="font">
    <edit name="hinting" mode="assign">
      <bool>true</bool>
    </edit>
  </match>
  <match target="font">
    <edit name="autohint" mode="assign">
      <bool>true</bool>
    </edit>
  </match>
  <match target="font">
    <edit name="hintstyle" mode="assign">
      <const>hintfull</const>
    </edit>
  </match>
  <match target="font">
    <edit name="rgba" mode="assign">
      <const>rgb</const>
    </edit>
  </match>
 <match target="font">
  <edit name="lcdfilter" mode="assign">
   <const>lcddefault</const>
  </edit>
 </match>
 <match target="pattern">
  <test qual="any" name="family">
   <string>serif</string>
  </test>
  <edit binding="strong" name="family" mode="assign">
   <string>Ohruri</string>
  </edit>
 </match>
 <match target="pattern">
  <test qual="any" name="family">
   <string>sans-serif</string>
  </test>
  <edit binding="strong" name="family" mode="assign">
   <string>VlKoruri</string>
  </edit>
 </match>
 <match target="pattern">
  <test qual="any" name="family">
   <string>sans</string>
  </test>
  <edit binding="strong" name="family" mode="assign">
   <string>VlKoruri</string>
  </edit>
 </match>
 <match target="pattern">
  <test qual="any" name="family">
   <string>monospace</string>
  </test>
  <edit binding="strong" name="family" mode="assign">
   <string>Migu 1M</string>
  </edit>
 </match>
 <match target="pattern">
  <test qual="all" compare="not_eq" name="family">
   <string>sans-serif</string>
  </test>
  <test qual="all" compare="not_eq" name="family">
   <string>serif</string>
  </test>
  <test qual="all" compare="not_eq" name="family">
   <string>monospace</string>
  </test>
  <edit name="family" mode="append_last">
   <string>Migu 1C</string>
  </edit>
 </match>
 <dir>~/.fonts</dir>
</fontconfig>

.xprofile。日本語入力関係ほか

#
# ~/.xprofile
#
# sourced by /etc/lxdm/Xsession
#

if which dbus-launch >/dev/null && test -z "$DBUS_SESSION_BUS_ADDRESS"; then
    eval "$(dbus-launch --sh-syntax --exit-with-session)"
fi

# Environment variables
#
export GTK2_RC_FILES="$HOME/.gtkrc-2.0"
export GTK_IM_MODULE=fcitx
export GTK2_IM_MODULE=fcitx
export GTK3_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS="@im=fcitx"
export DefaultIMModule=fcitx
export PATH=$HOME/bin:$PATH
setxkbmap -model jp106 -layout jp

Quadro2000 + GeForce GTX750Ti with Linuxで5面ディスプレイ

まえがき

Quadro2000は出力ポートを3つ持っているものの、出力は2系統で2面しか出ない。
これが不便すぎたので、GeForce GTX750Tiを導入した。

750Tiは2世代前の性能の低いビデオカードだが、消費電力、発熱量が少なく、補助電源も必要ない。
あまり余裕のない既存システムの拡張は比較的行いやすいカードだ。
2スロットカードだが、GT720にすれば1スロットで接続できる。

750Tiの基本的な出力は、4k1面を含む3ディスプレイ、CRTのものとDFPのものがあるようだ。
また、4k3面を含む4面ディスプレイのモデルも存在する。

性能的にはQuadro2000がFermiチップで実に4世代前なので、2世代前とはいえかなり隔たりがある。
そのため、OpenGL性能の高いQuadroとはいえ、当時の中堅モデルでしかなかったGTX750TiのほうがOpenGLにおいても性能はだいぶ高い。
ビデオエンコーディング作業の時間短縮も狙った。
単にディスプレイの追加だけであれば、最悪2枚同時動作が叶わず交換となったとしても、720で3面出力は可能だが、
750Tiを選択することでその場合でも性能向上が可能となるようにした。

前知識

NVIDIAのマルチグラフィックスといえばSLIだが、これは単なるマルチグラフィックスを意味するものではないらしい。

SLIは、複数のビデオカードをケーブル接続することによって、画面描画を分担するものである。
そのため、画面出力を行うビデオカードは1枚、であるそうだ。

SLIは「複数ビデオカードを同時利用する技術」ではなく、「複数ビデオカードで並列演算する技術」であるという理解でおそらく正しい。
しかし、SLI接続されていない複数のビデオカードで演算する方法としてMulti-GPUも用意されているようだ。

以前はLinuxにおいて複数(場合によっては多数)のビデオカードを使って多数のディスプレイを出す方法としてXineramaがあった。
だが、最新のnvidiaドライバではこれが無効である、との説明がある。
設定方法などもかなり変更があったようで、2014年頃のドキュメントは役に立たない。

それ以外の方法として、TwinViewもあるが、これはあくまでひとつのビデオカードで2面を使う方法であり、それはわざわざ使うほどのものではない。

Base Mosaic及びSLI Mosaicは複数のNVIDIAビデオカードに接続されたディスプレイをひとつのスクリーンにまとめる。
NVIDIAの説明を見る限りはこれはディスプレイの実際の間隔を反映して表示する(ベゼルの幅などで画面と画面の間にある幅や、ディスプレイの角度を理解して3Dグラフィックスを表示する)技術に読めるのだが、少なくともLinuxではマルチディスプレイテクノロジーであるらしい。

うまくいかない

Windowsでは何の苦労もない。ドライバーインストールだけでできた。

ところが、Linuxではうまくいかなかった。Base Mosaicであれ、MultiGPUであれ、この調子だ。

[    19.599] (EE) NVIDIA(GPU-0): Failed to find a valid Base Mosaic configuration.
[    19.599] (EE) NVIDIA(GPU-0): Invalid Base Mosaic configuration 1 of 1:
[    19.599] (EE) NVIDIA(GPU-0): GPUs:
[    19.599] (EE) NVIDIA(GPU-0):     1) NVIDIA GPU at PCI:15:0:0
[    19.599] (EE) NVIDIA(GPU-0):     2) NVIDIA GPU at PCI:40:0:0
[    19.599] (EE) NVIDIA(GPU-0): Errors:
[    19.599] (EE) NVIDIA(GPU-0):     - GPU PCI IDs do not match
[    19.599] (WW) NVIDIA(GPU-0): Failed to find a valid Base Mosaic configuration for the
[    19.599] (WW) NVIDIA(GPU-0):     NVIDIA graphics device PCI:15:0:0. Please see Chapter 28:
[    19.599] (WW) NVIDIA(GPU-0):     Configuring SLI and Multi-GPU FrameRendering in the README
[    19.599] (WW) NVIDIA(GPU-0):     for troubleshooting suggestions.

だいたい

[ 19.599] (EE) NVIDIA(GPU-0): GPUs:
[ 19.599] (EE) NVIDIA(GPU-0): 1) NVIDIA GPU at PCI:15:0:0
[ 19.599] (EE) NVIDIA(GPU-0): 2) NVIDIA GPU at PCI:40:0:0

の意味がわからない。なぜならば

lspci | grep VGA
0f:00.0 VGA compatible controller: NVIDIA Corporation GF106GL [Quadro 2000] (rev a1)
28:00.0 VGA compatible controller: NVIDIA Corporation GM107 [GeForce GTX 750 Ti] (rev a2)

と食い違うし、かといって0f:00:028:00:0を指定するとXが起動しない。
結局ずっとこのあたりでつまずくことになり、解決できなかった。

Manjaroのフォーラムでその苦労が見られたりする。

結局どうもQuadroクラスのカード以外はそもそもNVIDIA Mosaic Technologyに対応しない、ということのようなのだが、MultiGPU

</ins>

暫定的な方法

Xineramaは使えない、という記述があるのだが、実際はそんなことはなかった。
ただし、単にXineramaを使ってしまうと、同じスクリーンにあるディスプレイは1枚とみなされてしまう(つまり、2枚接続されているQuadro2000の部分は3840×1080の1枚のディスプレイということにされてしまう)。
見づらい上に使いにくい。

それぞれのディスプレイを違うスクリーンに割り当てれば大丈夫だが、

  • ものすごく遅い
  • とっても不安定
  • Conkyのウィジットが更新時に点滅する
  • randrによる設定ができない

MultiGPUも使えないことだし、1枚でまかなえる3画面までの話であれば普通にGTX750Ti単独にしたほうがはるかに良いように思える。

また、不安定の内容としてはChromium/Google Chromeなどが特にひどく、

  • ウィンドウ移動時にウィンドウハンドルと1画面以上ずれる
  • ウィンドウラベルをダブルクリックすると右に1画面程度ジャンプする
  • 左側のディスプレイ(GTX750Ti上)に出すとブラックアウトしたりする
  • YouTube再生がしょっちゅう止まる

といった問題が発生する。そのほかにもCinnamonが時々クラッシュしたりもする。
Gtkのウィジットの描画が欠損したりもする。

Chromiumのワークアラウンドとしては、「システムタイトルバーと枠線の使用」を音にすれば改善する。
これはVivaldiでも同様である。

</ins>

問題の根幹

Base Mosaicは対応するidentical(全く同一の) cardでなければならない、ということらしい。

異なるカード間でBase Mosaicを構成することはできず、まだ、

PCI IDs do not match.

でいうIDとは、BusIDのことではなく、Product IDのことであるとのこと。

また、MultiGPUも同様の制限がある(これは調べてもSLIに関することばかりで出てこない)とのこと。

結論

  • hp Z400でGeForce GTX750Tiは動作する
  • Quadro2000とGeForce GTX750Tiは同時に動作する
  • Windowsでは特になにもしなくても(ドライバーアップデートは必要だった)それぞれにつないだディスプレイが出る
  • Linuxの場合、解決方法はXinerama/Base Mosaic/SLI Mosaic
  • Base MosaicあるいはSLI Mosaicはidentical card(完全に同一のカード)でなければならない
  • Xineramaはnvidiaドライバーでサポート外とあるが、不安定ではあるものの動作する
  • 現在最新のnvidia-settingsだと、Base Mosaicが組めない環境ではBase Mosaicの選択肢は出ない
  • 画面数を増やしたいだけであればカードを増やすのは有効。処理性能は増えない
  • SLIする場合はSLIケーブル/ブリッジでカードを接続する必要がある
  • SLIであれMultiGPUであれ、複数カードによるアクセラレーションはidentical cardsである必要がある
  • ffmpegはプライマリであれセカンダリであれ、設定なしに性能の高いGTX750Tiをエンコードに使用した
  • OpenGLやエンコーディング性能でも、Quadro2000よりもGeForce GTX750Tiのほうがはるかに速い

</ins>

Gitで共同作業を行うための備忘録

結構問題が多くて苦労したので、記録しておく。

なお、sshを利用した認証。

まずベアリポジトリをsharedで行う。

git init --bare --shared /path/to/repos.git

この場合、/path/to/はグローバルにアクセス可能でないと、リポジトリにアクセスできない。

この/path/to/repos.gitがいわばマスターリポジトリとなる。各開発者はこれをクローンする。

git clone ssh://localhost/path/to/repos

ここが非常に重要。もしsshではなくファイルを直接クローンしてしまうと、スティッキービットを立てていても不適正なパーミッションが設定され、取り扱えなくなってしまう。
そのため、例えローカルなファイルであっても、共有する場合はSSH経由にしないとうまくいかない。

また、忘れがちなので。最初にpushする時だけ

git push origin master

しておかないといけない。だいたいがgit pushgit pullだけでこなすため、同じエラーが出て戸惑うことになる。