平山::Ubuntu Linux 16.04 64ビット版

このページは、Ubuntu Linux 16.04 64ビット版に関する個人的なメモです。

私が自分のパソコンでUbuntuを使っているため、 ソフトのインストールの記録などをメモしています。 教育用計算機システムの端末に使われているOSもUbuntu Linuxです(ただしバージョンは異なります)ので、教育用計算機システムを使ったり、システム管理したりするときにも、このメモは役に立つかもしれません。 なお、このメモは、あくまで自分のパソコンに関するメモですので、 教育用計算機システムの話ではありません。 私は、教育用計算機システムの管理者ではありません。

現在の情報

これまで私はUbuntu 14.04LTSを使ってきて、16.04LTSにアップグレードした。 そのため、ほとんどの設定は14.04のものを引き継いでいる。 14.04の話は、平山::Ubuntu Linux 14.04 64ビット版を参照して欲しい。 下記では、新たに変更した点について記載する。

ハードウェア構成

CPU
Intel Core i7
メモリ
32GB
グラフィックカード
AMD RADEON R9 380X
SSD/HDD
SSD Plextor M3Pro 128GB * 1個 (OS用), LSI MegaRAID SAS 9265-8i RAID 6 実容量680GB (ホームディレクトリとVMware用), HDD * 2個(バックアップ用)

デバイスドライバの関係で、Ubuntu 16.04でRADEONのグラフィックカードを使いたいときには、サポートされている比較的新しいカードを使う必要があるので、カードを新調した。

キーバインド変更の方法を、xmodmapからxkbに乗り換えた。

Fcitxがxmodmapの設定を書き換えてしまうので、すでに廃止状態のxmodmapは捨てて、xkbに乗り換えることにした。

下記のページを参考に、いろいろやってみたが、ユーザ側の設定では、入力メソッドを切り替えると元に戻ってしまう。??

参考URL:

Fcitxの設定をしても、意図したように動作してくれないようだ。 現バージョンのFcitxの動作がおかしいのかもしれない。 (20171108追記: ここの情報によると、gsettingsでこの挙動を直せるかもしれません。いつか試してみよう。)

仕方がないので、禁断のシステム側のファイルをいじることにした。

参考URL:

いじるファイルは/usr/share/X11/xkb/symbols/inet。 バックアップをとっておく。

% cd /usr/share/X11/xkb/symbols/
% sudo cp inet inet.org

「xkb_symbols "evdev" {」から下の設定を変える。

% diff inet.org inet
107,109c107,119
<     key <HKTG>   {      [ Hiragana_Katakana     ]       };
<     key <HENK>   {      [ Henkan                ]       };
<     key <MUHE>   {      [ Muhenkan              ]       };
---
> //    key <HKTG>   {      [ Hiragana_Katakana     ]       };
> //    key <HENK>   {      [ Henkan                ]       };
> //    key <MUHE>   {      [ Muhenkan              ]       };
>     key <CAPS> { [ Control_L, Control_L ] }; // Caps_Lock
>     key <MUHE> { [ Shift_L ] }; // Muhenkan
>     key <HENK> { [ Control_L, Control_L ] }; // Henkan_Mode
>     key <HKTG> { [ BackSpace ] }; // Hiragana-Katakana
>     key <RALT> { [ Henkan_Mode, Henkan_Mode ] }; // Alt_R
>     key <COMP> { [ NoSymbol ] }; // Menu
>     key <RCTL> { [ Muhenkan ] }; // Control_R
>     key <AB11> { [ underscore, underscore ] }; // backslash underscore
>     modifier_map Control { <HENK>, <CAPS> };
>

};
----

xkbの代わりに、xremapを使うとよいのかもしれない。 今後の候補。

次のUbuntuのアップグレードのときには、ユーザ側の設定のみで動くようになることを期待して、ユーザ側の設定で対処する方法を下記にメモしておく(16.04LTSでは、入力メソッドを切り替えると元に戻ってしまい、うまくいかなかった)。

ディレクトリを作る。

% cd ~
% mkdir .xkb
% mkdir .xkb/keymap
% mkdir .xkb/symbols

~/.xkb/symbols/my_keymap_at109jpというファイルを作り、内容を下記のようにする。

partial modifier_keys
xkb_symbols "my_keys" {
  replace key <CAPS> { [ Control_L, Control_L ] }; // Caps_Lock
  replace key <MUHE> { [ Shift_L ] }; // Muhenkan
  replace key <HENK> { [ Control_L, Control_L ] }; // Henkan_Mode
  replace key <HKTG> { [ BackSpace ] }; // Hiragana-Katakana
  replace key <RALT> { [ Henkan_Mode, Henkan_Mode ] }; // Alt_R
  replace key <COMP> { [ NoSymbol ] }; // Menu
  replace key <RCTL> { [ Muhenkan ] }; // Control_R
  replace key <AB11> { [ underscore, underscore ] }; // backslash underscore
  modifier_map Control { <HENK>, <CAPS> };
};

「setxkbmap -print」の実行結果を、~/.xkb/keymap/my_kbdに入れて、 xkb_symbolsの行に「+my_keymap_at109jp(my_keys)」を追加する。

xkb_keymap {
	xkb_keycodes  { include "evdev+aliases(qwerty)"	};
	xkb_types     { include "complete"	};
	xkb_compat    { include "complete"	};
	xkb_symbols   { include "pc+jp+us:2+inet(evdev)+my_keymap_at109jp(my_keys)"	};
	xkb_geometry  { include "pc(pc105)"	};
};

あとは、ログイン時に下記のコマンドを実行すればよいはずなのだが、 入力メソッドを切り替えると元に戻ってしまう。??

xkbcomp -I$HOME/.xkb ~/.xkb/keymap/my_kbd $DISPLAY

fasdとzsh-autosuggestions

Zsh標準の予測候補機能がいまいち使いにくいので、代わりのものを探して、 fasdとzsh-autosuggestionsを入れることにした。

zsh-autosuggestions

GitHubのオフィシャルページから手動でインストールする。

.zshrcファイルのZsh標準の予測候補機能の設定を無効にしたうえで、 以下の設定を.zshrcに追加する。

### Enabling zsh-autosuggestions
### This was installed from GitHub manually.
source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=5' # Color ID (0-7?) for suggestion. The number of colors supported by the terminal may be tested by the command 'echotc Co'.
bindkey '\Cj' autosuggest-execute # Accepts and executes the current suggestion by crtl-enter. (It seems like \Cj = \C\n)

zsh-autosuggestionsが提示する予測候補で確定したいときには、C-j(C-Enterでもよい)する設定をしている。

fasd

Ubuntu標準パッケージにはないが、GitHubのオフィシャルページにPPAを追加する方法が載っていたので、それに従ってインストールした。

sudo add-apt-repository ppa:aacebedo/fasd
sudo apt-get update
sudo apt-get install fasd

以下の設定を.zshrcに追加する。

### Enabling fasd for quick access to files and directories.
### This was installed from GitHub manually.
eval "$(fasd --init auto)"

fasdのzコマンドが超便利。cdの代わりのコマンドだが、ディレクトリ名の一部を指定すれば、最近アクセスしたそれらしいディレクトリにcdしてくれる。

透過的なHugePagesの無効化

VMware, Opera, LibreOfficeを使用すると、ある程度の時間(10秒から30秒程度)、異様に動作が重くなることが頻繁に発生する。 topで見てみると、khugepagedというプロセスがCPU使用率を食っている。 どうやら、透過的なHugePages(transparent hugepages)の仕業らしい。

HugePagesは、大容量メモリを消費するアプリケーションのメモリ管理を効率よくするために、従来よりも大きなサイズのページを使う仕組み。 「透過的な」HugePagesは、動的に大きなサイズのページを使うようにするための機能らしいが、実行中にメモリー割当ての遅延が生じる欠点があるらしい。 具体的には、標準の4Kbのページを大きなサイズのページに変換(defrag)していて動作が重くなるらしい。 例えば、Hadoopでは、透過的なHugePagesによりパフォーマンス低下が発生することが報告されている。

Oracleデータベースでは透過的なHugePagesは非推奨となっている。

これらの状況から、透過的なHugePagesを無効にすることにした。

まずは、現在の設定を確認する。 alwaysが角括弧で囲まれているので、有効になっている。

% cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
% cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never

透過的なHugePagesを無効化する。 上記のファイルの中身を書き換えれば、一時的には効果があるが、再起動すると元に戻ることに注意。 永続的に無効にするには、起動ファイルを修正する必要がある。 ネットを検索すると、様々な方法が見つかる。が、試してみても効果がないものばかり。

  • hugeadmコマンドによる設定: 一時的なもの。再起動すると共に戻る。
  • sysfs.confに設定: そのようなファイルはない。新規に作っても効果なし。よく似た名前のsysctl.confに設定しても無駄だった。
  • grubの設定を変更する方法: RedHat系の話のようで、Ubuntuとはファイル構成が異なるみたい。
  • rc.localに設定する: すべてのサービスが起動した後に、rc.localが読まれるという順なので、すでに起動したサービスは修正されない。

うまくいった方法は、下記。 Ubuntu 16.04(15.04以降)は、起動システムがsystemdになったので、それに沿った方法にしないといけないようだ。

参考URL:

/etc/systemd/system/disable_transparent_huge_pages.service というファイルを新規に作り、内容を下記にする。

[Unit]
Description = Disable transparent huge pages

[Service]
Type = oneshot
User = root

ExecStart = /bin/sh -c "/bin/echo never | /usr/bin/tee /sys/kernel/mm/transparent_hugepage/enabled"
ExecStart = /bin/sh -c "/bin/echo never | /usr/bin/tee /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy = multi-user.target

これをOS起動時に読むように設定する。

% sudo systemctl enable disable_transparent_huge_pages.service

再起動後に、設定を確認する。うまく無効になった。

% cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
% cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

しばらくこれで使ってみたところ、快調になった。

TerminalのControl-Tabの扱い

ふと気がついたことだが、gnome-terminalやxtermなどのTerminalは、Control-Tabをforwardしないようだ。 単なるTabにしてしまっている。 そのため、Terminal版EmacsやByobuなどではControl-Tabのキーバインドを使えない。 ByobuにControl-Tabのキーバインドを設定しても動かなかったのはこのためだった。 残念だ。 forwardしないものの、一応、gnome-terminalはControl-Tabを認識はしており、gnome-terminalの機能を呼び出すためのキーバインドとしてControl-Tabを設定することはできる。 例えば、gnome-terminalのタブを切り替えるキーバインドをControl-Tabに設定することができる。 設定するコマンド例は下記。出典は、https://askubuntu.com/questions/133384/keyboard-shortcut-gnome-terminal-ctrl-tab-and-ctrl-shift-tab-in-12-04

gsettings set org.gnome.Terminal.Legacy.Keybindings:/org/gnome/terminal/legacy/keybindings/ next-tab '<Primary>Tab'

Mewでメール本文を検索

Mewは基本機能として、grepによるメール検索ができるが、検索対象がSubjectやToなどのヘッダフィールドに限られており、メール本文を検索することができない。 メール本文を検索するには、拡張機能のHyper Estraierを使うと良い。 (Mewのマニュアルにある、「日本語の全文検索をしたい場合は、"mg" をインストール」という話は古いので、mgは使わないこと。) Ubuntuの場合、hyperestraierパッケージをインストールすれば、依存するものもすべて入る。 その後、初めて検索する前に、mewestコマンドを実行して検索用インデックスを作る。Mew側の設定は特にない。 Mewのマニュアルに「検索エンジンの初期値は、最初に見つかった利用できるものに自動的に設定されます。」となっているため。 なお、検索用インデックスは自動更新されないので、ユーザ権限のcronで毎時間mewestコマンドを実行することにする。 検索方法は、Mewのマニュアルにあるが、私がよく使うものは下記。

  • 「C-u k /」: フォルダを指定して、その中のメールを検索する。
  • 「k /」: すべてのメールを検索する。

試したところ、ISO-2022-JPのプレーンテキストのメールだけでなく、Base64エンコードされたUTF8メールでも、quoted-printableのメールでもちゃんと検索できた。 しかも検索が速い。私の持っている10万通以上のメールの中から、体感的にはさくっと検索結果が出る。すばらしい。

+trashフォルダの検索

しばらく使って気がついたこと。+trashフォルダのメールが検索できない。 変だなと思って、mewestスクリプトを見てみたところ、検索用インデックス作成において、trashが除外されてた。 私は+trashフォルダも検索してほしいので、mewestを書き換えて対応した。 私は、日々わんさか来る業務メールをチラ見して、自分に関係なさそうなものはどんどん+trashフォルダに放り込んでいき、後で必要になったら検索すればいいや、というスタイルで運用しているので、+trashフォルダも検索したい。

mewest変更点: trashの代わりに、spamを除外することにした。

% diff -u mewest.org mewest
--- mewest.org	2017-11-09 17:12:53.998714092 +0900
+++ mewest	2017-11-09 17:16:58.722670511 +0900
@@ -160,7 +160,7 @@
 # "[0-9]*" matches both "123" and "234.mew".

 ${FIND} "`path_conv \"${TGTDIR}\"`" \
-  -type d -name "trash" -prune -o \
+  -type d -name "spam" -prune -o \
   -type d -name ${INDEXDIR_ORG} -prune -o \
   -type d -name ${INDEXDIR_REPLICA} -prune -o \
   -type f \( -name "[0-9]" -o -name "[0-9]*[0-9]" -o -name "[0-9]*${SUFFIX}" \) -print |\

Mewの対話

Mewには対話という機能がある。 これを利用するには、下記のパッケージをインストールする。

  • sqlite3
  • ruby-sqlite3

対話用インデックスを作るコマンドはcmew。対話用インデックスは自動更新されないので、ユーザ権限のcronで毎時間cmewコマンドを実行することにする。

max_map_countの設定変更

sbclがメモリ不足で落ちた。 ハッシュテーブルを大量に消費するCommon Lispプログラムを走らせたときのことである。 解(げ)せないのは、メモリにかなり余裕が残っているように見える状態なのに、メモリ不足で落ちたことだ。

私のPCは32GBのメモリを搭載しているので、 「sbcl --dynamic-space-size 32000」にして実行したのに、 メモリの半分程度16GBくらいまで使ったところで、下記のエラーを出して落ちた。 どうやら、「max_map_count」の制限に引っかかったらしい。

 fatal error encountered in SBCL pid 10833(tid 140737353959168):
 An mprotect call failed with ENOMEM. This probably means that the maximum amount
 of separate memory mappings was exceeded. To fix the problem, either increase
 the maximum with e.g. 'echo 262144 > /proc/sys/vm/max_map_count' or recompile
 SBCL with a larger value for GENCGC-CARD-BYTES in
 'src/compiler/target/backend-parms.lisp'.

max_map_countのオフィシャルの説明は、カーネルソースのドキュメントが確実。

max_map_countのデフォルト値は65536だが、これでは足りないらしい。

現在の設定値の確認方法:

% cat /proc/sys/vm/max_map_count
65536

もしくは、

% sudo sysctl -n vm.max_map_count
65536

とりあえず、この16倍にしてやれば十分だろう、ということで、1048576に設定を変更する。

設定を変更する方法は、ネットを検索すればすぐに見つかる。 例えば、一時的に変更するには、下記。

% sudo sysctl -w vm.max_map_count=1048576

永続的に変更するには、/etc/sysctl.confに記載すればよい。 これに準じた方法として、私は、/etc/sysctl.d/60-ease-memory-restrictions.conf というファイルを作り、その中に下記の設定を記載した。

# The default value is 65536.
vm.max_map_count = 1048576

このファイルは、マシンが起動時に読み込まれて、設定される。

Last modified:2020/04/24 11:12:34
Keyword(s):
References:[hirayama]