2018年7月30日月曜日

docker container から X の画面を出すときの SELinux

ドメインソケット経由で docker コンテナからホストの X Server に画面を出すのは Web に結構情報があるのでそれは良いとして、SELinux Enforcing な環境だと Socket へのアクセスが Permission Denied になってちょっとだけハマったので自分のためのメモ。

docker run のときに以下オプションをつけるとうまく行った。
  --security-opt label=type:container_runtime_t

2018年7月23日月曜日

Fedora 28 on Thinkpad X1 Carbon 6th な環境で docker がうまく動かなかった→動いたの個人的メモ

X1 Carbon gen 6th に Fedora 28 をインストールしてるんだけど、どうも docker まわりが不安定になった。が、回復したので適当にメモ。

512GB(SSD) に自動で LVM を切って、普通に dnf install docker したら勝手に
docker-pool なる LV を 178GB もとられてしまった。どうも最近の Fedora の docker は root パーティションがある VG に空きがあると、自動で Storage Driver を devicemapper にしてくれる模様。これはこれで良いのだが、このときの LV のサイズが空き容量の 40% がデフォルトらしい。

これは /usr/share/container-storage-setup/container-storage-setup に以下の定義があることでわかる。
DATA_SIZE=40%FREE

どうも Thin provisioning のようなので、実際に利用されているディスク量しか消費されないのだと思うのだが、vgdisplay で見ると残量が単純に 178GB を引き算された値になってる。何か気持ち悪いので docker を一回アンインストールしてインストール後、 /etc/sysconfig/docker-storage-setup に以下を記述して docker デーモンを起動した。
DATA_SIZE=20G
lvdisplay で docker-pool が 20GB になってることを確認。まぁこれくらいのサイズでいいだろう。

しかし、今度は docker デーモンは立ち上がるものの、試しに docker run -it --rm fedora:28 /bin/bash などとしてもコンテナがすぐ終わっちゃう。/var/log/audit/audit.log になんだか denied がたくさん出てるので、setools を入れて audit2allow でごまかそうと企む。

 とりあえず、tail -f /var/log/audit/audit.log としておいて docker run ... を実行する。吐かれたログをコピペして別ファイルに保存。で、以下のように audit2allow にかませる。
audit2allow -M docker < /tmp/docker-audit

出来た docker.pp ファイルを semodule にかませる
semodule -i docker.pp

これを 2 回繰り返したら docker run ... 出来るようになった。ちなみに追加した許可は以下。

allow container_t container_file_t:chr_file { read write };
allow container_t container_file_t:chr_file { getattr ioctl open };
うーーん、docker をアンインストールしたときに何やら外れたんだろう。もっとスマートな直し方がありそうなもんだけど、まぁいいや。

2018年7月21日土曜日

X1 Carbon 6th Fedora でマウス動かない

現在 Fedora 28 を X1 Carbon 6th にインストール中。
GUI インストーラでマウスが動かない。

カーネルパラメータに以下を追加でおけ。

psmouse.synaptics_intertouch=1 

もしかして茨の道なのかも。

2018年7月8日日曜日

Android Studio で java.lang.ClassNotFoundException: android.view.View$OnUnhandledKeyEventListener

Android Studio の Design がまともに動かずコンポーネントを配置してもそれが Blueprint 上で見えない...んで以下のエラーが発生してる状態。

java.lang.ClassNotFoundException: android.view.View$OnUnhandledKeyEventListener

どうも SDK 28 の問題らしく 27 にしたらエラーが無くなった。以下の情報参照。

https://stackoverflow.com/questions/50856622/failed-to-find-style-coordinatorlayoutstyle-in-current-theme-in-android-studio

Change the android{ in "build.gradle" in app file
compileSdkVersion 28 to compileSdkVersion 27
targetSdkVersion 28 to targetSdkVersion 27
also, try to change implementations like
implementation 'com.android.support:appcompat-v7:28.0.0-alpha3' to
implementation 'com.android.support:appcompat-v7:27.1.1'

2018年6月21日木曜日

2018年5月17日木曜日

OID が英字って

とある 389 Directory Server 系の LDAP サーバの中を調査しているのだが、どうも OID が英文字列で構成されているパターンがある模様。スキーマ定義を見るとこんな感じ。

attributeTypes: ( foo-oid NAME 'foo' DESC ....)
objectClasses: ( bar-oid NAME 'bar' SUP top STRUCTURAL...)
名前に「-oid」とかついている。

OpenLDAP では OID Macro で oid のマクロを定義できるので 389 でもそういうのがあるんだろうと探し回ったが今のところ見当たらない。古いが以下のドキュメントを発見。

https://www.centos.org/docs/5/html/CDS/ag/8.0/Extending_the_Directory_Schema-Managing_Object_Classes.html

The object identifier of the attribute. An OID is a string, usually of dotted decimal numbers, that uniquely identifies an object, such as an object class or an attribute. If an OID is not specified, the Directory Server automatically uses object-class_name-oid. For example, if the object division is created without supplying an OID, the Directory Server automatically uses division-oid as the OID.
どうも OID が指定されていないと勝手に名前に -oid をつけてそれで良しにしてしまうらしい。OID が無い時点でエラーにして欲しいんだが... 管理 GUI でスキーマ作ったりするとそうなってしまうんだろうか?とりあえず以下のようなお勧めできない系の警告も記されていた。もしかしたら今はそんな仕様は廃止されているのかもしれない。

Using an alphanumeric OID such as division-oid is deprecated and strongly discouraged because it will lead to interoperability problems. Red Hat strongly encourages that you request your own OID prefix from IANA (Internet Assigned Number Authority).
 


2018年4月16日月曜日

libvirt の仮想マシン(qcow2)で root パスワードがわからなくて苦しんでる人へ

libvirt (KVM 利用)上で複数台の CentOS7 仮想マシンのインストールをスクリプトで自動化したのはいいのだが、動的にキックスタート定義ファイルの ks.cfg を作るところで root のパスワードがグチャグチャになって virsh console からもログインできない状態に...
virt-viewer を使えない環境なのがさらに致命的。

まぁスクリプトだから最初からまるごと仮想マシンを作り直せば良いんだけど、せっかく作ってあるのでそれを直すことにした。

single user mode でパスワードをリセットしちゃえばいいやと簡単に考えてたら、virsh console から Grub に入るのが結構面倒。時間もあまり無く、virt-viewer も使えない環境ということで、仕方ないので qcow2 のイメージをホストでマウントして /etc/shadow を直すという荒業?を行うことにした。とりあえず仮想マシンは virsh destroy でも何でもいいので停止しておく。

 http://blogger.fastriver.net/2014/06/qcow2.html に書いたがおさらいしておく。 guestmount というコマンドで qcow2 がローカルマウントできる。これを使うためにホストに libguestfs-tools を yum でインストール。
# yum install libguestfs-tools
したらホストで以下コマンドで、qcow2 ファイルをマウント。今回仮想マシンのホスト名が「client2」というやつの復旧をしたかったので以下のようなコマンドになってるけど、まぁ環境に合わせて適宜修正を。あ、あと以下ではマウントポイントが /mnt/tmp ってことで。


guestmount -a /var/lib/libvirt/images/client2.qcow2 -m /dev/centos_client2/root /mnt/tmp

マウントしたら /mnt/tmp/etc/shadow を修正する。具体的には root の 2 フィールド目を $6$ (crypt-sha512)のハッシュに変換。このハッシュは別のマシンのパスワードがわかってるユーザのやつそのまま持ってきてもいいし、以下の python ワンライナーでも作れる。
python -c 'import crypt; print crypt.crypt("適当なパスワード", "$6$適当なsalt")'
あとは、/mnt/tmp/etc/selinux/config も修正して SELinux を一時的に無効にする(これやらないと初回ログインできない)。終わったらアンマウント umount /mnt/tmp/ 。

最後に仮想マシンを起動して、virsh console からアクセスして root の ID/パスワードを入力すると正常にログインできるはず。/etc/selinux/config で「SELINUX=enforcing」に戻すのを忘れずに。