highlight.xcode

2021年6月7日月曜日

Debian stretch で zswap を有効化



運用中の Debian stretch が、たまにスワップアウトを起こし、動作が遅くなってしまう事があるのですが、事情が有ってメモリを増やす事も出来ないので、zswap を試してみる事にしました。

zswap とは、実メモリの一部をスワップ領域として使用する機能です。また、メモリ上のスワップ領域は圧縮されるので、圧縮に使用される CPU パワーと引き換えに、スワップアウトしづらくなる、といった機能です。

Debian stretch ではカーネルパラメータとして指定する事で、zswap 機能が有効となったカーネルイメージを使用するようになります。


"/etc/default/grub"ファイルを編集し、"zswap.enabled=1"というパラメータを追加します。
(省略)
GRUB_CMDLINE_LINUX_DEFAULT="quiet zswap.enabled=1"
(省略)

パラメータを追加したら保存し、grub を更新します。
# update-grub
(省略)

これで再起動を行うと、zswap 機能が有効となったカーネルイメージが使用される様になります。


再起動したら、一応確認します。
# dmesg | grep zswap
[    0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-15-686-pae root=UUID=69f4b940-3ffc-43b8-91d7-0ea0d831470f ro quiet ipv6.disable=1 zswap.enabled=1
[    1.191044] zswap: loaded using pool lzo/zbud

無事 zswap がロードされている様です。

2021年5月31日月曜日

nginx の「Too many open files」エラーの対処



Debian buster 上の nginx の設定を煮詰め直すのに色々と調べた時のメモ。

nginx と言えばC10K問題の解決、を目的の 1つとして開発された I/O 特化型の Web サーバーです。しかし、当然の事ですが OS 等による制約は超えられない訳で、その制約の内の 1つが、ファイルディスクリプタの制限(扱えるファイル数の上限)です。

そしてそのファイルディスクリプタの制限についての設定は、nginx をユーザプロセスとして実行しているか、デーモンプロセスとして実行しているかにより異なります。今回、色々と調べていたら、その辺を混同して解説している情報が多かったので、整理の上メモっておきます。


まずは結論から。
  1. OS(Debian buster)自体の制限を設定。
  2. ユーザープロセスとして実行している場合は、実行ユーザーの制限を設定。
  3. デーモンプロセスとして実行している場合は、デーモンの制限を設定。
  4. nginx の制限を設定。
至極当たり前の事しか書いてない気もしますが、整理が目的なので…。ユーザープロセスとして実行する場合は 2を、デーモンプロセスとして実行する場合は 3を行います。


OS(Debian buster)自体の制限値を確認するには、以下のコマンドを実行します。
# cat /proc/sys/fs/file-max
9223372036854775807
なかなか恐ろしい数値が返ってきましたが、多分、全開って事なんだと思います。

OS(Debian buster)自体の制限を設定する方法は、"/etc/sysctl.conf"に設定を追加するだけ。ファイルを開き、最終行の下へ以下を追加します。
(省略)
# Limit of file descriptor
fs.file-max = 2147483647
再起動で反映されます。


ユーザープロセスとして実行する場合の設定です。

ユーザープロセスの制限値を確認するには、以下のコマンドを実行します。
$ ulimit -n
1024
ソフトリミット(ユーザーが設定可能な値の現在値)を確認するには、以下のコマンドを実行します。
$ ulimit -Sn
1024
ソフトリミットを設定するには、以下のコマンドを実行します。この値はハードリミットの値までが設定可能です。
$ ulimit -Sn 2048
$ ulimit -Sn
2048
ハードリミット(ユーザーが設定可能な値の上限値)を確認するには、以下のコマンドを実行します。
$ ulimit -Hn
1048576
ハードリミットを設定するには、以下のコマンドを実行します。が、一般ユーザは減らす事しか出来ないので、実際には実行してはいけません。ハードリミットの上限を増やしたい場合は、スーパーユーザーで設定を行います。
$ ulimit -Hn 2048
$ ulimit -Hn
2048
各ユーザーのハードリミット(ソフトリミットも)を設定するには、スーパーユーザーで"/etc/security/limits.conf"ファイルを開き、ファイル下部に以下の様に記述します。"item"の"nofile"がファイルディスクリプタの上限です。
(省略)
#<domain>      <type>  <item>         <value>
user            hard   nofile         32768
user            soft   nofile         1024
ユーザーのログイン時に適用される為、設定したユーザーをログインし直せば反映されます。


デーモンプロセスとして実行する場合の設定です。

デーモンプロセスの制限値を確認するには、以下のコマンドを実行します(nginx の場合)。
# grep "open files" /proc/`pidof -s nginx`/limits
Max open files            1024                 524288               files
デーモンプロセスの制限値を設定するには、systemd の設定ファイルへ記述します。Debian buster の場合は"/etc/systemd/system/nginx.service.d"ディレクトリ以下の"*.conf"ファイルです。ディレクトリ、及び設定ファイルが既存する場合は、その内容を確認して下さい。ディレクトリや設定ファイルが存在しない場合は、新規に作成します。
# mkdir /etc/systemd/system/nginx.service.d
# touch /etc/systemd/system/nginx.service.d/override.conf
"/etc/systemd/system/nginx.service.d/override.conf"を開き、以下の様に記述します。
[Service]
LimitNOFILE=65536


nginx 側の設定を行います。"/etc/nginx/nginx.conf"を開き、以下の様に追加します。追加箇所はトップレベルです。ここではワーカープロセスの数を 2つ、ワーカープロセス当たりの制限値に 32768 を指定しています。
worker_processes 2;
worker_rlimit_nofile 32768;
nginx を再起動し、設定を確認します。
# systemctl daemon-reload
# systemctl restart nginx
# grep "open files" /proc/`pidof -s nginx`/limits
Max open files            32768                32768                files
# ps aux | grep nginx | grep -v grep
root      8515  0.0  0.0  68724  1764 ?        Ss   15:59   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data  8516  0.0  0.2  69384  5900 ?        S    15:59   0:00 nginx: worker process
www-data  8517  0.0  0.2  69384  5900 ?        S    15:59   0:00 nginx: worker process
ワーカープロセスの制限値が 32768、マスタープロセスが 1つ、ワーカープロセスが 2つ実行されている事が確認できます。

2018年11月11日日曜日

Debian stretch もしかして腐ってる? 代理マシン編 その2 (x11vnc)



以前TOSHIBA dynabook EX/35LWHKS」というラップトップ PC に、Debian stretch をインストールしたんですが、ラップトップ PC を広げっぱなしにしておくのも邪魔なので、VNC サーバーをインストールし、メイン PC から遠隔操作する事にしました。

普通に Linux に VNC サーバーをインストールすると、VNC クライアントから接続する度に新たなセッションが作られる様になります。それはそれで Linux らしい仕様で良いんですが、今回は既存のセッションを利用する形で運用できないかと思い、色々調べたてみました。どうやら可能みたいです。

x11vnc という VNC サーバーを使用すると、既存のセッションに対して接続出来る様です。x11vnc の基本的な情報は「DebianでX11VNCをインストールする – OSS情報システム研究会」を参考にさせてもらいました。


x11vnc をインストール、パスワードの設定、起動してみます。
# aptitude install x11vnc
(省略)

# x11vnc -storepasswd

Enter VNC password:[パスワード]
Verify password:[パスワード]
Write password to /root/.vnc/passwd? [y]/n
Password written to: /root/.vnc/passwd

# x11vnc -rfbauth /root/.vnc/passwd
VNC クライアントとしては Windows 版 UltraVNC Viewer を使用し、色々試してみました。

が…、またしても腐っていた訳です…。
Debian stretch の x11vnc が…。

イントールされたバージョンは "0.9.13-2" でした。主な問題は次の様なものです。
  1. たまにクラッシュする。
  2. 一部のキーが無限にリピートする。
  3. Shift + TAB入力時に Shift が無視され、TAB のみ入力される。
他にも問題は有るかもしれません…。


取り合えずネットで検索した所「新しいバージョンを使え」という事の様で…。 ご丁寧にスクリプトも公開されていたので、それを参考に、ダウンロード、ビルドを行いました。インストールしたバージョンは "0.9.14" です。

Debian の場合、libxtst-dev、libssl-dev、libjpeg-dev が必要みたいですが、私の環境では libxtst-dev はインストール済みだったので下記では省略しています。
# aptitude install libssl-dev
(省略)
# aptitude install libjpeg-dev
(省略)
# cd /usr/src

# wget http://x11vnc.sourceforge.net/dev/x11vnc-0.9.14-dev.tar.gz
(省略)
# gzip -dc x11vnc-0.9.14-dev.tar.gz | tar -xvf -
(省略)
# cd x11vnc-0.9.14

# ./configure --prefix=/usr/local CFLAGS='-g -O2 -fno-stack-protector -Wall'
(省略)
# make
(省略)
# make install
(省略)
# /usr/local/bin/x11vnc -auth /var/run/lightdm/root/:0 -display :0 -xkb -forever -shared -rfbport 5900 -repeat
しばらく使ってみたんですが、少なくともクラッシュする事はなくなりました。ただし、「キーの無限リピート」や「Shift + TAB が使えない」といった症状はそのままでした。


APT でのパッケージの更新を止めて置かないと、自ビルドしたバイナリを上書きされてしまいますので、このまま使い続ける場合は、x11vnc の更新を停止しておきます。

パッケージの更新停止。
# aptitude hold x11vnc
# aptitude hold x11vnc-dat
パッケージの更新停止を解除する場合。
# aptitude unhold x11vnc
# aptitude unhold x11vnc-dat


「Shift + TAB が使えない」については、解決方法が見つかったので、対処しました。
# vi /usr/share/X11/xkb/symbols/pc
変更前。
key   {  [ Tab,  ISO_Left_Tab    ]   };
変更後。
key   {  [ Tab                   ]   };
これで X の再起動、または PC の再起動で改善されるはずです。


次に、サービス化です。VNC サーバーをサービス化する事により、グラフィカルログイン画面に対しても接続可能とする方法が「debian - Creating x11vnc system service - Unix & Linux Stack Exchange」に、そのままズバリ載っていたので、これも設定します。

vnc.service ファイルを編集(作成)。
# vi /lib/systemd/system/vnc.service
vnc.service ファイルの内容。
[Unit]
Description=Start x11vnc at startup.
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/local/bin/x11vnc -auth guess -forever -loop -noxdamage -repeat -rfbauth /root/.vnc/passwd -rfbport 5900 -shared -remap Zenkaku-Zenkaku_Hankaku,Hankaku-Zenkaku_Hankaku

[Install]
WantedBy=multi-user.target
サービスの有効化、およびリロード。
sudo systemctl enable vnc.service
sudo systemctl daemon-reload
これで、PC を起動直後のグラフィカルログイン画面の状態に対し、VNC ビューワーから接続出来る様になります。

注意が必要なのは、vnc.service ファイルの内容のうち、x11vnc のオプションについては環境により調整が必要だと思います。特にキー関連のイベントの扱いが、使用する VNC ビューワーにより異なるので、思わぬ挙動をする場合もあるようです。


最後に「キーの無限リピート」の対処方、というより誤魔化し方です。

無限リピートが始まったら他のキーを押す事で、リピート自体は止められます。今の所、解決策が見つかっていないので、こんな使い方で誤魔化すしかないでしょう。

私の環境では「半角/全角」キーが 100% リピートするので、「半角/全角」キーを押したら、すぐに「Esc」を押すことでリピートを止めています。

2018年10月26日金曜日

Java 6 の TLS 1.2 対応



いまだに Java 6 使ってます、はい…。
移行しなければならないのは重々承知しています、はい…。

そんな中、HTTPS のセキュリティプロトコルを TLS 1.2 に移行するサイトが増え、TLS 1.2 に未対応の Java 6 ではスクレイピング出来なくなって困っていました。色々と検索した所、暗号化ライブラリを導入すると Java 6 でも TLS 1.2 に対応する事が可能な様です。

また、Let's Encrypt といった新しめの認証局のサーバー証明書も、 Java 6 では対応出来ていないので、それらも導入します。

お品書き。
  1. Bouncy Castle という暗号化ライブラリを導入します。
    ライセンスは Apache Software License, Version 1.1. の様です。
  2. Bouncy Castle を利用して SSL 通信を行う SSLSocketFactory の実装クラス TLSSocketFactory、および関連クラスを導入します。
    ライセンスは MIT X11 License の様です。
  3. 有志作成のスクリプトを参考にし、Let's Encrypt のサーバー証明書を導入します。
    Windows 版 bat ファイル(証明書ファイル付き)、Linux 版 sh ファイル(証明書ファイルダウンロード)を参考にしました。
  4. Let's Encrypt の中間認証局のサーバー証明書を導入します。
    IdenTrust DST Root および、ISRG Root です。
「2.」の Bouncy Castle を利用するクラスについては、別のクラスについて日本語で発信している方が何人かいらっしゃったのですが、私の環境ではことごとく機能しませんでした。細かくは検証していないので原因は不明ですが…。

「4.」の中間認証局のサーバー証明書については、ネットの情報ではどうしてもうまく機能せず、最終手段として Java 8 のキーストアからサーバー証明書を抜いてきて、java 6 のキーストアに突っ込む、とい強引な方法をとっています。

まあ、自己責任ですね…。


Bouncy Castle をプロジェクトへ導入します。
  1. Bouncy Castle の jar ファイルをダウンロードします。
    Latest Releases からダウンロードできます。
    今回私が使用したのは bcprov-jdk15on-160.jar です。
  2. 上記 jar ファイルをプロジェクトのライブラリとして追加します。
  3. また、実行環境のクラスパスにも上記 jar ファイルを追加します。


SSLSocketFactory の実装クラス TLSSocketFactory、および関連クラスを導入します。

TLSSocketFactory からダウンロードするなり、クローンするなり、コピペするなりし、プロジェクトへ 5つのクラスを追加します。
  1. メインとなるクラス TLSSocketFactory
    javax.net.ssl.SSLSocketFactory 抽象クラスの実装クラスです。
  2. 関連クラスTLSAuthentication
    org.bouncycastle.crypto.tls.TlsAuthentication インターフェイスの実装クラスです。
  3. 関連クラス TLSClient
    org.bouncycastle.crypto.tls.DefaultTlsClient 抽象クラスの実装クラスです。
  4. 関連クラス TLSSession
    javax.net.ssl.SSLSession インターフェイスの実装クラスです。
  5. こっちの方がメインとなるクラスとも言える TLSSocket
    javax.net.ssl.SSLSocket 抽象クラスの実装クラスです。
基本的にコードの質は良くないです…。インデントがタブ、スペース混じりだったり、コメントが英語だったり、日本語だったり、無かったり…。API コメントはほぼ無い…。

とりあえずインデントが崩れてるのは、スペース 4つをタブ 1つに置換するか、逆にタブ 1つをスペース 4つに置換すれば揃います…。

あと、1 箇所問題が有って、仮対応として修正しました。

TLSSession クラスのオーバーライドメソッド getLocalPrincipal() が未実装なんですが、このメソッドが呼ばれた場合に、未実装であることを表す UnsupportedOperationException をスローしているので、例外でコケてしまいます。

これを null を返す様にすると、一応は動作する様になります。ただし、これは仮対応なので、本来は正しく実装しないと問題が起きる場合が有ると思います。調査が追いついていませんが、Google が化けるのはこれが原因かなぁ…。

TLSSession # getLocalPrincipal() メソッド。
 @Override
 public Principal getLocalPrincipal()
 {
//	throw new UnsupportedOperationException();
	return null;
 }


Let's Encrypt のサーバー証明書を導入します。

サーバー証明書へのリンクや、サーバー証明書についての説明は Let's Encrypt Chain of Trust に有るんですが、Java のキーストアへインポート出来る der ファイルへのリンクが無いっていうね…。

私は有志作成のスクリプト import-letsencrypt-java.sh を参考にし、Let's Encrypt のサーバー証明書 4つのみインポートするスクリプトを書きました。

私の場合は Java 開発環境をインストールしない派(置いておくだけ)、環境変数 JAVA_HOME を使わない派(パスはスクリプト等で自己管理)なので、実際には、ディレクトリ等を直に指定したり、ダウンロードしたファイルを残しておいたり、ログファイルを出力する等、大幅に書き直しました。が、そんなスクリプトは参考にならないと思うので、オリジナルの一部をコメントアウトしたコードを参考までに載せておきます。

オリジナル からの変更点は、letsencryptauthorityx1.der および、letsencryptauthorityx2.der をダウンロード、インポート、削除しない様にコメントアウトしただけです。

Let's Encrypt のサーバー証明書をインポートする参考コード。
#!/bin/bash -e
# JAVA_HOME can be passed as argument if not set
if [ ! -d $JAVA_HOME ]; then
 JAVA_HOME=${1}
fi

KEYSTORE=$JAVA_HOME/jre/lib/security/cacerts
if [ ! -f "$KEYSTORE" ]; then
 echo "Keystore not found in '$KEYSTORE'"
 exit 1
fi
cp $KEYSTORE $KEYSTORE.`date +"%Y%m%d%H%m%S"`

#wget https://letsencrypt.org/certs/letsencryptauthorityx1.der
#wget https://letsencrypt.org/certs/letsencryptauthorityx2.der
wget https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.der
wget https://letsencrypt.org/certs/lets-encrypt-x2-cross-signed.der
wget https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.der
wget https://letsencrypt.org/certs/lets-encrypt-x4-cross-signed.der

# to be idempotent
#keytool -delete -alias isrgrootx1 -keystore $KEYSTORE -storepass changeit 2> /dev/null || true
#keytool -delete -alias isrgrootx2 -keystore $KEYSTORE -storepass changeit 2> /dev/null || true
keytool -delete -alias letsencryptauthorityx1 -keystore $KEYSTORE -storepass changeit 2> /dev/null || true
keytool -delete -alias letsencryptauthorityx2 -keystore $KEYSTORE -storepass changeit 2> /dev/null || true
keytool -delete -alias letsencryptauthorityx3 -keystore $KEYSTORE -storepass changeit 2> /dev/null || true
keytool -delete -alias letsencryptauthorityx4 -keystore $KEYSTORE -storepass changeit 2> /dev/null || true

#keytool -trustcacerts -keystore $KEYSTORE -storepass changeit -noprompt -importcert -alias isrgrootx1 -file letsencryptauthorityx1.der
#keytool -trustcacerts -keystore $KEYSTORE -storepass changeit -noprompt -importcert -alias isrgrootx2 -file letsencryptauthorityx2.der
keytool -trustcacerts -keystore $KEYSTORE -storepass changeit -noprompt -importcert -alias letsencryptauthorityx1 -file lets-encrypt-x1-cross-signed.der
keytool -trustcacerts -keystore $KEYSTORE -storepass changeit -noprompt -importcert -alias letsencryptauthorityx2 -file lets-encrypt-x2-cross-signed.der
keytool -trustcacerts -keystore $KEYSTORE -storepass changeit -noprompt -importcert -alias letsencryptauthorityx3 -file lets-encrypt-x3-cross-signed.der
keytool -trustcacerts -keystore $KEYSTORE -storepass changeit -noprompt -importcert -alias letsencryptauthorityx4 -file lets-encrypt-x4-cross-signed.der

#rm -f letsencryptauthorityx1.der letsencryptauthorityx2.der lets-encrypt-x1-cross-signed.der lets-encrypt-x2-cross-signed.der lets-encrypt-x3-cross-signed.der lets-encrypt-x4-cross-signed.der
rm -f lets-encrypt-x1-cross-signed.der lets-encrypt-x2-cross-signed.der lets-encrypt-x3-cross-signed.der lets-encrypt-x4-cross-signed.der

キーストア内の一覧を表示する参考コード。
keytool -list -keystore $KEYSTORE -storepass changeit

キーストア内の詳細を表示する参考コード。
keytool -v -list -keystore $KEYSTORE -storepass changeit


Let's Encrypt の中間認証局のサーバー証明書を導入します。

IdenTrust DST Root および、ISRG Root です。

これについてネットで検索すると、特に英語のサイトでは色々なやり方が紹介されているんですが、ことごとく機能しませんでした…。得に IdenTrust DST Root のサーバー証明書には手こずって手こずって、諦めてしまいました…。

で、Java 8 のキーストアからサーバー証明書をぶっこ抜いて、java6 のキーストアへ突っ込む、という強引な方法にたどり着いた訳です…。邪道です…。

これも参考コードを載せておきます。が、あくまで自己責任で…。

あと、パスを直接指定しているので、全てのパスを変更しないと動きません。

Java 8 のキーストアから、Java 6 のキーストアへサーバー証明書をコピーする参考コード。
#! /bin/sh

# Java 8 のキーツールのパス
J8KEYTOOL=/hogehoge/jdk1.8.0/jre/bin/keytool

# Java 8 のキーストアのパス
J8KEYSTORE=/hogehoge/jdk1.8.0/jre/lib/security/cacerts

# Java 6 のキーツールのパス
J6KEYTOOL=/hogehoge/jdk1.6.0/jre/bin/keytool

# Java 6 のキーストアのパス
J6KEYSTORE=/hogehoge/jdk1.6.0/jre/lib/security/cacerts

# 作業ディレクトリ
WORKDIR=/hogehoge
cd ${WORKDIR}

# Java 8 から証明書をエクスポート
${J8KEYTOOL} -exportcert -alias letsencryptisrgx1\ [jdk] -keystore ${J8KEYSTORE} -storepass changeit -file ${WORKDIR}/jdk8_letsencryptisrgx1.cer
${J8KEYTOOL} -exportcert -alias identrustdstx3\ [jdk] -keystore ${J8KEYSTORE} -storepass changeit -file ${WORKDIR}/jsk8_identrustdstx3.cer

# Java 6 のキーストアから既存を削除
${J6KEYTOOL} -delete -alias letsencryptisrgx1 -keystore ${J6KEYSTORE} -storepass changeit
${J6KEYTOOL} -delete -alias identrustdstx3 -keystore ${J6KEYSTORE} -storepass changeit

# Java 6 のキーストアへ追加
${J6KEYTOOL} -trustcacerts -keystore ${J6KEYSTORE} -storepass changeit -noprompt -importcert -alias letsencryptisrgx1 -file ${WORKDIR}/jdk8_letsencryptisrgx1.cer
${J6KEYTOOL} -trustcacerts -keystore ${J6KEYSTORE} -storepass changeit -noprompt -importcert -alias identrustdstx3 -file ${WORKDIR}/jsk8_identrustdstx3.cer

# 証明書ファイルの削除
rm -f ${WORKDIR}/jdk8_letsencryptisrgx1.cer ${WORKDIR}/jsk8_identrustdstx3.cer


おまけ。

Apache HTTPClient で HttpClientBuilder を使用して、素の HttpClient のインスタンスを生成する場合は簡単なんですが、ConnectionManager を使用する場合は工夫が必要なので、参考コードを載せておきます。

素の HttpClient の参考コード。
SSLConnectionSocketFactory sockFctr = new SSLConnectionSocketFactory
(
	new TLSSocketFactory()
	, new String[]{"TLSv1.2"}
	, null
	, new DefaultHostnameVerifier()
);

HttpClient client = HttpClientBuilder
	.create()
	.setSSLSocketFactory(sockFctr)
	.build();

ConnectionManager を指定する HttpClient のダメな参考コード。
PoolingHttpClientConnectionManager connMngr = new PoolingHttpClientConnectionManager();

SSLConnectionSocketFactory sockFctr = new SSLConnectionSocketFactory
(
	new TLSSocketFactory()
	, new String[]{"TLSv1.2"}
	, null
	, new DefaultHostnameVerifier()
);

HttpClient client = HttpClientBuilder
	.create()
	.setConnectionManager(connMngr)
	.setSSLSocketFactory(sockFctr)
	.build();

上記コードの場合、setConnectionManager メソッドで指定した ConnectionManager の SocketFactory でオーバーライドされてしまい、setSSLSocketFactory メソッドで指定した SocketFactory は使用されません。

ConnectionManager を指定する HttpClient の参考コード。
Registry sockFctrReg = RegistryBuilder
	.create()
	.register
	(
		"https"
		, new SSLConnectionSocketFactory
		(
			new TLSSocketFactory()
			, new String[]{"TLSv1.2"}
			, null
			, new DefaultHostnameVerifier()
		)
	)
	.register
	(
		"http"
		, PlainConnectionSocketFactory.getSocketFactory()
	)
	.build();

PoolingHttpClientConnectionManager connMngr = new PoolingHttpClientConnectionManager
(
	sockFctrReg
);

HttpClient client = HttpClientBuilder
	.create()
	.setConnectionManager(connMngr)
	.build();

org.apache.http.config.Registry へ HTTPS 用の SocketFactory と、HTTP 用の SocketFactory を登録し、その Registry を ConnectionManager のコンストラクタへ渡すという、かなり回りくどい方法です。他の方法も有るかとは思いますが、まあ参考まで。

2018年4月30日月曜日

テキストエディタ「SciTE」の設定見直し



以前、エディタを「SciTE」に乗り換えた時に「User Options」の設定例を載せたんですが、バージョンが変わった為、それに合わせて設定を見直しました。デスクトップ環境を「MATE」に変更したせいかな?

特に困っていたのが、等幅フォントがズレる様になってしまった事で、その原因が設定方法に変更が加わった事に有り、以前の設定のままだと問題が出る、というものでした。

あと、検索ウィンドウ、置換ウィンドウが、ダイアログではなくなり、エディタ下部にドッキングされた形式に変わったんですが、設定でダイアログに戻せるので、それも変更しています。

メニュー「Options」->「Open User Options File」を開き、設定を変更します。
変更した所は赤字の部分です。
# 行番号の表示
line.margin.visible=1
line.margin.width=1+
margin.width=4

# 矩形選択時 改行より右にカーソルがいけるようにする
virtual.space=1

# 文字コード
character.set=128
code.page=65001
if PLAT_GTK
 LC_CTYPE=ja_JP.UTF-8
 output.code.page=65001

# フォント
technology=0
font.base=$(font.monospace)
font.small=$(font.monospace)
font.comment=$(font.monospace)
font.text=$(font.monospace)
font.text.comment=$(font.monospace)
font.embedded.base=$(font.monospace)
font.embedded.comment=$(font.monospace)
font.vbs=$(font.monospace)

# タブの幅
tabsize=8
indent.size=8

# 空白文字の表示
view.whitespace=1

# 選択部分の色
selection.fore=#000000;
selection.back=#ffd700
selection.alpha=256
find.mark.indicator=style:roundbox,colour:#0080FF,under,outlinealpha:140,fillalpha:80

# 出力ウィンドウを横分割にする
split.vertical=0

# 終了時に折りたたみを保存する
session.folds=1

# 検索・置換はストリップでなくダイアログ
find.use.strip=false
replace.use.strip=false

ただし、すべてのオプションを見直した訳では無いので、上記の設定にもまだ間違いが存在する可能性が有ります。

2018年4月11日水曜日

Debian stretch もしかして腐ってる? 代理マシン編 その1



以前「GA-MA78GPM-DS2H」+「AMD Athlon X2 5050e」にインストールした Debian stretch の調子が悪い…。

症状としては、突然再起動がかかる、気が付くと電源が落ちている、といった感じなのだが、一番の問題はログが残らないので、原因の特定が困難な事…。症状から察するにハードウェア関係、またはドライバ関係の問題っぽいのだが、マイナートラブルなのか、アップデートで問題が解消される訳でもなく、ネットで検索してみても話題にすらなって無いっぽい…。

という事で、余ってるマシンを代理マシンにする事にした。

今回のターゲットPCは「TOSHIBA dynabook EX/35LWHKS」というラップトップ PC。 構成としては「インテル Celeron プロセッサー 900」+「モバイル インテル GL40 Expressチップセット」、グラフィックは「モバイル インテル GMA 4500M」という感じ。

例によって Debian stretch は32bit(i386)版です。

で、タイトルの「Debian stretch もしかして腐ってる?」についてなんですが、今回のインストール中にも、突然ハングアップする、突然再起動する、といった症状が出てしまい、結局何回もインストールし直したり、設定を変えてみたりを繰り返すはめになった為、この様なタイトルになってしまいました…。

以下、素人なりの分析。
  1. 前回の「GA-MA78GPM-DS2H」+「AMD Athlon X2 5050e」が Debian stretch インストール直後から調子が悪い。が、その直前までは Debian wheezy で問題無く使用出来ていた為、ハードウェアの不具合は考えにくい。
  2. ログも吐かずに突然再起動する、電源が切れるといった症状から、ハードウェア周りか、ドライバ周りの問題の可能性が高い。
  3. 今回の「TOSHIBA dynabook EX/35LWHKS」に Debian stretch をインストールしても、ハングアップする、突然再起動する、といった症状が出てしまったが、主にドライバの設定で回避できた。
結果、Debian stretch のドライバ周りは腐ってるっ!(※個人の感想です)


それと、前回のインストールではデスクトップ環境として「CINNAMON」を選択したんですが、今回は結局ハードウェアレンダリングを無効化しなければならなくなった為、デスクトップ環境とし「MATE」を選択する事にしました。ちなみに「メイト」と読むものだと思っていたら、「マテ」と読むのが正解でした…。

以下、インストールログです。
  1. PC に CD をセットして起動、インストールを開始する。
  2. 最初のメニューでグラフィカルインストールを選択。無事インストール開始。
  3. 言語は日本語、インストール対象は「Debian デスクトップ環境」、「MATE」、「標準システムユーティリティ」のみ。インストールが始まるのでしばらく待つ。
  4. インストールが完了すると CD が排出され、再起動するかと聞かれるので CD を回収し再起動。
  5. 再起動すると GRUB のメニューが表示され、デフォルトで先ほどインストールしたシステムが起動される。
  6. 起動ログが流れていき、ログイン画面が出るか、というタイミングでクラッシュ!
    画面が虹色モザイクというか何というか、表示が完全に崩れ、しかも何の操作も受け付けなくなりました。
    Ctrl + Alt + F1 等で他のコンソールに切り替える事も出来ません。
  7. 電源ボタンの長押しで再起動する…。
で、ここからの試行錯誤が非常に長かったんですが、先に結果だけ書き留めておきます。
  1. "/etc/X11/xorg.conf" ファイルを作り、グラフィックドライバの設定を変更する。
  2. グラフィックドライバは "intel" を指定。
  3. グラフィックドライバのオプション "NoAccel" を指定し、ハードウェアアクセラレーションをオフる。
  4. "/etc/default/grub" ファイルへカーネルパラメーターを追加し、"execlist" を無効化する。
これでやっとまともにログインし、デスクトップにたどり着けました…。

"xorg.conf" の作り方については「debian squeeze で xorg.conf が無い場合の対処法 | ラムダ算法書店」を参考にさせてもらいました。"intel" グラフィックドライバの設定等に関しては「Intel Graphics - ArchWiki」を参考にさせてもらいました。

特に「Intel Graphics - ArchWiki」は、"intel" グラフィックドライバに関して、色々な環境、いろいろなトラブルについて詳細に書かれており、大変参考になりました。その反面、膨大な情報の中から自分の環境に合った正解に辿り着くまでに、大変な時間を要しました。もちろん私の場合は解決に至ったので、大変感謝しています!


以下、個別の作業メモです。

通常通り起動してしまうとグラフィカルログイン前、またはログイン後に、クラッシュやフリーズをしてしまうので、"GRUB" メニューの "Advanced options for Debian GNU/Linux" -> "recovery mode" から、リカバリーモードに "root" でログインして作業を行います。
  1. コンソールが日本語に対応していない為、日本語メッセージが化けてしまうので、言語設定を英語にする。
  2. "Xorg -configure" コマンドで "/root/xorg.conf.new" ファイルを作成。
  3. "/root/xorg.conf.new" ファイルを、"/etc/X11/xorg.conf" へと移動、改名。
  4. "/etc/X11/xorg.conf" ファイルを編集し、グラフィックドライバの設定を変更。
  5. "/etc/default/grub" ファイルを編集し、カーネルパラメーターを追加。
  6. "update-grub2" コマンドで GRUB を更新。
  7. 再起動。
"/etc/X11/xorg.conf" ファイル編集までのコマンドです。
# export LANG=C
# Xorg -configure
# mv /root/xorg.conf.new /etc/X11/xorg.conf
# vi /etc/X11/xorg.conf
"/etc/X11/xorg.conf" ファイルの内容です。Identifier "Card0"、"Card1" と 2モード分のグラフィックデバイスの設定が有るので、ここに "NoAccel" オプションを追加します。
 (省略)
Section "Device"
 (省略)
 Identifier  "Card0"
 Driver      "intel"
 Option      "NoAccel" "True"
 BusID       "PCI:0:2:0"
 (省略)
EndSection

Section "Device"
 (省略)
 Identifier  "Card1"
 Driver      "intel"
 Option      "NoAccel" "True"
 BusID       "PCI:0:2:1"
 (省略)
EndSection
 (省略)
"/etc/default/grub" ファイルを編集します。
# vi /etc/default/grub
"/etc/default/grub" ファイルの内容です。"GRUB_CMDLINE_DEFAULT" へ "i915.enable_execlists=0" を追加し、"execlist" を無効化します。
(省略)
GRUB_CMDLINE_DEFAULT="quiet i915.enable_execlists=0"
(省略)
"update-grub2" コマンドで GRUB を更新し、再起動します。
# update-grub2
# reboot
無事、グラフィカルログインも成功し、デスクトップが表示されました!


今回の環境「TOSHIBA dynabook EX/35LWHKS」では、ハードウェアアクセラレーションの無効化、"execlist" の無効化で、なんとか使える環境まで持っていけました。その他ソフトウェアのインストールや、システムの移行が完了したら、「GA-MA78GPM-DS2H」+「AMD Athlon X2 5050e」にも再挑戦しようと思っています。やっぱグラフィックドライバ周りが原因なのかなぁ…。

2017年11月1日水曜日

Gedit が使いづらいのでエディタを SciTE に乗り換える



※この記事の設定はその後見直しました。

何回使っても Gedit が使いづらい。特に検索が酷い。あと、プラグインが微妙…。純正プラグインはまあ良いとして、それだけでは機能が足りないので野良プラグインで補完しようとするも、バージョン間の互換性が低いせいで、上手く動かなかったりする事が多い気がする…。

で、割とまともなエディタ「SciTE」に乗り換えます。まあ、毎度のパターン。

SciTE をインストールします。
# aptitude install scite

メニューの「プログラミング」に登録されるみたいです。


SciTE を起動し、設定を整えていきます。
メニュー「Options」->「Open User Options File」を開き、設定を変更します。
とりあえず個人的な定番設定を書き込み、保存します。
# 行番号の表示
line.margin.visible=1
line.margin.width=1+
margin.width=4

# 矩形選択時 改行より右にカーソルがいけるようにする
virtual.space=1

# 文字コード
character.set=128
code.page=65001
if PLAT_GTK
 LC_CTYPE=ja_JP.UTF-8
 output.code.page=65001

# フォント
technology=0
font.base=font:!Monospace Regular,size:9
font.small=font:!Monospace Regular,size:8
font.comment=$(font.base)
font.code.comment.box=$(font.comment)
font.code.comment.line=$(font.comment)
font.code.comment.doc=$(font.comment)
font.code.comment.nested=$(font.comment)
font.text=$(font.base)
font.text.comment=$(font.base)
font.embedded.base=$(font.base)
font.embedded.comment=$(font.base)
font.monospace=$(font.base)
font.vbs=$(font.base)
font.js=$(font.base)

# タブの幅
tabsize=8
indent.size=8

# 空白文字の表示
view.whitespace=1

# 選択部分の色
selection.fore=#000000;
selection.back=#ffd700
selection.alpha=256
find.mark.indicator=style:roundbox,colour:#0080FF,under,outlinealpha:140,fillalpha:80

# 出力ウィンドウを横分割にする
split.vertical=0

# 終了時に折りたたみを保存する
session.folds=1

設定方法は「SciTE Documentation」に有るんですが、英語なので正直メンドイんですよねぇ…。

2017年10月31日火曜日

Cinnamon のウィンドウスナップ・ウィンドウタイリングをオフる



しばらく様子を見ていたんだけど、Cinnamon のウィンドウスナップ機能、ウィンドウタイリング機能がウザすぎてオフった。

デスクトップ環境で使うにはメリットが一切感じられないんだけどなぁ…。これってタブレット端末とか用の機能じゃないのかね?

まあ、簡単にオフれるから良いけど…。

メニューから「設定」->「ウィンドウタイル表示」をクリック。


「ウィンドウのタイル表示とスナップ化を有効化」が「オン」になっているので…


「オフ」にするだけ。


この機能が最初からオフになっていると、機能の存在自体が埋もれてしまうので、デフォルトでオンにしてるんだろうけど…。まあ、デスクトップユーザーには要らない機能よなぁ…。

2017年10月23日月曜日

Debian stretch + Cinnamon に Dropbox をインストール



Debian stretch + Cinnamon 環境に Dropbox をインストールしたのでメモ。

Gnome系 のファイルマネージャー Nautilus の場合は、普通に nautilus-dropbox パッケージを導入すれば問題無いと思いますが、Cinnamon のファイルマネージャー Nemo の場合は、nemo-dropbox パッケージを導入するみたいです。で・す・が、Debian stretch のリポジトリには存在しないっていうね…。Ubuntu のリポジトリには普通に有るみたいなんだけどなぁ…。

色々と検索して調べてみたら「nemo-extensions/nemo-dropbox at master · linuxmint/nemo-extensions · GitHub」でソースが公開されているので、これを使ってみるのも有りかもしれません。

ですが、今回は「Linux Packages Search - pkgs.org」という、Linux 関係のパッケージが集積されたサイトと出会ったので、これを利用してみます。

nemo-dropbox_2.0.1+lmde_i386.deb Debian Download」から deb ファイルをダウンロード。今回は nemo-dropbox_2.0.1+lmde_i386.deb というファイルでした。

私の環境では python-gpgme パッケージのみが足りてなかったので、事前にインストールしておきます。
# aptitude install python-gpgme
dpkg コマンドで deb ファイルからパッケージをインストール。
# dpkg -i nemo-dropbox_2.0.1+lmde_i386.deb
特に問題無くインストール出来ました。
普通にメニューにも登録されます。

自動起動にも。


しっかし、何で Debian stretch のリポジトリには nemo-dropbox が無いんだろ…。
謎だ…。

2017年10月21日土曜日

Debian stretch に VirtualBox をインストール



Debian stretch に VirtualBox をインストールしたのでメモ。

以前は backports とかからインストール出来てたと思ったんだけど、配布元サーバーも Oracle に移動したみたいです。

How to Install VirtualBox on Debian 9 Stretch - LinuxBabe.Com」に、そのものズバリが書いてあるので参考にさせてもらいました。

まずは APT ラインを追加します。
/etc/apt/sources.list.d/ 以下に virtualbox.list を新規に追加し、編集します。
# vi /etc/apt/sources.list.d/virtualbox.list
以下の APT ラインを追加し、保存します。
deb http://download.virtualbox.org/virtualbox/debian stretch contrib
配布元サーバーの公開鍵をダウンロードし、インストールします。
# wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | apt-key add -
パッケージの情報を更新します。
# aptitude update
VirtualBox をインストールします。
# aptitude install virtualbox-5.1
Dynamic Kernel Modules Support をインストールします。
これをインストールすると、カーネルが更新された場合に自動的にカーネルモジュールも更新される様です。
# aptitude install dkms
カーネルモジュールを見てみると vbox で始まるモジュールが4つ位見つかります。 多分これらが VirtualBox のカーネルモジュールだと思います。
~# lsmod | grep vbox
vboxpci                24576  0
vboxnetadp             32768  0
vboxnetflt             28672  0
vboxdrv               303104  3 vboxnetadp,vboxnetflt,vboxpci
インストールが完了すれば、Cinnamon のメニューにも自動的に登録されます。

2017年10月20日金曜日

Debian stretch その 7 環境整備編⑥



Debian GNU/Linux を更新したのでメモ。

ターゲットPCは GA-MA78GPM-DS2H + AMD Athlon X2 5050e。
今回は /var の移動を行います。


/var の移動先は RAID なので、RAID の自動マウントを先に設定します。

まずは RAID の中には古い var が残っているので、ディレクトリの名前を変更しておきます。
# mkdir /mnt/md0
# mount /dev/md0 /mnt/md0
# mv /mnt/md0/var /mnt/md0/var.old
次に自動マウントの設定を fstab に追加します。
元のファイルは一応バックアップ、blkid コマンドで RAID の UUID を取得し fstab の最後に追加、その後整形します。
# cp /etc/fstab /etc/fstab.default
# blkid /dev/md0 >> /etc/fstab
# vi /etc/fstab
fstab の最後に、blkid コマンドの結果が追加されているので、これを整形します。
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#                
# / was on /dev/sda2 during installation
UUID=6c2a6e8d-ea3f-4786-96ee-f1c83c56fd64 /               ext4    errors=remount-ro 0       1# swap was on /dev/sda1 during installation
UUID=dce66cfb-5f5d-4e49-8e4b-dc38266a585d none            swap    sw              0       0
# swap was on /dev/sdb1 during installation
UUID=59080742-ca1e-444d-9330-04ee5737e65d none            swap    sw              0       0
# swap was on /dev/sdc1 during installation
UUID=be2ce936-0aef-4753-9f36-02bd4ee4068e none            swap    sw              0       0
/dev/sr0        /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/md0: UUID="2ca55f1b-a25c-486e-8cc5-98d6c7c7e3d2" TYPE="ext4"
blkid コマンドの結果を編集し、以下の様にします。
(省略)
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#                
# / was on /dev/sda2 during installation
UUID=6c2a6e8d-ea3f-4786-96ee-f1c83c56fd64 /               ext4    errors=remount-ro 0       1# swap was on /dev/sda1 during installation
UUID=dce66cfb-5f5d-4e49-8e4b-dc38266a585d none            swap    sw              0       0
# swap was on /dev/sdb1 during installation
UUID=59080742-ca1e-444d-9330-04ee5737e65d none            swap    sw              0       0
# swap was on /dev/sdc1 during installation
UUID=be2ce936-0aef-4753-9f36-02bd4ee4068e none            swap    sw              0       0
/dev/sr0        /media/cdrom0   udf,iso9660 user,noauto     0       0
UUID=2ca55f1b-a25c-486e-8cc5-98d6c7c7e3d2 /mnt/md0        none    defaults        0       2
再起動してみて自動的に RAID がマウントされていれば OK。


いよいよ /var を移動します。

まず GRUB のメニューからリカバリーモードへ入り、ログイン、su します。
さらにシングルユーザモードへ移行します。
念のため /var を使用しているプロセスが居ないことも確認。
# init 1
# lsof | grep /var
新しい var (RAIDの 方)を作成、現在の var の中身を、新しい var (RAIDの 方) へとコピー、現在の var をバックアップ、マウントポイントを作成しておきます。
# mkdir -p /mnt/md0/var
# cp -prf /var/* /mnt/md0/var
# mv /var /var.old
# mkdir -p /var
/var の自動マウントの設定を fstab に追加します。
# vi /etc/fstab
RAID の var を、/var へマウントします。
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#                
# / was on /dev/sda2 during installation
UUID=6c2a6e8d-ea3f-4786-96ee-f1c83c56fd64 /               ext4    errors=remount-ro 0       1# swap was on /dev/sda1 during installation
UUID=dce66cfb-5f5d-4e49-8e4b-dc38266a585d none            swap    sw              0       0
# swap was on /dev/sdb1 during installation
UUID=59080742-ca1e-444d-9330-04ee5737e65d none            swap    sw              0       0
# swap was on /dev/sdc1 during installation
UUID=be2ce936-0aef-4753-9f36-02bd4ee4068e none            swap    sw              0       0
/dev/sr0        /media/cdrom0   udf,iso9660 user,noauto     0       0
UUID=2ca55f1b-a25c-486e-8cc5-98d6c7c7e3d2 /mnt/md0        none    defaults        0       2
/mnt/md0/var    /var                                      none    bind            0       0
再起動して /var が自動的にマウントされていれば OK。 というか、上手くいってなければ起動時にエラーが発生して、勝手にリカバリーモードへ入る事になると思います。


環境整備編はこれにて終了かなぁ…。

Debian stretch + Cinnamon ディスプレイマネージャーの再起動



Cinnaomon のパネルにアプレットを追加したり削除したりして遊んでたら、マウスーカーソルは動くものの、何しても反応しなくなっちゃった…。 デスクトップ環境だけがフリーズしちゃったのか?

Ctrl + F6 でターミナルに降りて、ログイン、su してからディスプレイマネージャーを再起動。
# service lightdm restart
これでログイン画面に戻れたよ…。
何でフリーズしちゃったのかは謎…。

2017年10月19日木曜日

Debian stretch その 6 環境整備編⑤



Debian GNU/Linux を更新したのでメモ。

ターゲットPCは GA-MA78GPM-DS2H + AMD Athlon X2 5050e。
今回はネットワーク関連のパッケージを入れていきます。


まずは Tor + Privoxy をインストールします。
アクセス経路秘匿化ツールと、プライベートプロキシーツールです。
# aptitude install tor privoxy
Privoxy の起動が失敗し、エラーが表示されてしまいました。
調べたところ、IPv6 のバインドで失敗してるみたいです。
私の環境は未だに IPv6 に対応出来ていないので、設定ファイルを修正します。
# vi /etc/privoxy/config
IPv6 のアドレスをコメント化します。
listen-address  127.0.0.1:8118
#listen-address  [::1]:8118
あとは Privoxy を Tor へと繋ぎます。
設定ファイルの最後に以下を追加します(最後のドットも超大事)。
forward-socks4a / localhost:9050 .
Privoxy を再起動すると、特にエラー無く動きました。
# /etc/init.d/privoxy restart
これで localhost:8118(Privoxy) -> localhost:9050(Tor) -> 対象ホスト、という経路で接続可能になった筈です。 ブラウザのプロキシーの設定を 127.0.0.1:8118 に変更後、「Are you using Tor?」や、 「確認くん」でリレーが上手くいっているかを確認できます。


次に Samba をインストールします。
SMB(Windows ファイル共有) を使用して、Windows 等とのファイルのやり取りを行います。
# aptitude install samba
設定ファイルを変更します。
# vi /etc/samba/smb.conf
global セクションのワークグループを変更。
# Change this to the workgroup/NT-domain name your Samba server will part of
   workgroup = MYGROUP
文字セットの指定と、接続可能アドレスを指定します。
global セクションの最後へ以下を追加。
unix charset = UTF-8
dos charset = CP932
hosts allow = 192.168.xxx. 127.
プリンタ共有を無効化します。
Samba のプリンタ共有を正しく無効化する | いなた屋」を参考にさせてもらいました。
global セクションの最後へ以下を追加。
load printers = no
printing = bsd
printcap name = /dev/null
公開ディレクトリの設定を追加します。
設定ファイルの最後へ以下を追加。
※あくまで設定例です。
[data]
comment = user`s data
path = /var/data/
public = yes
read only = no
only guest = no
printable = no
create mask = 0660
directory mask = 0770
force group = sambashare
valid users = @sambashare
公開ディレクトリの作成、オーナー変更、権限変更を行います。
※あくまで設定例です。
# mkdir /var/data
# chown -R ID:sambashare /var/data
# chmod -R g+rw /var/data
# chmod -R g+s /var/data
ユーザを sambashare グループへ追加、パスワード設定を行います。
# adduser ID sambashare
# smbpasswd -a ID
New SMB password:
Retype new SMB password:
Samba を再起動します。
# /etc/init.d/samba restart
他の PC 等から SMB(Windows ファイル共有) でアクセス出来れば OK。


次に winbind をインストールします。
NetBios 名前解決、要は Windows PC と同じ様な名前解決の方法を追加し、PC 名がシェル等でも使える様にします。
# aptitude install winbind libnss-winbind
設定ファイルを編集します。
# vi /etc/nsswitch.conf
hosts の最後に wins を追加…、しようとしたら既に在りました。
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat
group:          compat
shadow:         compat
gshadow:        files

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname wins
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis
IP アドレスではなく、Windows PC の名前を指定して ping 等が実行できれば OK。


後は ssh、ntp、iptables をインストール、設定したんですが、面倒なんで割愛!
気が向いたら、またはネタが尽きたら書くかも…。

2017年10月18日水曜日

Debian stretch その 5 環境整備編④ の追加



Debian GNU/Linux を更新したのでメモ。

ターゲットPCは GA-MA78GPM-DS2H + AMD Athlon X2 5050e。
前回はセンサーが正しく認識できるようにしたんですが、いざセンサー関係のアプレットをインストールしてみたら、エラーが起きてしまったので、その対応をメモ。

System Monitor アプレットをパネルに追加したら、エラーが表示されてしまいました。


エラーと同時に対処方法が載っているので、その通りに gir1.2-gtop-2.0 をインストールしてみます。
# aptitude install gir1.2-gtop-2.0

一旦、アプレットをパネルから削除、もう一度アプレットを追加し直すと、無事表示されました。


OK みたいですね。

2017年10月17日火曜日

Debian stretch その 5 環境整備編④



Debian GNU/Linux を更新したのでメモ。

ターゲットPCは GA-MA78GPM-DS2H + AMD Athlon X2 5050e。
今回はハードウェア回りを整えていきます。

現在、ビデオドライバやセンサー関係が正しく動作できていないので、これをどうにかします。
How to install AMDGPU drivers on Debian 9 Stretch Linux - LinuxConfig.org」を参考にさせてもらいました。

正しくハードウェアを認識できる様にファームウェアに関するパッケージをインストールします。
この firmware-linux パッケージには LLVM 等が必要みたいなんですが、バージョン 3.9 以上が必要な様です。 現在の llvm パッケージ、および clang パッケージのデフォルトパッケージは、バージョン 3.8 になっているので注意が必要かもしれません。
# aptitude install firmware-linux llvm-3.9 clang-3.9

インストール終了後、再起動。
無事ソフトウェアレンダリングモードから脱し、ハードウェアアクセラレーションが効いた状態のログイン画面が表示されました。

次にセンサー関係です。
lm sensors not returning CPU temp (it87) - Ask Ubuntu」を参考にさせてもらいました。
it87 カーネルモジュールを使う為には、GRUB にも設定が必要みたいです。
マンドクセ('A`)。

/etc/default/grub を編集します。
# vi /etc/default/grub

GRUB_CMDLINE_LINUX オプションに acpi_enforce_resources=lax を追加。
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX="acpi_enforce_resources=lax"
(省略)

GRUB の設定なので、当然再起動しないと有効になりません。
ハードウェア周りの設定は再起動が多くて、マンドクセ('A`)。

これでいよいよセンサーが使える様になりました。
センサー関係のパッケージは lm-sensors なんですが、パッケージ情報を見たところ、自動でインストール済みでした。
# aptitude show lm-sensors

次にセンサーの検出を行います。
基本的に全てデフォルト回答で OK の筈。
最後の「/etc/modules に追加するか?」って質問にだけ yes と答えると、カーネルモジュールが自動的に読み込まれる様になります。
# sensors-detect 
# sensors-detect revision 6284 (2015-05-31 14:00:33 +0200)
# System: Gigabyte Technology Co., Ltd. GA-MA78GPM-DS2H
# Kernel: 4.9.0-4-686-pae i686
# Processor: AMD Athlon(tm) Dual Core Processor 5050e (15/107/2)

This program will help you determine which kernel modules you need
to load to use lm_sensors most effectively. It is generally safe
and recommended to accept the default answers to all questions,
unless you know what you`re doing.

Some south bridges, CPUs or memory controllers contain embedded sensors.
Do you want to scan for them? This is totally safe. (YES/no): 

(省略)

To load everything that is needed, add this to /etc/modules:
#----cut here----
# Chip drivers
it87
#----cut here----
If you have some drivers built into your kernel, the list above will
contain too many modules. Skip the appropriate ones!

Do you want to add these lines automatically to /etc/modules? (yes/NO)yes
Successful!

Monitoring programs won`t work until the needed modules are
loaded. You may want to run '/etc/init.d/kmod start'
to load them.

Unloading i2c-dev... OK
Unloading cpuid... OK

センサーの状態を確認してみます。
# sensors
it8718-isa-0228
Adapter: ISA adapter
in0:          +0.90 V  (min =  +0.00 V, max =  +4.08 V)
in1:          +1.84 V  (min =  +0.00 V, max =  +4.08 V)
in2:          +3.33 V  (min =  +0.00 V, max =  +4.08 V)
+5V:          +3.01 V  (min =  +0.00 V, max =  +4.08 V)
in4:          +3.01 V  (min =  +0.00 V, max =  +4.08 V)
in5:          +4.08 V  (min =  +0.00 V, max =  +4.08 V)  ALARM
in6:          +4.08 V  (min =  +0.00 V, max =  +4.08 V)  ALARM
in7:          +0.02 V  (min =  +0.00 V, max =  +4.08 V)
Vbat:         +2.78 V  
fan1:         981 RPM  (min =    0 RPM)
fan2:           0 RPM  (min =    0 RPM)
fan3:           0 RPM  (min =    0 RPM)
temp1:        +35.0°C  (low  = +127.0°C, high = +127.0°C)  sensor = thermistor
temp2:        +22.0°C  (low  = +127.0°C, high = +127.0°C)  sensor = thermal diode
temp3:        +30.0°C  (low  = +127.0°C, high = +127.0°C)  sensor = thermistor
cpu0_vid:    +1.100 V
intrusion0:  ALARM

k8temp-pci-00c3
Adapter: PCI adapter
Core0 Temp:   +15.0°C  
Core0 Temp:   +13.0°C  
Core1 Temp:   +23.0°C  
Core1 Temp:    +8.0°C  

OK みたいですね。
後はアプレットを追加するなりすれば、ハードウェアの状態を観察する事が出来ます。

Debian stretch その 4 環境整備編③



Debian GNU/Linux を更新したのでメモ。

ターゲットPCは GA-MA78GPM-DS2H + AMD Athlon X2 5050e。
今回は日本語環境を整えていきます。

日本語を選択してインストールしているので、デスクトップ環境 Cinnamon 自体は日本語化されているんですが、 何故か日本語入力環境が入っていないのと、Firefox も日本語じゃなくて英語っていうね…。

Firefox の日本語化は「言語パックで Firefox のインターフェースを他の言語にする」から日本語言語パックをインストールすれば OK。

次に日本語入力環境を整えます。
とりあえず iBus + Mozc を入れてみる。
# aptitude install ibus-mozc

ログインし直せば使える様な気がしたんだけど、再起動しても使える様にならない…。
いろいろ調べてみると、手動で入力メソッドが選択出来る様なので試してみる。
「メニュー」->「設定」->「入力メソッド」を開く。


現在の設定が表示される。
ibus になってるんだけどなぁ…。


明示的にユーザ設定を選択します。


ibus を選択します。


設定に問題がなければ OK をクリック。


これでログオンし直したら、問題無く日本語入力が出来る様になりました。
たまたま自分の環境だけで発生した問題っぽいなぁ…。
Cinnamon が Ubuntu ベースの Linux Mint 生まれだからか、パッケージの間に少し齟齬が有って(仮定)、その小さな谷間にたまたまハマってしまった(仮定)のかも?

2017年10月15日日曜日

Debian stretch その 3 環境整備編②



Debian GNU/Linux を更新したのでメモ。

ターゲットPCは GA-MA78GPM-DS2H + AMD Athlon X2 5050e。
今回はネットワーク周りの環境を整えていきます。
インストール直後は DHCP になっているので、IP アドレスを固定します。

最初は /etc/network/interfaces にネットワークの設定を書く、という伝統的な手法を使おうとした。
が、どうも名前解決周りがゴチャゴチャしいて気持ちが悪い…。
というか、そもそもネットワーク周りのコマンドやパッケージが多すぎて、「充実している」と言うよりは、「混乱している」と言った方が良い気がする。
簡単に列挙するだけでも ifconfig(net-tools)、ip(iproute2)、nmcli(NetworkManager)、デフォルトでこんなにインストールされる。

人により、または環境により使い易い方法が有るんだろうが、設定方法が混乱するだけでなく、ネット上の設定に関する情報までも混乱している気がする。
今回はかなり苦労させられた…。
何が正解かは未だに解らない…。
が、いよいよ NetworkManager と真面目に向かうべき時が来たか、という考えに至った。
という訳で NetworkManager を使ってネットワークの設定を行ってみる。

ネットワークデバイスの状態を確認。
# nmcli device status
デバイス  タイプ    状態      接続 
enp2s0    ethernet  管理無し  --   
lo        loopback  管理無し  --   
NetworkManager によるネットワークデバイスの管理を有効化する為 NetworkManager.conf を編集する。
# vi /etc/NetworkManager/NetworkManager.conf
ifupdown セクションの managed を true に変更。
[main]
plugins=ifupdown,keyfile

[ifupdown]
managed=true
NetworkManager サービスを再起動する。
# systemctl restart NetworkManager.service 
ネットワークデバイスの状態を確認。
# nmcli device
デバイス  タイプ    状態      接続
enp2s0    ethernet  接続済み  有線接続 1
lo        loopback  管理無し  --
IP アドレス等を設定していく。
# nmcli connection add type ethernet ifname enp2s0 con-name wired
接続 'wired' (UUID) が正常に追加されました。
# nmcli connection modify wired ipv4.method manual
# nmcli connection modify wired ipv4.addresses "192.168.xxx.xxx/24"
# nmcli connection modify wired ipv4.gateway "192.168.xxx.xxx"
# nmcli connection modify wired ipv4.dns "192.168.xxx.xxx 8.8.8.8"
# nmcli connection show wired
connection.id:                          wired
(省略)
connection.interface-name:              enp2s0
connection.type:                        802-3-ethernet
(省略)
ipv4.method:                            manual
ipv4.dns:                               192.168.xxx.xxx,8.8.8.8
ipv4.dns-search:
ipv4.dns-options:                       (デフォルト)
ipv4.dns-priority:                      0
ipv4.addresses:                         192.168.xxx.xxx/24
ipv4.gateway:                           192.168.xxx.xxx
(省略)
# nmcli connection up wired
接続が正常にアクティベートされました (省略)
簡単に解説。
ネットワークデバイスを指定して接続設定を追加、接続名を付ける。
# nmcli connection add type ethernet ifname enp2s0(デバイス名) con-name wired(接続名)
マニュアル設定を指定。
# nmcli connection modify wired(接続名) ipv4.method manual
IP アドレスを指定。
# nmcli connection modify wired(接続名) ipv4.addresses "192.168.xxx.xxx/24"(IP アドレス)
デフォルトゲートウェイを指定。
# nmcli connection modify wired(接続名) ipv4.gateway "192.168.xxx.xxx"(ゲートウェイアドレス)
DNS サーバーを指定。
# nmcli connection modify wired(接続名) ipv4.dns "192.168.xxx.xxx 8.8.8.8"(DNS サーバー)
接続設定の確認。
# nmcli connection show wired(接続名)
接続開始。
# nmcli connection up wired
接続が上手くいけば ifconfig や ip でも接続設定の確認はできます。
# ifconfig
(省略)
#ip a
(省略)

取り合えずはこんな所かなぁ…。
この後インストールや設定するパッケージでトラブルが出たら、その都度修正していく感じで。
何も問題が出ないといいなぁ…。

2017年10月14日土曜日

Debian stretch その 2 環境整備編①



Debian GNU/Linux を更新したのでメモ。

ターゲットPCは GA-MA78GPM-DS2H + AMD Athlon X2 5050e。
前回はインストールしただけなので、環境を整えていきます。

とりあえず素の apt コマンドだけでは不便なので aptitude コマンドをインストール。
# apt-get install aptitude
素の APT ラインは main のみなので、厳密な意味でのフリーソフトウェアしかインストールできない。
なので sources.list を編集し、非フリーソフトウェアも使える様にする。
# vi /etc/apt/sources.list
各 APT ラインへ contrib と non-free を追加する。
# deb cdrom:[Debian GNU/Linux 9.1.0 _Stretch_ - Official i386 NETINST 20170722-12:43]/ stretc
h main

#deb cdrom:[Debian GNU/Linux 9.1.0 _Stretch_ - Official i386 NETINST 20170722-12:43]/ stretch
 main

deb http://ftp.riken.jp/Linux/debian/debian/ stretch main main contrib non-free
deb-src http://ftp.riken.jp/Linux/debian/debian/ stretch main contrib non-free

deb http://security.debian.org/debian-security stretch/updates main contrib non-free
deb-src http://security.debian.org/debian-security stretch/updates main contrib non-free

# stretch-updates, previously known as 'volatile'
deb http://ftp.riken.jp/Linux/debian/debian/ stretch-updates main contrib non-free
deb-src http://ftp.riken.jp/Linux/debian/debian/ stretch-updates main contrib non-free
パッケージ情報を更新。
# aptitude update
システムを最新版へ更新。
# aptitude upgrade

システムが更新された場合は、再起動しといた方が良いですね。
まずはこんな所かなぁ。
次はネットワーク周りだな。

Debian stretch その 1 インストール編



Debian GNU/Linux を更新したのでメモ。

ターゲットPCは GA-MA78GPM-DS2H + AMD Athlon X2 5050e。
今までは wheezy を使っていたのを、クリーンインストールで stretch に更新します。
  1. Debian JP Project からリンクを辿って行き、PC/サーバー用 netinstイメージ 32 bit(i386) をダウンロードし、CD に焼く。
  2. PC に CD をセットして起動、インストールを開始する。
  3. 最初のメニューでグラフィカルインストールを選択。
    しばし待たされ、嫌な予感を感じる。
    が、無事インストール開始。
  4. 言語は日本語、インストール対象は「Cinnamon」(デスクトップ環境)と、「標準システムユーティリティ」のみ。
    ダウンロードとインストールが始まるのでしばらく待つ。
  5. インストールが完了すると CD が排出され、再起動するかと聞かれるので CD を回収し再起動。
  6. 再起動すると GRUB のメニューが表示され、デフォルトで先ほどインストールしたシステムが起動される。
  7. ログインダイアログが表示されるので、インストール時に作成した一般ユーザでログイン。
  8. 無事 Cinnamon のデスクトップが表示されたかと思ったら、ディスプレイドライバが上手く合わずにソフトウェアレンダリングモードで表示されてしまった…。
ハードウェアレンダリングが効かない、という問題は出てしまったが、インストール自体はずいぶん簡単になったもんだ。

次回、環境整備編へと続きます。

2017年9月28日木曜日

Mac のソフトウェア・アップデートもしばらくサボっていたので、大量のアップデートを行う羽目になった…。 OS X El Capitan も少しだけバージョンアップしてるし…。

巷では High Sierra が話題みたいだけど「何それ美味しいの?」状態。 そもそも、私の Mac mini は Early 2009 なので Sierra にさえ対応してない件…。

というか「OS X」じゃなくて「macOS」って言うんですってよ、奥さん!