GCCで特定の警告を一時的に無効にする

Makefileで-Wallを指定することがしばしばありますが、開発の最中、特定の警告を無効にしたいことがあります。たとえば、deprecatedな関数の使用に関する警告に対しては次のように制御します。
$ make CXXFLAGS=-Wno-deprecated-declarations
-Wnoを指定すれば、その警告は無効できるので、CXXFLAGS(やCFLAGS)にそれを指定します。

なお、autotoolsで作成したMakefileに対しては上記の対応で効果がありましたが、Makefileの書き方によっては、-Wnoオプションがコンパイラに渡されるようにする必要があるかもしれません。

VMWare Fusion 6をMacOS 10.10で実行させた場合に、画面がちらつく問題の対応。

下記にあるようにvmxファイルにmks.vsync="1"を追加すると改善した。
http://faq.act2.com/product/detail/?fid=665

LinuxをVMwareで使用時にサスペンドが失敗する時の対応

この仮想マシンへのサスペンド要求は、対応する VMware Tools スクリプトが正常に実行されなかったため失敗しました。カスタム サスペンド スクリプトをこの仮想マシンで構成している場合は、スクリプトにエラーがないことを確認してください。この操作を再試行すると、スクリプト エラーは無視されます。サポート リクエストを提出してこの問題を報告することもできます。

上記のメッセージがUbuntu 14.04を実行しているVMware fusion 6.0.5でサスペンド実行時に表示されるようになった。原因は、Network Managerをアンインストールしたことだった。以下のようにVMware-toolsのスクリプトのNetwork Managerに関する部分をコメントアウトすることで問題を解決した。
--- /root/backup/network 2014-12-03 11:25:20.064316662 +0900
+++ /etc/vmware-tools/scripts/vmware/network 2014-12-03 11:25:28.083514028 +0900
@@ -263,7 +263,7 @@ main() {
          rm -f $activeList
          ;;
       suspend-vm)
-         TranquilizeNetworkManager
+         #TranquilizeNetworkManager
          exitCode=$?
          if [ $exitCode != 0 ]; then
             save_active_NIC_list
@@ -272,7 +272,7 @@ main() {
          fi
          ;;
       resume-vm)
-         WakeNetworkManager
+         #WakeNetworkManager
          exitCode=$?
          if [ $exitCode != 0 ]; then
             # According to hfu, "/etc/init.d/networking restart" on Debian 5.0

iOS8.1+キャリアファイル:ドコモ18.1および18.2+IIJmioでテザリングOK

IIJmioの公式ページにも掲載されていますが、iPhone5sをiOS8.1.3にアップグレードし、キャリアファイルをドコモ18.1にしても、IIJmioのSIMでテザリングがそのまま出来ました。18.0の時よりLTEでの接続がスムーズになったように感じます。

追記

2014/12/11にキャリアファイルをドコモ18.2にしましたが、こちらも順調にテザリングできています。

SOL25 Experia ZL2のWalkmanにコピーした音楽ファイルを認識させる

まとまった数の音楽ファイルをExperia ZL2にコピーしたのだが、MTDは遅いしなんだか嫌いなのでadbを使った。でも、コピーが終了してもWalkmanアプリのマイライブラリにそれらが表示されない。数日待っても状況変わらず。結局、再起動すると認識された。

Ceilometerの監視間隔を変更する。

computeノードの/etc/ceilometer/pipeline.yamlを編集。

例: CPUの監視間隔を1分毎にする。
    - name: cpu_source
#      interval: 600
      interval: 60
      meters:
          - "cpu"
      sinks:
          - cpu_sink

インターネットに直接アクセスできなネットワーク内のマシンでapt-getをする。

用語
  • 対象ホスト: 直接インターネットに接続できないマシン
  • 接続元ホスト: sshで対象ホストにログインするマシン

以下のように、-Rオプションを指定して、対象ホストにsshでログインする。
$ ssh target_host -R 1080:proxy:8000
上記のproxyには、squidのようなHTTPプロクシが稼働しており、かつ、接続元ホストからアクセス可能なホストを指定する。もちろん、条件を満たすならlocalhostでもよい。

次いで、対象ホストでhttp_proxy環境変数を設定して、apt-getする。
$ export http_proxy=http://localhost:1080
$ apt-get install coreutils

Linux上でGit repositoryの内容をグラフィカルに表示するgitg

Linuxデスクトップ上で使えるGitのGUIクライアントを探していたが、gitgというのがよさげ。
GTK+アプリなので、私のデスクトップ環境XFce(GTK+ベース)との親和性もよい。

https://wiki.gnome.org/Apps/Gitg/#Screenshots

なお、これを探す時に利用したサイトは以下。他のいつかのクライアントも紹介されている。

http://git-scm.com/download/gui/linux

git logをlessに渡しても色つきで表示する

最近のgit diffは、色つきで差分を表示します。しかし、パイプでlessに渡すと色がつきません。常に色を表示するには下記のようにします。
git diff --color=always | less -r

Experia ZL2のカメラの背景ぼかし

SOL25 Experia ZL2を使用しているが、このスマホのカメラには背景ぼかし機能がついている。下の写真のようにたしかに一眼レフでとったように綺麗にボケる。

Firefoxでプロクシ接続した際、リモート側のDNSを使う。

about:configをURLバーに入力し、詳細設定メニューを表示させる。

network.proxy.socks_remote_dns項目をtrueにする
なお、有効にするには、Firefoxの再起動が必要(と思う)

2014/9月後半のNMP状況

2014/9/20にテルルNeo秋葉原でDocomoからAUにMNPした。
SOL25とLGL24の2台で一括0円、キャッシュバック60,000円となかなかいい感じ。
ほとぼりが覚めてきたのと、iPhone6が発売され、春夏Androidモデルの人気が低下してきたからか。

MacBookで蓋を閉じたときのスリープを抑止する。

InsomuniaXというソフトで実現できる。Mavericksにも対応している
https://www.macupdate.com/app/mac/22211/insomniax

LinuxデスクトップでOpera24を使う。

2014の6月にOperaのLinux版がdeveloper用にリリースされていた。といえ、1週間ほど試用した印象では、案外安定して使える。Flash playerもBlinkベースのためか、バージョン15である(Firefoxでは11.2)。体感的には、若干Firefoxのほうが速い印象をうけるが、それでも十分実用的。

http://www.opera.com/ja

さっそくiPhone5sをiOS8にアップデートしてみた。

日本時間9/18のAM 4:00すぎにさっそく、iPhone5sのiOS8へのアップデートを行った。メジャーアップデートだけあって、わりと時間を要したように思う。正確には計測してないが、多分30分ぐらいか。

で、結果、バージョンアップ成功(上述のように時間がかかったので文鎮化を途中でちょっと心配した)。 以下にスクリーンショットを掲載します。iOS7からの違いは、一見、大きくないですね。

ホーム画面については、ヘルスケアが追加されたのが目新しいぐらいかな。コントロールセンターの雰囲気は、少しマットになった感じでしょうか。



MacOS XからNASへの接続が遅い場合の対処法

Finderのメニュー「サーバーへ接続」からNASへ接続しようとすると、それが完了するまで、すごく遅かった。私の環境では、サーバーアドレスに次のように"cifs://"を指定することで接続速度を改善できた。それまで、"smb://"を使用していたのだが、これだとSMB2をデフォルトで使用するようでタイムアウトが発生していた模様。

  • cifs://192.168.10.5/share

OpenStackでLive migrationを有効にする。

コンピュートノードの/etc/nova/nova.confに以下を追加。
live_migration_flag=VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE
そして、サービスを再起動
# service nova-compute restart

localhostのcpusのURL

http://localhost:631/

Opera12で詳細設定するURL

opera:config#UserPrefs
例えば、タスクトレイに表示されるアイコンを非表示にするには、上記ページ中のShow Tray Iconのチェックボックスを非選択にする。

Ubuntu 14.04でVLANアドレスを起動時に有効にする例

/etc/network/interfaceに<インターフェイス名.vlanタグ>を記述すればよいが、up行で明示的にそのインターフェイスをリンクアップさせることが必要。また、iface行の最後は、staticではなく、manualにする。(青字
auto p1p1.40
iface p1p1.40 inet manual
  up ip addr add 192.168.40.11/24 dev p1p1.40
  up ip link set p1p1.40 up

OpenstackのCeilometerで特定のVMに対するアラームを作成する例

下記では、eb79c816-8994-4e21-a26c-51d7d19d0e45 がVMのResource ID.
 
ceilometer alarm-create --name cpu-util-10min-50per --meter-name cpu_util --comparison-operator ge --threshold 50 --matching-metadata resource=eb79c816-8994-4e21-a26c-51d7d19d0e45 --period 600

CentOS6のsshでパスフレーズ認証できない場合の対処方法(SELinuxの解除)

CentOS6で、パスワード認証ではログインできるけど、パスフレーズ認証できない(パスワード入力が表示される)ことがあった。パブリックキーを.ssh/authorized_keysとしてコピーし、パーミッションも600にしているにもかかわらずだ。 原因は、SELinuxが有効になっていたため。SELinuxの無効化方法は、/etc/selinux/configの中を以下のように変更し、再起動。
#SELINUX=enforcing
SELINUX=disabled
一時的な変更ならば、コマンドラインで以下のように入力する。
# setenforce 0

CentOS6でルーティングテーブルを設定する例。

一時的にルーティングを変更するには、例えば、次のコマンドを入力。
# route add -net 192.168.30.0 netmask 255.255.255.0 gw 172.16.32.11 dev eth0
恒久的な設定なら、/etc/sysconfig/network-scripts/route-eth0に次のように書く。
192.168.30.0/24 via 172.16.32.11 dev eth0

distccの使い方

distccを各サーバにインストールしておく。Ubuntuの場合、/etc/default/distccの設定も必要(ページ末の参考を参照)。

以下は、実際にビルドする例。もちろん、環境変数をexportしてもいい。
DISTCC_HOSTS='localhost sv1 sv2 sv3 sv4' make -j20 CC=distcc CXX=distcc
autotoolsでMakefileを作ったC++プログラムの場合、以下のエラーが出る事がある。
/usr/bin/ld: main.o: undefined reference to symbol '__cxa_free_exception@@CXXABI_1.3'
//usr/lib/x86_64-linux-gnu/libstdc++.so.6: error adding symbols: DSO missing from command line
その場合は、CXXLDを明示することで回避できる。
DISTCC_HOSTS='localhost sv1 sv2 sv3 sv4' make -j20 CC=distcc CXX=distcc CXXLD=g++

参考:Ubuntu 14.04での/etc/default/distcc変更例
--- distcc.orig 2014-09-02 09:44:05.437179718 +0900
+++ distcc      2014-09-02 09:51:15.492544164 +0900
@@ -6,7 +6,7 @@
 #
 # STARTDISTCC="true"
 
-STARTDISTCC="false"
+STARTDISTCC="true"
 
 #
 # Which networks/hosts should be allowed to connect to the daemon?
@@ -16,7 +16,7 @@
 #
 # ALLOWEDNETS="127.0.0.1"
 
-ALLOWEDNETS="127.0.0.1"
+ALLOWEDNETS="0.0.0.0/0"
 
 #
 # Which interface should distccd listen on?
@@ -24,7 +24,6 @@
 #
 # LISTENER="127.0.0.1"
 
-LISTENER="127.0.0.1"
 
 #
 # You can specify a (positive) nice level for the distcc process here

OpenStackのDashboard (Horizon)のセッションタイムアウトを変更する

/etc/openstack-dashboard/local_settings.pyのSESSION_TIMEOUT変数を秒単位で設定する。

例:タイムアウトを365日にする。このファイルは、Python scriptの一部なので下記のようにPythonの式を用いることも可能。
SESSION_TIMEOUT = 3600 * 24 * 365
※実際は、他にも制限があるようで、上記の設定をしても数十分程度でやはりタイムアウトする。

LinuxでのGRE tunnelの作り方・削除方法

追加(青字の部分は任意のトンネル名)の例。
# ip tunnel add tunne_name mode gre remote 192.168.254.11 local 192.168.254.1 ttl 255
削除
# ip tunnel del tunne_name 


また、L2インターフェイスであるgretapも以下のように作成可能。key <数値>をコマンドライン中に追加して、同じホストに対して複数のトンネルを作成することも可能。
# ip link add gretap10 type gretap remote 192.168.254.11 local 192.168.254.1 key 10
参考:物理インターフェイスがアップした後、自動的にトンネルを作る例(Ubuntu: /etc/network/interfaces)
auto eth0
iface eth0 inet static

 ....

  post-up ip link add gretap3011 type gretap remote 192.168.254.11 local 192.168.254.1 key 3011
  post-up ip link set dev gretap3011 up mtu 1500
  post-down ip link del name gretap3011

Ubuntu 14.04でDNSサーバやドメインを設定する。

/etc/network/interfaceのネットワークインターフェイスの設定に次のdns-から始まる設定を行う。
auto br0
iface br0 inet static
  address 192.168.1.10
...
  dns-nameservers 192.168.1.2
  dns-search banana
  dns-domain banana

OpenStackのglaceでコマンドラインでイメージを登録する例。

glance image-create --name ubuntu14-14.04.1-server --disk-format=raw --container-format=bare --is-public True --copy-from https://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img

Ubuntu 14.04 LTS上のLXCコンテナにOpenStackをインストールする

テスト目的などで、手元のマシン1台にOpenStackをインストールしたいことがある。その際、computerノード、networkノード、computeノードを分けて作成し、なるべく本番に近い構成を作成したい場合もあるだろう。 ホストマシンがUbuntu 14.04なら、このような要求をLXCを使う事で実現できる。 KVMなどを完全仮想化の方法と比べ、ディスクやI/Oスループットの低下を抑制でき、メモリのなどのリソースが最大限活用できる利点がある。

ホストマシンの設定

ホストマシンに以下のカーネルモジュールをロードしておく。起動時に自動的にロードされるようにするには、/etc/rc.localに記載する。
modprobe openvswitch
modprobe kvm
modprobe vhost_net
modprobe nbd
modprobe ip6table_filter
また、NTPサーバーをホストで動かす。各コンテナへのインストールは不要。


コンテナの作成

基本的には、Ice Houseであれば、以下の手順にしたがってインストールすればOKであるが、下記マニュアル以外で必要な設定などを本節で補足する。 http://docs.openstack.org/icehouse/install-guide/install/apt/content/ch_preface.html

構成

ここでは上記のドキュメントと同じく、次の3つのコンテナを作成するものとする。
  • controller
  • network
  • compute1

また、上記ドキュメントの3つのネットワークに対応する3つのブリッジをホストマシンに作成する。
  • mngbr0 管理用 
  • databr0 データ用(仮想マシンが使用するネットワーク)
  • extbr0 外部接続用 
ブリッジの作成方法についてはここを参照。

controllerの設定

このマシンは、mngbr0に接続するので、/var/lib/lxc/controller/configのネットワーク部を次のように設定する。
# Network configuration
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = mngbr0
あとは、公式マニュアルどおりでOK。

networkの設定

/var/lib/lxc/controller/configのネットワーク部を次のように設定する。また、AppArmorの制限をはずしておく。これは、Network namespaceを使用するために必要。また、MTUを1550にしているのは、GREトンネルによるパケット分割の問題を回避するため。コンテナ上の/etc/network/interfacesにもmtu 1550の設定が必要。
# Network configuration
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = mngbr0

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = databr0
lxc.network.mtu = 1550

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = extbr0

lxc.aa_profile = unconfined
次のパッケージをインストールする
# apt-get install iptables

compute1の設定

このマシンは、mngbr0とdatabr0に接続するので、/var/lib/lxc/controller/configのネットワーク部を次のように設定する。
# Network configuration
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = mngbr0

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = databr0
lxc.network.mtu = 1550

公式ドキュメントの”Configure a compute node”の項番2(# dpkg-statoverrideの実行をする節)をスキップする。

novaパッケージをインストールをインストールした際にできる/etc/init/nova-compute.confのmodprobe nbdをコメントアウトする。
--- a/tmp/nova-compute.conf
+++ b/etc/init/nova-compute.conf
@@ -14,7 +14,7 @@ pre-start script
   mkdir -p /var/lock/nova
   chown nova:root /var/lock/nova/
 
-  modprobe nbd
+  #modprobe nbd
 
   # If libvirt-bin is installed, always wait for it to start first
   if status libvirt-bin; then
デバイスファイルを作成する。
# mknod /dev/kvm c 10 232
# chmod 666 /dev/kvm
# mkdir -p /dev/net
# mknod /dev/net/tun c 10 200

Ubuntu 14.04のLXCのコンテナでAppAmorを無効にする。

/var/lib/lxc/[コンテナ名]/configに以下の行を追加する。
lxc.aa_profile = unconfined
これにより、コンテナ上でmountが失敗するなどの制限が解消する。

Ubuntu 14.04で起動時にBridgeインターフェイスを作成する。

/etc/network/interfaceに以下のような記述を行う。青字の部分はBridge名であり、下記の例ではmybr0である。
auto mybr0
iface mybr0 inet static
  address 192.168.81.1
  network 192.168.81.0
  netmask 255.255.255.0
  broadcast 192.168.81.255
  bridge_ports none

なお、bridge_ports noneという行は、Bridge起動時点で、そのBridgeに所属するinterfaceが何もない場合に指定する必要がある。

また、eth0のような起動時に存在するNICを加えてbridgeを構成するには、次のようにすればよい。

iface eth0 ine manual

iface mybr0 inet static
<同上>
bridge_ports eth0


関連記事 CentOSでBridgeインターフェイスを作成する

LXCのコンテナに2つ目のNICを追加

以下のように/var/lib/lxc/[コンテナ名]/configに、単純にlxc.network.typeなどを再度記述する。
# Network configuration (最初からエントリ)
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = mybr0
なお、これらNICのための新たなBridgeをホストに作成する方法は以下を参照。

参考

LXCの記事一覧

Gitで特定のコミットの差分を見る

git show コマンドを使えばよい。引数にはコミットハッシュ。もちろんHEADやHEAD^も使える。
$ git show 23343dbc

OpenStackでErrorやSuspendがずっと続くインスタンスをリセットする。

Adminで以下のようにして対象のインスタンスのIDを調べる。
$ nova list --all-tenant
そのIDを指定してreset-stateコマンドを実行。
$ nova reset-state --active  3275980c-3142-489f-b722-fca73adb98c3

マシンが停止している場合、ハードリブートすれば、再起動する。

OpenStackのNovaですべてのテナントのリストを表示

$ nova list --all-tenant 1

Ubuntu 14.04にRedmineをインストール

まず、apt-getでRedmineとpassengerパッケージをインストール
# apt-get install redmine libapache2-mod-passenger
# gem install bundler
/etc/apache2/sites-available/000-default.confのVirtualHostタグ内に次の内容を追加
        <Directory /var/www/html/redmine>
                RailsBaseURI /redmine
                PassengerResolveSymlinksInDocumentRoot on
        </Directory>
/etc/apache2/conf.d/passenger.confに次の内容を記述
RailsBaseURI /redmine
リンクを作成。
ln -s /usr/share/redmine/public /var/www/html/redmine
# chmod 666 /usr/share/redmine/*
必要に応じて以下のパーミッションを確認
/var/lib/dbconfig-common/sqlite3/redmine/instances/default/redmine_default

OpenStackでコマンドラインでイメージを登録する例

$ glance image-create --name='image name' --is-public=true --container-format=bare --disk-format=qcow2 < file.img
イメージを標準入力から受け取るので、以下のようにcurlでダウンロードしながら、それを登録することもできる。
$ curl https://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img | glance image-create --name='Ubuntu Server 14.04 LTS' --is-public=true --container-format=bare --disk-format=qcow2

Neutoron serverがpackage upgradeにより起動しなくなった場合の対応方法

Packageをアップデートした後、以下のエラーでNeutron serverが起動しなくなった。
# /etc/init.d/neutron-server start
neutron-db-check: ERROR: neutron database does not have version information. You must run the "neutron-db-manage stamp" command before starting neutron services.
以下のようにするとこの問題は解決した。
# neutron-db-manage --config-file /etc/neutron/neutron.conf stamp havana
No handlers could be found for logger "neutron.common.legacy"
INFO  [alembic.migration] Context impl MySQLImpl.
INFO  [alembic.migration] Will assume non-transactional DDL.

MySQLで他のサーバからの接続を許可する。

例:ユーザーuserが、すべてのマシンからDB: fooにアクセスすることを許可
 
mysql> grant all privileges on foo.* to 'user'@'%';

gitでログの中の特定の項目を出力

--pretty=format:"FORMAT"を使えばよい。FORMAT部分はman pageのPRETTY FORMATSを参照。

例:直前のコミットメッセージだけを出力。
$ git log -1 --pretty=format:"%s"

vimでコマンドの実行結果を取り込む

:r! command とするとのその出力がカーソル位置に取り込まれる。

:r! date

git diffで追加・削除の行数だけ取得する。

--shortstatをつければよい。
$ git diff 8044225f2 --shortstat
ファイル単位なら、--stat。
$ git diff 8044225f2 --stat
 book/src/abc.c    |  74 +++++++++++++++++++++++++++++++++++++++++----
 book/src/page.c   |  16 +++++++++---
 book/test/foo.c   | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 3 files changed, 198 insertions(+), 12 deletions(-)

Xephyrの使い方

X11のひとつのWindowとして新しいXserverを起動できるアプリケーションXephyrの起動方法。
$ Xephyr :1 -screen 800x600
:1はXserver番号。大元のXserverのそれは通常:0なので、:1以上を指定すればよい。Xephyrを2個以上起動する場合、番号が重複しないように:2とか:3とかそれぞれに指定する。-screenオプションはなくてもいいが、サイズを指定する場合は必要。

Ubuntu 14.04でフォントのアンチエリアシングやヒンティングのパラメータを変更する

gnome-tweak-toolというツールを使う。 コマンドラインから以下のように入力するとWindowが現れるので、左側のメニューの「Fonts」を選択し、右側のプルダウンメニューからパラメータを設定する。
$ gnome-tweak-tool
私は、HintingはNoneで、AntialiasingはGrayscaleが好み。

なお、デフォルトではインストールされていない。インストールは以下のコマンドで行う。
$ sudo apt-get install gnome-tweak-tool

screenで入力がCtrl-sが効かなくなったときの対応

私は、screenのエスケープキーをCtrl-sに割り付けている。デフォルトはCtrl-aだが、これはカーソルを先頭に移動するために使うので変更している。たまに何かを押し間違ってCtrl-sが効かなくなるときがある。そうすると、他のwindowへも移動できなくなりとても困る。そのWindowをexitコマンドで終了すると、エスケープの効くWindowに戻るのだが、新しいWindowを作っても、そのWindowではやっぱりエスケープが効かないことがある。その場合、エスケープが効くWindowで次のように入力することで、新しいWindowsでエスケープを有効にすることができる。
Ctrl-s(エスケープ)
↓
: (:が画面左下に表示される)
↓
defflow off
追記:実はもっと簡単にできました。 http://transparent-to-radiation.blogspot.jp/2015/06/screenctrl-s.html

参考: GNU screenでFlow controlを無効にする

EPELのレポジトリへの追加

# yum localinstall http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm

VMWare FusionでBIOSメニューを表示させる

vmxファイルを直接編集し、次の行を加える(既に存在する場合、右辺を"TRUE"にする)
bios.forceSetupOnce = "TRUE"

VMware Fusionで物理的なUSBストレージを使って仮想マシンを起動する

VMwareの設定で、仮想マシンにUSBストーレージを接続しただけでは、ブートできなかった。Plop Boot Managerというソフトを利用することで、この問題を解決できる。

ここからZIPファイルをダウンロードし、その中に含まれるplpbt.isoを仮想マシンに接続する。ブートすると、このISOイメージに入っているPlop Boot Managerが起動する。メニューでUSBというのを選択すれば、USBストレージからブートできる。

CentOS6.5にEPELのyumレポジトリを登録する。

# yum localinstall http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

Ubuntu 14.04にMariaDB + Galera Replicationをインストールする

このサイトの指示に従ってでapt repositoryの設定をする。

私がアクセスした時の内容は、次のとおりでした。
# apt-get install software-properties-common
# apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
# add-apt-repository 'deb http://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/repo/10.0/ubuntu trusty main'
# apt-get update


レポジトリの登録が終了したら、早速インストールします。
# apt-get install mariadb-galera-server mariadb-client galera
/etc/mysql/my.confに以下のような内容を追加する。青字の部分は適宜変更が必要。
wsrep_cluster_nameは、クラスタの名前。
wsrep_cluster_addressには、クラスタを構成するマシンのいずれかのIPを指定する。
wsrep_node_addressには、そのマシンのIPアドレスを指定する。
wsrep_cluster_name=mycluster
wsrep_cluster_address=gcomm://192.168.71.11
wsrep_node_address=192.168.71.12
wsrep_provider='/usr/lib/galera/libgalera_smm.so'
wsrep_sst_method=rsync
wsrep_slave_threads=4
default_storage_engine=InnoDB
binlog_format=ROW
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
最初のノードを起動する際、次のwsrep_cluster_addressを指定する。これは、最初のノードであることを意味する。指定しないとmy.confに記述したノードに接続しようとするが、まだ起動していないのでエラーになる。
# service mysql start --wsrep_cluster_address=gcomm://

spモード解約時にLINEの年齢認証に失敗するときの対応

解決方法は、spモード1日だけ契約する。

DocomoまたはMVNO(IIJやb-mobile)のSIMを使っていると、LINEの年齢認証ではDocomo IDの入力を求められます。spモードを解約しているが、Docomo回線の契約は維持されている場合、Docomo IDの入手は可能ですし、My DocomoにそのIDでログインできます。ただし、その状態では年齢認証に失敗します。

spモードの契約と解約は、My DocomoでWeb上の操作のみで行うことができ、すぐに反映されます。また、spモードの料金は日割りで計算されます。なので、

Web(MyDocomo)でspモード契約

LINEで年齢認証

Web(MyDocomo)でspモード解約

を1日のうちに行えば(実際には30分もあれば十分)、月額324円の日割りで約10円の費用しか要しません。LINEの年齢認証時は、WIFI接続でも大丈夫なようですので、そうすればパケ代は不要です。逆に、3GやLTEで通信すると、パケ代が請求されると思われます。

また、一旦年齢認証に成功すると、現地点(2014年5月)では、それが維持されつづけ、再度の年齢認証は不要なようです。

MacOSでメニューバーにCPUやMemoryの使用状況を表示する

MenuMetersというアプリを使用します。 ここからダウンロードできます。

表示内容は、いろいろカスタマイズできます。下の画像は私の使用例です。左側からら、ネットワーク帯域、メモリ使用量、CPU使用率(論理プロセッサ数が8なのでバーが8つ)です。

GCC (G++)の定義済みマクロを調べる

GCC (C言語の場合)
gcc -dM -E -c -xc /dev/null
G++ (C++の場合)
gcc -dM -E -c -xc++ /dev/null

MacOS X mavericksのSafariでfavicon(サイトのアイコン)を表示する

Glimsというソフトを使う。 ここ からダウンロードできる。インストールすると以下のようにfaviconがタブに表示される。

また、インストール後、Safariの環境設定のGlimsというタブで詳細が設定可能。 この中で「タブの表示幅を狭くする」というのがあり、重宝している。この動作を有効にすると、Google Chromeのそれに近い感じになる。 Safariは、標準では、タブが多くなると右端のタブに表示される">>"マークから、それ以降のタブを選択しなければならない。これは少々面倒だが、それが解決される。

Ubuntu 14.04でqpid-configを使う

Ubuntu 14.04ではなぜか、qpid-toolsパッケージが見つからないので、qpid-configが使えなかった。ただし、qpid-configは、たんなるpythonスクリプトなので、次のようにtarファイルをダウンロードし、展開することで使用可。
$ wget https://launchpad.net/debian/sid/+source/qpid-tools/0.14-1/+files/qpid-tools_0.14.orig.tar.gz
$ tar xvf qpid-tools_0.14.orig.tar.gz
$ qpid-tools-0.14/src/py/qpid-config 
Total Exchanges: 8
          topic: 3
        headers: 1
         fanout: 1
         direct: 3

   Total Queues: 6
        durable: 0
    non-durable: 6

mysqlでlocalhost上の任意のユーザーにUSAGEを許可する。

$ mysql -uroot
[snip]
mysql> GRANT USAGE ON *.* TO ''@'localhost';

Ubuntu 13.10, 14.04でfirefox用のflash player pluginをインストールする。

# apt-get install flashplugin-installer

autoconfでHeaderやLibraryをテストするコンパイラをC++にする。

すべてのライブラリやヘッダをC++コンパライラでチェックする場合、configure.acにAC_LANG()を記述すればよい。
AC_LANG([C++])
ある区間のチェックのみC++コンパイラを使うなら、AC_LANG_PUSH()/POP()が使える。
AC_LANG_PUSH([C++])
AC_CHECK_HEADERS([iostream])
AC_LANG_POP([C++])

Ubuntu 16.04や14.04で静的にDNSのアドレスを設定する。

Ubuntu 16.04 (14.04以降)では、resolv.confが動的に設定されるので、直接、編集するなとその中に書かれている。
$ cat /etc/resolv.conf 
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1
では、どうすればいいかというと、次のように設定ファイルbaseにnameserverを記述して、再起動すればよい。
$ cat /etc/resolvconf/resolv.conf.d/base 
nameserver 8.8.8.8
参考:
[NEW] Ubuntu 18.04 LTSでのDNSの設定方法
Ubuntu 14.04でDNSサーバやドメインを設定する。

Debian系Linux OS (Ubuntu含む)で静的にIPアドレスを設定する。

/etc/network/interfacesに以下のように記述する。
auto eth0
iface eth0 inet static
  address 192.168.71.10
  netmask 255.255.255.0
  gateway 192.168.71.1

Debian7でDockerを使う

インストールは、このサイトを参照すればOK。
Dockerの基本操作については、 このページが役立つ。

OpenVPNのクライアント用configファイル例

ブリッジ(Tap)接続の例。
# client側ではclientと記述
client

# L3接続ならtun, L2接続ならtap
dev tap

# 通常はudpでいい。tcp over tcpは再送等の問題あり
proto udp

# サーバ名 or IPとport番号
remote server_name 1194

# サーバの名前解決ができないときも、無限にリトライする
# たぶん、デフォルトはこの設定(無限)のはず。
# 上記remote項目で、複数のサーバーを指定している場合、この値が有限時間なら、その時間経過後に次のサーバへの接続を試みる
resolv-retry infinite

# OpenVPN 2.3.2では不要。エラーになる
no bind

# なくても、自動でネゴシエーションすると思うが、サーバー側と同じのを記載するとログにWARNINGがでなくなる
cipher AES-256-GCM

# persistentオプションは、再起動で特権ダウングレードによりアクセスできなくリソースへのアクセスを回避するよう試みる
persist-key
persist-tun

# クライアント認証のためのキーと証明書
ca ca.crt
cert client.crt
key client.key

# HMAC用の共有キー。メッセージが改ざんされていなことを保証するために使用
# 暗号化そのものはメッセージを秘匿するが、改ざんそのものを検出することはできないので、この仕組み(HMAC)で補完
tls-auth ta.key 1

# 圧縮アルゴリズム。サーバ設定にもよるがサーバ側からpushされるので、なくてもいいかも。
comp-lzo

# ログの詳細レベル 
verb 3


【参考】
CentOS6でOpenVPNサーバ構築のための手順

CentOS6および7でOpenVPNサーバ構築のための手順

以下のサイトがかなり分かり易かった。
Amazon Linux 2014.03でもこのとおりに設定して動作した。
なお、上記サイトには、クライアント用のキーを作るために次のコマンド例が出てくる。このclient1を、実際に接続するクライアントの名前に変更した方がよい。
./build-key client1
ちなみに、ta.keyを作成するのは、次のコマンド。
openvpn --genkey --secret ta.key

TAPを使うserver.confの例

port 1194
proto udp
dev tap
ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert /etc/openvpn/easy-rsa/2.0/keys/server.crt
key /etc/openvpn/easy-rsa/2.0/keys/server.key  # This file should be kept secret
dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem
ifconfig-pool-persist ipp.txt
server-bridge 172.16.32.1 255.255.255.0 172.16.32.10 172.16.32.100
client-to-client
keepalive 10 120
tls-auth ta.key 0
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
mssfix 1280
up "/etc/openvpn/up.sh
【参考】
OpenVPNのクライアント用configファイル例
CentOS 7でOpenVPNサーバの起動後にスクリプトを実行する。

GnuPG (gpg)でファイルを暗号化・複合化する

キーの作成(最初に一度だけ必要)

下記のコマンドを実行すると、キーの長さなどいくつか、質問されますが、基本的にデフォルトを選択して問題ありません。
$ gpg --gen-key
もし、作成の途中で下記のようなメッセージが表示された場合、他のアプリでキー入力を 伴う作業をキー作成が完了するまで行ってください。例えば、ブラウザでの何か検索したり、エディタで文書を編集します。
passphrase not correctly repeated; try again.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 274 more bytes)
コマンドが終了して、ホームディレクトリに以下のファルが作成されていば成功です。
$ ls  .gnupg/
gpg.conf  pubring.gpg  pubring.gpg~  random_seed  secring.gpg  trustdb.gpg

暗号化

内容がabc3文字のテキストファイルabc.txtを暗号化してみます。 オプションとして-cと、暗号化するファイル名を指定します。
$ gpg -c abc.txt
そうすると、拡張子として.gpgがついたファイルが生成されています。内容も 暗号化されています。
$ od abc.txt.gpg 
000000 8c 0d 04 03 03 02 5e 31 88 83 af 89 cd 59 60 c9  >......^1.....Y`.<
000010 20 80 6f 47 16 43 6d 29 1d b3 c9 5d 18 4a a7 ce  > .oG.Cm)...].J..<
000020 58 e3 0a 9c 36 d3 e9 69 6d e0 dc 02 99 ca df b3  >X...6..im.......<
000030 85                                               >.<
000031

複合化

複合化は、gpgで暗号化されたファイルを指定するだけです。
$ gpg abc.txt.gpg

OpenStackのNovaのログ出力をデバッグレベルにする

/etc/nova/nova.confのdebug=行の右辺をTrueにすると出力がデバッグレベルになる。ただし、かなりの量のログが記録されるので注意。
# Print debugging output (set logging level to DEBUG instead
# of default WARNING level). (boolean value)
#debug=false
debug=True
なお、ログは通常以下のディレクトリに作成される。
/var/log/nova

Amazon EC2とOpenStackでUser dataとMeta dataを取得する

EC2でのUser dataの取得方法。 下記の例のようにインスタンスからWebアクセスで取得する。以下ではcurlを使用するが、HTTPでアクセスできる方法であればなんでもOK。
$ curl http://169.254.169.254/latest/user-data/
Meta dataも同様に下記のようにする。
$ curl http://169.254.169.254/latest/meta-data/
上記コマンドでは、取得できる項目やディレクトリが表示されるので、それらをURLに指定してGETすることで、その値を取得できる。例えば、ami-idなら、次のとおり。
$ curl http://169.254.169.254/latest/meta-data/ami-id

OpenStackでも上記EC2と同じ方法でuser dataとmeta dataを取得できる。さらに次のOpenStack独自のURLも使用可能である。
$ curl http://169.254.169.254/openstack/latest/user_data
$ curl http://169.254.169.254/openstack/latest/meta_data.json
他にも、passowrdとvendor_data.jsonも取得可能。
$ curl http://169.254.169.254/openstack/latest
meta_data.json
user_data
password
vendor_data.json
なお、169.254.169.254への通信ができない場合は、こちらの記事も参照。

OpenStackのGatewayのないネットワーク上のVMでuser dataとmeta data取得の為のrouteを設定する

OpenStackでは、AWS EC2と同様に169.254.169.254にhttpでアクセスできる。
Gatewayが設定されていないSubnetに接続されているゲストマシンから、それらの情報を取得するには次の設定をする。なお、構成としてNeutronを使用していることを前提とする。
  • /etc/neutron/dhcp_agent.iniに次の設定をする。
    enable_isolated_metadata = True
    
  • neutron-dhcp-agentが実行されているマシン(いわゆるNetwork node)をリスタートする。
    なお、下記のようにdhcp agentの再起動だけでよさそうにも思えるが、RDO(Havana)ではうまく行かなかった。
    # service neutron_dhcp_agent restart
    
    設定が正常に反映された場合、dnsmasqの--dhcp-optsfileに指定されている設定ファイルの内容は、次のように169.254.169.254への静的ルートを含む。
    # cat /var/lib/neutron/dhcp/04911b6c-d75a-4744-b604-c99a342ca95f/opts
    tag0,option:classless-static-route,169.254.169.254/32,192.168.150.101
    tag0,249,169.254.169.254/32,192.168.150.101
    
  • ゲストマシンの起動
  • ゲストOSのrouteコマンドでrouting tableを確認すると、169.254.169.254が設定されていることが分かる。
    $ route 
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    169.254.169.254 192.168.150.101 255.255.255.255 UGH   0      0        0 eth0
    192.168.150.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0
    

nova-manageの基本コマンド

VMの一覧を表示。どのcompute node上で実行されているかを知ることができる。
# nova-manage vm list
ホスト(compute node)の一覧表示
# nova-manage host list

initの使い方の基本

設定の再読み込み
# initctl reload-configuration
リスト表示
# initctl list
man pageへのリンク

AWSで作成したキー(pem)を使ってsshでログインする

キーペア作成時にダウンロードした秘密鍵をamazon.pemとし、~/.sshに保存してあるとする。
他のユーザーが読める状態だとsshが警告やエラーを出す場合があるので、変更する。
$ chmod 600 .ssh/amazon.pem
それを秘密鍵として指定し、eu2-userでログインする。
ssh -i .ssh/amazon.pem -l ec2-user IP_address
なお、IP_addressには、EC2コンソールのPublic IP列の値を指定する。

MacOS Xのサファリのタブにアイコン(favicon)を表示する

Glimsというフリーソフトで実現できます。
ここからダウンロードできます。 実行すると、以下のようにタブにアイコンが表示されます。

Ubuntu 13.10, 14.04のLXCでDHCPの範囲を変更する。

デフォルトでは、サブネットのほぼ全てがDHCPに割り当てられる。静的なIPを割り当てるため、その範囲を変更するには、 /etc/default/lxc-netを編集すればよい。以下の例は、割り当てアドレスの先頭を10.0.3.100にする。
LXC_DHCP_RANGE="10.0.3.100,10.0.3.254"
その後、システムをリセットする。

なお、/etc/init/lxc-net.confを読むと、lxcbr0を一旦削除しないと再度、dnsmasqを起動されない模様。 少々面倒だが、次の様にすれば、リセットせずに反映できる。
  • すべてのコンテナを終了する
  • 次のコマンドでlxcbr0を削除
  • # ifconfig lxcbr0 down
    # brctl delbr lxcbr0
    
  • lxcの再起動
  • # initctl stop lxc
    # initctl start lxc
    
dnsmaqのオプションをが指定したとおりになっていれば成功。
# ps ax | grep lxc-dnsmasq 
 6097 ?        S      0:00 dnsmasq -u lxc-dnsmasq --strict-order --bind-interfaces --pid-file=/var/run/lxc/dnsmasq.pid --conf-file= --listen-address 10.0.3.1 --dhcp-range 10.0.3.100,10.0.3.254 --dhcp-lease-max=253 --dhcp-no-override --except-interface=lo --interface=lxcbr0 --dhcp-leasefile=/var/lib/misc/dnsmasq.lxcbr0.leases --dhcp-authoritative

X11 forwarding request failed on channel 0と表示されてsshでX11 forwardingできない時の対処法

sshに-vオプションをつけて、詳細を表示させ、原因を探る。 以下のようにauth programがないと言われている場合、xauthをaptなりyumでインストールすればよい。
...
debug1: Remote: No xauth program; cannot forward with spoofing.
X11 forwarding request failed on channel 0

Linuxで不良セクタを検出して登録する

/dev/sdb1に対して、不良セクタの検出を行い、ファイルシステムにそれを登録する例。
# fsck -c /dev/sdb1
もしくは、不良セクタの情報をファイルに書き出し、それをfsckに読み込ませる。
# badblocks -vs -o sdb1.badblocks /dev/sdb1
# fsck -l sdb1.badblocks /dev/sdb1
badblocksの引数の-vは冗長な出力、-sは、進捗表示をそれぞれ意味する。

LXCのNICをOpen vSwitchに追加

ホストでOpen vSwitchのブリッジが作成されていることを前提に説明する。 ブリッジをovsbr0、LXCのコンテナが作るvethデバイスをveth-lxcとすると以下のように組み込めばよい。
# ovs-vsctl add-port ovsbr0 veth-lxc
特別なことは、ほとんどないが、以下の点に注意が必要。
  • LXCコンテナのvethでバイス名が固定していないと若干面倒
  • LXCコンテナを起動するときに、Linuxのbridgeに組み込む設定(lxc.network.link)があると、 lxc-startでエラーになる
これらを回避するには、LXCの基本的な使い方 の「設定ファイル」項目を参照して、適宜設定のこと。

OpenStackのCeilometerを使う

メータの一覧を見る。
# ceilometer meter-list
測定値を見る。下記のにはメータ一覧のName列に指定される値のいずれかを 指定する。
# ceilometer sample-list -m 
特定のリソースIDのものを抽出する場合、-qオプションを利用する。
# ceilometer sample-list -m cpu -q 'resource_id=9e571f72-fc21-42a5-8899-a87736dda57a'

あるコマンドが含まれるパッケージを検索する

Debin, Ubuntuなどdpkgベースの場合

-Sオプションを使用する。
$ dpkg -S /bin/ls
coreutils: /bin/ls

Fedora, CentOSなどRPMベースの場合

-qfオプションを指定
$ rpm -qf /bin/ls
coreutils-8.4-31.el6_5.1.x86_64

MacOSでスクリーンキャプチャ(スクリーンショット)を取得

下記のショートカットを使用。
キー キャプチャ範囲
command + shift + 3 全画面
command + shift + 4 マウスで選択した範囲

Mac OS Xでマウスのみスクロール方向を反対にする。

Mac OS X (Mavericks)では、タッチパッドとマウスのスクロール方向の設定が連動します。 タッチパッドは、「ナチュラル」設定のほうが使い易いと感じますが、マウスのスクロールについては、その設定では、 WindowsやLinuxのそれと反対方向になり、違和感があります。

フリーソフトのSCROLL REVERSERは、この問題を解決します。 このソフトは、タッチパッド、マウス、タブレットのスクロール方向を個別に設定することを可能にします。

インストールは、上記のサイトからダウンロードし、ファインダーなどでアプリケーションフォルダにコピー(ムーブ)すればOK。 起動すれば、下記のようにメニューバーに表示され、設定が可能なります。Start at Loginにチェックをしておけば、自動起動するので便利。

CentOSでBridgeインターフェイスを作成する

mybr0というブリッジをつくる例。

/etc/sysconfig/network-scripts/ifcfg-mybr0を作成する。 (青色の部分は、作成するブリッジの名前にする)
以下は、ファイル内容の例。ポイントは、TYPE=Bridgeを記述すること。
DEVICE=mybr0
BOOTPROTO=static
BROADCAST=192.168.118.255
GATEWAY=192.168.158.2
IPADDR=192.168.118.1
NETMASK=255.255.255.0
ONBOOT=yes
TYPE=Bridge

ブリッジを作成するには、再起動するか、以下のコマンドを実行する。
# ifup mybr0
ブリッジが作成できているかはifconfigコマンドで確認できる。また、次のコマンドで、ブリッジの構成について確認できる。 (なお、この例ではまだ、interfaceがブリッジに追加されていない)
# brctl show
bridge name     bridge id               STP enabled     interfaces
mybr0           8000.000000000000       no

SQLite3のsql_masterテーブルのカラム

SQLite3でテーブル一覧を得る方法ために、以下のようにsqlite_masterテーブルを利用できます。
> select * from sqlite_master;
table|t1|t1|2|CREATE TABLE t1(id integer primary key, a integer, b integer)
index|i_b|t1|4|CREATE INDEX i_b ON t1(b)
index|i_ab|t1|5|CREATE INDEX i_ab ON t1(a,b)
このテーブルのカラムは、左から、以下のようになっています。
カラム名 説明
type tableかindex
name テーブル名、または、インデックス名
tbl_name テーブル名
root_page -
sql そのテーブル(またはインデックス)を作るためのSQLステートメント
ですので、ちょっとした応用として、where句などで条件を与えれば、任意のテーブルの情報を得ることができます。 例えば、以下は、(indexでなく)tableのみを出力します。
> select * from sqlite_master where type='table';

mysqlのデータベースをメモリ(tmpfs)上に配置する。

/etc/mysql/my.confのdatadirを次のようにtmpfsがマウントされているディレクトリに変更する。
-datadir                = /var/lib/mysql
+datadir                = /dev/shm/mysql
新しいディレクトリにDBを作成するため、以下を実行する。
# mysql_install_db
そして、mysqldを起動する。
/etc/init.d/mysqld start
なお、mysql_install_dbで作成したファイルは、再起動したら消えてしまうので、 /etc/init.d/mysqldの最初に実行するように書いておくとよいかも。

注記

Ubuntuなどでは、apparmorによるアクセス制限がされている場合がある。 その場合、/etc/apparmor.d/usr.sbin.mysqldに次のような記述を追加する。
  /dev/shm/mysql/** rwk,

Ubuntuで自動起動するデーモンを設定する

sysv-rc-confというコマンドを使う。ない場合、下記のようにインストール。
# apt-get install sysv-rc-conf
その後、コマンド実行する。実行するデーモンには[X]印が表示される。スペースでON/OFFできる。

なお、終了するには、qキーを押す。

Ubuntu 13.10 / 14.04, CentOS6.5 / 6.6 / 7.0でパスワードなしでsudoする

ユーザfooをパスワードなしで、sudoできるようにするには、/etc/sudoersに以下に次の行を加える
foo ALL=(ALL) NOPASSWD:ALL
つぎのように%から始めると、グループで指定できる。
%admin ALL=(ALL) NOPASSWD:ALL
なお、sudoグループがに関する記述があると個別ユーザーやグループにNOPASSWDを追加しても、パスワードを要求される。その場合、以下のように%sudo行をコメントアウトする。
#%sudo ALL=(ALL:ALL) ALL
ただし、複数ユーザー環境では、他のユーザーがsudoできなくなる可能性があるの要注意。

LXCの基本的な使い方

以下のコマンドで-nオプションは省略できる場合が多い。

コンテナの作成

テンプレートをubuntu、コンテナ名をcontainer-nameとして作成する例。
# lxc-create -t ubuntu -n container-name
-tに使用するテンプレートは、/usr/share/lxc/templatesの下にある。

コンテナを起動

# lxc-start -n container-name

トラブルシュート

No croup mounted on the systemと表示される場合、/etc/fstabに次の記述をして、
none        /cgroup        cgroup        defaults    0    0
/cgroupsを以下のようにマウントする。
# mkdir /cgroup
# mount /cgroup

コンテナのコンソールを表示

# lxc-console -n container-name

コンテナのコンソールを終了

  • Ctrl-a + q
(Ctrl-a + Ctrl-qでないことに注意。qを入力する時は、Ctrlは押下されていない。)

コンテナの終了

# lxc-shutdown -n container-name

コンテナへのアタッチ

アタッチは、ログインを省略して、rootでコンテナの直接シェルを起動する。
# lxc-attach -n container-name

設定ファイル

設定ファイルは以下のひとつで、シンプル。
  • /var/lib/lxc/[container-name]/config

BridgeへのInterfaceの自動追加

以下の行の右辺にbridge名を設定。 なお、Bridgeの作り方については、こちらも参照。
lxc.network.link = lxcbr0

ホスト側のvethインターフェイス名

通常は適当な名前が付けられるので設定不要だが、明示することもできる。
lxc.network.veth.pair = veth-mycontainer

CentOSでNICのMACアドレスが70-persistent-net.ruleに自動登録されるのを抑制する

CentOSでは、NICのMACアドレスをあるinterface(eth0など)に固定するための設定が自動的に以下のファイルに追加されます。
/etc/udev/rules.d/70-persistent-net.rule
この機能は、便利ではありますが、不都合な場合もあります。例えば、Diskイメージをコピーして、他の環境で使う場合に、1枚目のNICがeth1になるなどです。 上記の振る舞いを抑制するには、下記のファイルを編集します。
/lib/udev/rules.d/75-persistent-net-generator.rules
以下の行を削除または、コメントアウトします。
 DRIVERS=="?*", IMPORT{program}="write_net_rules"
なお、上記は、自動的に追加することを抑止しますが、すでに70-persistent-net.ruleなどに設定がある場合、それは依然として有効のままです。無効にする場合は、70-persistent-net.rulの中の該当する行を削除します。また、/etc/sysconfig/network-scripts/ifcfg-eth0の中にもMACアドレスの記載がある場合、それも削除します。

Systemがクラッシュした後のmysqldの開始失敗を修復する。

Systemがクラッシュして、正常にシャットダウンしなかった場合、 次のように、それ以降のmysqldが立ち上がらなくなることがあります。
# /etc/init.d/mysqld start
Another MySQL daemon already running with the same unix socket.
mysqld を起動中:                                           [失敗]
このような症状の原因候補のひとつとして、mysql.sockが、残ったままになっていることが挙げられます。
# ls -l /var/lib/mysql/mysql.sock 
srwxrwxrwx 1 mysql mysql 0  2月 21 10:34 2014 /var/lib/mysql/mysql.sock
上記のようにファイルが残っている場合、次のように削除することで、正常に起動できるようになります。
# rm -f /var/lib/mysql/mysql.sock 

MacOS Xでrouting tableを確認および設定する

Routing tableの確認。
$ netstat -rn
192.168.0.10へのGatawayを192.168.158.20にする例。
# route add -net 192.168.0.10 192.168.158.20
192.168.1.0/24へのGatawayを192.168.158.10にする例。
# route add -net 192.168.1.0/24 192.168.158.10

sshで多段接続する設定

$HOME/.ssh/confingに以下のような設定をする。 この例では、直接アクセスできるマシンがbig-bangで、それを経由してログインするマシンがatom。
Host big-bang
  Hostname 10.1.1.1
  User bean
  
Host atom
  HostName 192.168.100.5
  User mine
  ProxyCommand ssh big-bang nc %h %p

MacOSのPythonでrequestsパッケージを利用する

以下のようにpipでインストールできます。
$ sudo pip install requests
pipのインストールについては、 こちら の記事を参照ください。

MacOSにpipをインストールする

1. インストーラをダウンロードする。
$ curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py > get-pip.py
2. 実行する
$ sudo python get-pip.py

Ubuntuでカーネルモジュールの自動ロードを抑止する

/etc/modprobe.d/blacklist.confに 以下のようにモジュール名を追記すればよい。
blacklist rtl8192cu
blacklist btusb
その後、システムを再起動する。rmmodなどで、そのカーネルモジュールをアンロードしてもよいが、不安定などの理由でロードを抑止する場合、一度でもカーネルにロードされたなら、安全のため再起動するのがよい。

この機能を利用すると、次のようなこともできる。実験的に使いたいデバイスについては、安定性が必要なホストOSでは、上記のような設定にして自動でドライバがロードされることを回避し、ゲストOSで、設定等を試したり、試運転する。ゲストOSならカーネルがクラッシュしても影響が限定的になる。

Wiresharkで解析できるキャプチャファイルを、tcpdumpで作成する

tcpdump -n -s 0 -i eth0 -w dump.dat
青字不部分は適宜変更

オプションの説明

オプション 説明
-n IPアドレスのまま出力する(DNSを引かない)
-s 0 キャプチャするパケットサイズの上限を無制限
-i キャプチャ対象のネットワークデバイスを指定
-w 作成するキャプチャファイル名を指定

OpenStackのnovaコマンドでインスタンスを起動する

例: 青字の部分は適宜変更します。
$ nova boot --flavor 1 --key_name mykey --image  a7822d3f-5ba2-4248-9a3e-a946257b637c --security_group default --nic net-id=662fd507-eb19-4b98-a912-519e92846957 instance_name
flavaor一覧の調べ方
$ nova flavor-list
key一覧の調べ方
$ nova keypair-list
image一覧の調べ方
$ nova image-list
security group一覧の調べ方
$ nova secgroup-list 
network一覧の調べ方
$ nova net-list
プロジェクト名(テナント名)の変更と、ホストの指定も含む例。
$ nova --os-tenant-id e318a792ec044e1a838b14ead24828b9 boot --flavor d6bb73d1-6b4f-42ea-858d-cd1b0d48dd15  --key_name mykey --image 5060bbcb-a361-4e5a-ac26-9864143050e5  --security_group default --nic net-id=6505d940-df5c-4b2e-8da0-dbeda4343cd0 --availability-zone nova:host instance_name

mallocやfreeでGLIBCが異常を検出した際、abortさせる

GLIBCが、malloc()やfree()でメモリ破壊や二重開放などを検出した場合、stack traceやmemory mapが表示され、プログラムが終了します。このような現象の原因を調査するために、コアをダンプさせ、GDBで解析したい時があります。そのような場合、以下の環境変数を設定すると、異常検出時、abort()がコールされます。ulimit -c unlimitedなどでコアを出力する設定にしておくと、SIGABRTを受けて、コアダンプが生成されます。
MALLOC_CHECK_=2
ちなみに設定する値によって、次の振る舞いになります。
0: 何も起こさない
1: メッセージを表示
2: abortする
3: 上記1と2の両方を行う

OpenStackのNeutronでfloating IPを設定する例

内部Networkの192.168.50.100を外部ネットワークにマッピングする例を示します。

まず、内部ネット192.168.50.100のIPをもっているportのPORT_IDを調べます。
# neutron port-list
+--------------------------------------+------+-------------------+---------------------------------------------------------------------------------------+
| id                                   | name | mac_address       | fixed_ips                                                                             |
+--------------------------------------+------+-------------------+---------------------------------------------------------------------------------------+
| 02cd18bc-768b-4b9b-937b-40dfe66fe33e |      | fa:16:3e:41:3f:01 | {"subnet_id": "2cc97205-b498-4e53-8fe5-21dd6f5da317", "ip_address": "192.168.30.128"} |
| 897101af-581f-42da-b8b6-56b8352cf53f |      | fa:16:3e:b2:47:71 | {"subnet_id": "ad914263-519c-40eb-a9b4-421485e5ece3", "ip_address": "192.168.50.101"} |
| ace36996-0315-4a7d-8eaa-379bb67bd688 |      | fa:16:3e:95:40:18 | {"subnet_id": "ad914263-519c-40eb-a9b4-421485e5ece3", "ip_address": "192.168.50.100"} |
| bc538543-d817-48a9-9dd3-9803fe6cf058 |      | fa:16:3e:63:c9:12 | {"subnet_id": "ad914263-519c-40eb-a9b4-421485e5ece3", "ip_address": "192.168.50.1"}   |
+--------------------------------------+------+-------------------+---------------------------------------------------------------------------------------+
次で、以下のように実際にマッピングを作成します。
 # neutron floatingip-create --port-id ace36996-0315-4a7d-8eaa-379bb67bd688 --fixed-ip-address 192.168.50.100 ext-net
Created a new floatingip:
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| fixed_ip_address    | 192.168.50.100                       |
| floating_ip_address | 192.168.30.129                       |
| floating_network_id | 2635ab5a-0784-4898-b91d-dbe1228f31cf |
| id                  | ba6e13f3-0768-4d8f-8cd6-91217ea558aa |
| port_id             | ace36996-0315-4a7d-8eaa-379bb67bd688 |
| router_id           | 612dafe5-c553-4103-a5d2-96e379ed2e50 |
| tenant_id           | 4df9786b5d044f5e8ae1593e105546d4     |
+---------------------+--------------------------------------+

別の方法

なお、次のようにfloating IPを作成して、その後、associateすることもできる。
# neutron floatingip-create ext-net
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| fixed_ip_address    |                                      |
| floating_ip_address | 192.168.158.82                       |
| floating_network_id | 53fe6eb3-6558-47a5-a758-3b2aa1f102ce |
| id                  | b4cd47df-92e1-433d-b48f-152b79063984 |
| port_id             |                                      |
| router_id           |                                      |
| tenant_id           | c5f8ac76b2a541c09da7c0fa8f23c03f     |
+---------------------+--------------------------------------+
# neutron floatingip-associate b4cd47df-92e1-433d-b48f-152b79063984 ace36996-0315-4a7d-8eaa-379bb67bd688
上記こまんどの第二引数はfloatingipのID、第三引数はport_idを表す。

iptablesでMASQUERADEやDNATを設定する例

IPマスカレード

セキュリティなど細かいことを気にしない環境なら、以下の例のようにシンプルにLinuxマシンをNAT機能付きのルータにできる。
次の例は、192.168.118.0/24からのパケットをマスカレード(パケットのソースIPをこのマシンのように見せかけて転送)する。これは、プライベートアドレスをもつマシンから外部へ通信する場合に役立つことが多い。以下のコマンドを図のRouter machineで実行する。
# iptables -t nat -A POSTROUTING -s 192.168.118.0/24 -j MASQUERADE 


外部からのアクセス

逆に外部から192.168.118.0/24にあるマシンにアクセスしたい場合は、DNATを利用する。 以下はRouter machineの8022ポートへのパケットを192.168.118.10の22ポートに転送する例。
# iptables -t nat -A PREROUTING -p tcp --dport 8022 -j DNAT --to-destination 192.168.118.10:22


注意事項

ただし、上記の他にも、そもそもIPのルーティングが許可されていなければならない。 必要に応じて、下記の設定も行う。
# echo 1 > /proc/sys/net/ipv4/ip_forward

C言語入門2 (文字入力)

今回は、キーボードから文字を入力してみましょう。 次のmy_prog2.cというファイルを用意します。
#include <stdio.h>
#include <stdlib.h>

#define MAX_NAME_LENGTH 100

int main(void)
{
        char name[MAX_NAME_LENGTH];
        printf("What are your name ? : ");
        fgets(name, MAX_NAME_LENGTH, stdin);
        printf("Hello, %s\n", name);
        return EXIT_SUCCESS;
}
これを前回と同じく次のようにビルドします。
$ gcc my_prog2.c -o my_prog2
さて、実行させると次のようになります。
$ ./my_prog2 
What are your name ? :
ここで、Lionと入力してみましょう。
$ ./my_prog2 
What are your name ? : Lion  (キーボードで入力する)
Hello, Lion

そうすると、Hello, [入力した名前]が表示されました。

解説

今回、新しく下記の4つの事柄が出てきました。それぞれ説明していきます。
  • #define文
  • 文字を格納する変数(name)
  • fgets関数
  • printfの中の%s

#define文

#defineの後には、通常、2つの語が並びます。この文はこれ以降に出現する1つ目の単語を2つ目の単語に置換します。 今回の例ですと、MAX_NAME_LENGTHが100に置換されるので、name[MAX_NAME_LENGTH]はname[100]と書いた場合と同じになります。
では、なぜ、わざわざこのような面倒なことをするのでしょうか?それには、主に2つ理由があります。 1つは、複数回使用される数値をこのように定義しておくと、数値の変更が必要なとき、#define行の値を変えるだけで対応できること。 もう1つは、その数値が何を表しているのかが分かりやすくなるためです。

文字を格納する変数(name)

キーボードから文字列を入力するには、それを格納するための場所が必要になります。C言語では、文字列や数字などを格納するものを変数と呼びます。 変数は、使用する前に、その種類と名前を宣言しなければなりません。 このプログラムの場合、種類は文字列(char)で名前はnameです。 さらに、文字列の場合、格納できる最大文字数も、次の形式で一緒に指定する必要があります。
    char 変数名[最大の文字数];

fgets関数

fgets()関数は、キーボードから文字列を受付け、変数に格納します。括弧の中にコンマで区切られた3つの単語があります。 それぞれの語を引数(ひきすう)といいます。左側から第一引数、第二引数、第三引数とも呼ばれます。fgets()の第一引数には、入力を格納する文字列用の変数を指定します。 第二引数には、その変数に格納できる最大の文字数を指定します。第三引数にはstdinという語を指定しています。これは、キーボードから入力することを意味します。

printf関数の中の%s

printf()の第一引数の文字列の中に%sがあり、第二引数に文字列の変数が指定されている場合、%sがその変数の内容に置換されて画面に出力されます。 なので、このサンプルでは入力した文字列が、そのまま%sの箇所に出力されています。

次回

C言語入門3 (数値型変数と演算)

Open vSwitchコマンドメモ

下記でイタリックの部分は適宜、書き換える。PORT_NAMEには、ifconfigで表示されるinterface名を入れる。

構成を表示
# ovs-vsctl show

Portを追加
# ovs-vsctl BRIDGE_NAME PORT_NAME
Portを追加 (VLAN tagを指定)
# ovs-vsctl BRIDGE_NAME PORT_NAME tag=TAG_ID

Portを削除
# ovs-vsctl del-port PORT_NAME

Flowを表示
# ovs-ofctl show SWITCH_NAME

Openstack (neutron)がつくるNetwork Interfaceの関係

仮想マシン

OpenStackでneutronとopenvswitchを使った構成では、仮想マシン毎に 以下のような4つのインターフェイスが作成される。最初の3文字まはた4文字が異なり後は同じ数値の組です。
なお、これは、nova.confに以下の設定がある場合です。
libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver
  • qbr655843be-3b
  • qvb655843be-3b
  • qvo655843be-3b
  • tap655843be-3b
これらは次のように接続されている。

tapから始まるI/FはQEMU (KVM)などが作るゲストOSに接続されている。それがqbrから始まるBridgeに接続されている。 Bridgeの構成は、次のようにbrctrlコマンドで確認できる。
# brctl show
bridge name              bridge id                           STP enabled     interfaces
qbr655843be-3b      8000.f258a8426856       no                      qvb655843be-3b
                                                                                                         tap655843be-3b
qvbとqvoは、virtual ethernet tunnel (veth)の両端のデバイスである。qvbはBridge側に、qvoはOpen vSwitch側に接続されている。

DHCP agent

DHCP agentのネットワーク構成を下図に示す。

テナントネットワークごとのDHCPサーバは、独自のnetwork namespaceで実行されている。それは、virtual ethernet tunnelを経由してグローバルなnetowrk namespaceでOpen vSwitchに接続される。
なお、network namespaceの一覧を表示させるには次のようにする
# ip netns
qdhcp-26ac80d0-9f3d-46bf-9c04-27ecdcbd7800
qrouter-f53f573b-5c5f-4136-af7b-c7879cde9ed3
qrouter-d1982370-acba-4861-b706-185ccfd52cce
qdhcp-6e1aec2f-ad9c-4aec-b49e-cc5a85a1f1e5
また、次のようにnetwork namespaceを指定して、コマンド実行することで、その空間でのinterface一覧を取得できる。
# ip netns exec qdhcp-26ac80d0-9f3d-46bf-9c04-27ecdcbd7800 ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

ns-9e1da44f-f2 Link encap:Ethernet  HWaddr FA:16:3E:AA:A4:B2
          inet addr:10.5.20.3  Bcast:10.5.20.255  Mask:255.255.255.0
          inet6 addr: fe80::f816:3eff:feaa:a4b2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:468 (468.0 b)  TX bytes:468 (468.0 b)

C言語入門1 (文字列表示)

C言語を始める方を対象に解説記事を書きます。環境はLinuxを想定していますが、MacOSのターミナルでもほぼ同様のことができると思います。

 C言語で最小のプログラムを書いて実行する流れは次のとおりです。
  • エディタでプログラムを記述する
  • コンパイルする
  • 実行する 
エディタは、プログラムを入力/編集するためのツールです。Linuxだとvi系(vimなど)とEmacs系を使っている人が多いと思います。コンパイルとは、テキスト(人が書いた、文字として見えるプログラム)を実行可能な形式(バイナリとも呼ばれます)に変換することを意味します。

バイナリ形式は、(コンピュータにとって意味のある)数値の羅列ですが、人間にとっては非常に内容の認識が困難です。コンパイルされる前のテキストのプログラムをソースコード(または、ソース)ということもあります。ソースは、英語の起源を意味するsourceをそのまま日本語として使用しています。

エディタでプログラムを記述

次のソースコードを作成し、my_first.cという名前で保存してください
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        printf("Hello, World!\n");
        return EXIT_SUCCESS;
}

コンパイル

次のコマンドを実行してください。
$ gcc my_prog1.c -o my_prog1
エラーが表示されなければOKです。

実行

次のように実行してみてください。
$ ./my_prog1 
Hello, World!

解説

ソースコードの内容を見ていきましょう。 冒頭の2行に#includeから始まる文があります。 プログラムの中で使用する機能によって、このような#include文を適宜記載します。 このプログラムの場合、stdio.hの行は、後述するprintf()という機能を使用する際に必要で、 stdlib.hの行は、EXIT_SUCCESSという値を使う際に必要です。

次にint main(void)という行と中括弧{}で囲まれた範囲(だいぶ後で説明しますが関数と呼ばれます)があります。C言語では、このmain関数から実行が開始されます。逆に言えば、main関数がなければ、コンパイルがエラーになります。

関数の最初にprintf()という文があります。これは、文字列を画面に出力する命令です。この中に"Hello, World!\n"と書いたので、それが画面に出力されました。最後の\nは、「改行」を行う特殊な文字列です。また、C言語では、(#からはじまる行と関数の宣言を除いて)文の最後には; (セミコロン)が必要です。

最後のreturn EXIT_SUCCESS文は、このプログラムが正常に終了したことをシステムに通知するための行です。とりえあずは、決まり文句と考えておいてもよいでしょう。


次回

C言語入門2 (キー入力)

GDBの出力をフィルタする

GDBのPython機能を利用して、大量の出力から目的の行を抽出する方法を2つ紹介します。

1.reモジュールの利用(Pythonコードによる抽出)

1つ目は、backtraceの出力をPythonのreモジュールを使って目的の行を探します。主に青字の部分を目的に応じて変更してください。
(gdb) py out=gdb.execute("i proc map", to_string=True); import re; [re.search("Named", line) and print(line) for line in out.split("\n")];

2.シェルを利用

2つ目は、コマンドラインのgrepを利用しています。単純な検索だとPythonのプログラム(それもワンライナー)を組むより容易に目的を達成できる場合もあるでしょう。
(gdb) py a=gdb.execute("bt",to_string=True); import subprocess; subprocess.Popen("echo '%s' | grep main" % a, shell=True).wait()
なお、上記のいずれも技術的には、Pythonをワンライナを使用しています。 繰り返しはリスト包含(list comprehension)、分岐(if)にはand/orの遅延評価を利用しています。 関数はlamdaで変数にしています。

使用例

通常、i proc mapコマンドを実行すると多くの行が出力されます。catコマンドを使って試してみましょう。
$ gdb -q /bin/cat   
Reading symbols from /bin/cat...(no debugging symbols found)...done.
(gdb) run
Starting program: /bin/cat 
^C <= 実行を中断するためにCTRL + Cを入力
Program received signal SIGINT, Interrupt.
0x00007ffff7afe6a0 in __read_nocancel () at ../sysdeps/unix/syscall-template.S:81
81      ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) i proc maps
Too many parameters: maps
(gdb) i proc map 
process 19540
Mapped address spaces:

          Start Addr           End Addr       Size     Offset objfile
            0x400000           0x40b000     0xb000        0x0 /bin/cat
            0x60a000           0x60b000     0x1000     0xa000 /bin/cat
            0x60b000           0x60c000     0x1000     0xb000 /bin/cat
            0x60c000           0x62d000    0x21000        0x0 [heap]
      0x7ffff7a12000     0x7ffff7bcf000   0x1bd000        0x0 /lib/x86_64-linux-gnu/libc-2.17.so
      0x7ffff7bcf000     0x7ffff7dcf000   0x200000   0x1bd000 /lib/x86_64-linux-gnu/libc-2.17.so
      0x7ffff7dcf000     0x7ffff7dd3000     0x4000   0x1bd000 /lib/x86_64-linux-gnu/libc-2.17.so
      0x7ffff7dd3000     0x7ffff7dd5000     0x2000   0x1c1000 /lib/x86_64-linux-gnu/libc-2.17.so
      0x7ffff7dd5000     0x7ffff7dda000     0x5000        0x0 
      0x7ffff7dda000     0x7ffff7dfd000    0x23000        0x0 /lib/x86_64-linux-gnu/ld-2.17.so
      0x7ffff7fcc000     0x7ffff7fcf000     0x3000        0x0 
      0x7ffff7ff8000     0x7ffff7ffa000     0x2000        0x0 
      0x7ffff7ffa000     0x7ffff7ffc000     0x2000        0x0 [vdso]
      0x7ffff7ffc000     0x7ffff7ffd000     0x1000    0x22000 /lib/x86_64-linux-gnu/ld-2.17.so
      0x7ffff7ffd000     0x7ffff7fff000     0x2000    0x23000 /lib/x86_64-linux-gnu/ld-2.17.so
      0x7ffffffde000     0x7ffffffff000    0x21000        0x0 [stack]
  0xffffffffff600000 0xffffffffff601000     0x1000        0x0 [vsyscall]
上記では、マップされているライブラリの数がそれほど多くないので、目視で、目的のファイルを探すことも、それほど困難ではありませんが、firefoxやchromeのような大規模なプログラムでは数百行以上表示されます。 これを、stackの入っている行のみを表示させるには次のように入力します。かなりシンプルになることが理解いただけると思います。
(gdb) py out=gdb.execute("i proc map", to_string=True); import re; [re.search("stack", line) and print(line) for line in out.split("\n")];
      0x7ffffffde000     0x7ffffffff000    0x21000        0x0 [stack]

参考

GDBからPython使用法については下記にも述べられています。 http://transparent-to-radiation.blogspot.jp/2014/01/gdbpython-script.html

KVMをIntel CPUでネストして実行する


KVMをIntelプロセッサでネストして実行する設定
  • カーネル3.2以上を用意する
  • /etc/modprobe.d/kvm-nested.confに以下を設定する
  • options kvm_intel nested=1
  • 再起動する
なお、再起動後、次のように、Yが表示されれば成功
# cat /sys/module/kvm_intel/parameters/nested 
Y

neutronコマンドがAuthentication requiredを返す際の対処法

neutronがAuthentication requiredを返してかつ、/var/log/neutron/server.logに次のような記録がある場合、古い認証キーが使われている可能性があります。
2014-01-26 16:16:15.038 2814 WARNING keystoneclient.middleware.auth_token [-] Verify error: Command 'openssl' returned non-zero exit status 4
2014-01-26 16:16:15.039 2814 WARNING keystoneclient.middleware.auth_token [-] Authorization failed for token 7cd65acbdf1048d97f6629c2614eb9f8
このような事は、OpenStackコンポーネントのアップデートなどを繰り返しているうちに発生することがあります。 対処法は、/var/lib/neutron/keystone-signingを削除(あるいは別名に)します。

tcpdumpの使い方

interfaceを指定する

-iオプションを指定する

# tcpdump -i eth0

port番号を指定する

'port ポート番号'を指定する

# tcpdump -i eth0 port 80

パケットの内容をダンプする

-Xオプションを指定する

# tcpdump -i lo port 35357 -X
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes
13:47:55.102252 IP ika.52727 > ika.35357: Flags [S], seq 2674919811, win 32792, options [mss 16396,sackOK,TS val 27498856 ecr 0,nop,wscale 7], length 0
        0x0000:  4500 003c 90eb 4000 4006 286c c0a8 000a  E..<..@.@.(l....
        0x0010:  c0a8 000a cdf7 8a1d 9f70 0983 0000 0000  .........p......
        0x0020:  a002 8018 7016 0000 0204 400c 0402 080a  ....p.....@.....
        0x0030:  01a3 9968 0000 0000 0103 0307            ...h........

出力をパイプでgrepへ渡したり、ファイルへリダイレクトする場合

-lオプションをつけます。これがない場合、一定サイズのデータがtcpdumpから出力されるまで、grepやファイルへデータが送られなくなり、実際にデータが来るまで時間差が生じます。

# tcpdump -i eth0 port 80 -l | grep GET

OpenstackのHorizonでSomething went wrong!と表示される時の対処法

下記のような画面が表示される場合、アクセスしたホストが許可されてない場合があります。

アクセスが許可されていない場合、/var/log/horizon/horizon.logに次のようなログが出ています。
2014-01-25 23:13:34,980 21326 ERROR django.request Internal Server Error: /dashboard/
Traceback (most recent call last):
  File "/usr/lib/python2.6/site-packages/django/core/handlers/base.py", line 89, in get_response
    response = middleware_method(request)
  File "/usr/lib/python2.6/site-packages/django/middleware/common.py", line 55, in process_request
    host = request.get_host()
  File "/usr/lib/python2.6/site-packages/django/http/__init__.py", line 223, in get_host
    "Invalid HTTP_HOST header (you may need to set ALLOWED_HOSTS): %s" % host)
SuspiciousOperation: Invalid HTTP_HOST header (you may need to set ALLOWED_HOSTS): 192.168.158.20
上記に該当する場合、/etc/openstack-dashboard/local_settingsのALLOWED_HOSTS行に上記のログで表示されている最後の部分(青色で強調)を追加するとうまくいきます。
例)192.168.158.20からのアクセスを許可する場合、青字の部分を追加
ALLOWED_HOSTS = ['192.168.158.20', '192.168.0.10', 'ika.localdomain', 'localhost', ]
最後に、httpd (apache)を再起動します。 RedHat系ならコマンドラインで、
# service httpd restart
なお、これはHorizonというよりDjangoのアクセス制御機構に起因する問題です。

Fedora 20をCUIで使う

FedoraはデフォルトではGUIで使うように構成されているが、CentOSのようにXがデフォルトで起動しないようにする。 以下のように/etc/systemd/system/default.targetのリンク先を変更し、再起動すればよい。 (元々はgraphical.targetにリンクされているはず)
# ln -fs /lib/systemd/system/multi-user.target /etc/systemd/system/default.target 
正しく設定できているかは、次のようにして確認できます。
# ls -l /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 37  1月 24 20:29 /etc/systemd/system/default.target -> /lib/systemd/system/multi-user.target

Fedora 20でNICの名前をeth0にする。

カーネルオプションにnet.ifnames=0を追加すればよい。

具体的には、/etc/default/grubファイルを編集する。GRUB_CMDLINE_LINE行に上記のオプション追加する。

例: 赤字が追加部分
# grep GRUB_CMDLINE_LINUX /etc/default/grub 
GRUB_CMDLINE_LINUX="rd.lvm.lv=fedora/swap vconsole.font=latarcyrheb-sun16 rd.lvm.lv=fedora/root $([ -x /usr/sbin/rhcrashkernel-param ] && /usr/sbin/rhcrashkernel-param || :) rhgb quiet net.ifnames=0"

次に以下のコマンドで設定を有効にする。
grub2-mkconfig -o /boot/grub2/grub.cfg

最後にリブートすれば完了

VMware Fusion 6のデフォルトのDHCP範囲

VMware Fusion 6のDHCP範囲は192.168.158.128〜192.168.158.254のようだ。

設定は、以下のファイルにあります。
/Library/Preferences/VMware Fusion/vmnet8/dhcpd.conf

 次のようにrange行をみれば分かる。
$ grep range /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf 
        range 192.168.158.128 192.168.158.254;

GDBでアタッチ中のプロセスのメモリマップを表示

アタッチしているプログラムのメモリマップをinfo proc mapで表示できます。以下では、catコマンド使った例を示します。

引数なしで実行されたcatは、起動したまま標準入力を待ち続けます。その状態で一旦GDBからコマンドを実行できるようにするため、 途中で、CTRL + Cを入力しています。

$ gdb /bin/cat
[略]
(gdb) run
Starting program: /bin/cat 
^C <= CTRL + Cを押して実行を中断します。
Program received signal SIGINT, Interrupt.
0x00007ffff7afe6a0 in __read_nocancel () at ../sysdeps/unix/syscall-template.S:81
81      ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) info proc map
process 31692
Mapped address spaces:

          Start Addr           End Addr       Size     Offset objfile
            0x400000           0x40b000     0xb000        0x0 /bin/cat
            0x60a000           0x60b000     0x1000     0xa000 /bin/cat
            0x60b000           0x60c000     0x1000     0xb000 /bin/cat
            0x60c000           0x62d000    0x21000        0x0 [heap]
      0x7ffff7a12000     0x7ffff7bcf000   0x1bd000        0x0 /lib/x86_64-linux-gnu/libc-2.17.so
      0x7ffff7bcf000     0x7ffff7dcf000   0x200000   0x1bd000 /lib/x86_64-linux-gnu/libc-2.17.so
      0x7ffff7dcf000     0x7ffff7dd3000     0x4000   0x1bd000 /lib/x86_64-linux-gnu/libc-2.17.so
      0x7ffff7dd3000     0x7ffff7dd5000     0x2000   0x1c1000 /lib/x86_64-linux-gnu/libc-2.17.so
      0x7ffff7dd5000     0x7ffff7dda000     0x5000        0x0 
      0x7ffff7dda000     0x7ffff7dfd000    0x23000        0x0 /lib/x86_64-linux-gnu/ld-2.17.so
      0x7ffff7fcc000     0x7ffff7fcf000     0x3000        0x0 
      0x7ffff7ff8000     0x7ffff7ffa000     0x2000        0x0 
      0x7ffff7ffa000     0x7ffff7ffc000     0x2000        0x0 [vdso]
      0x7ffff7ffc000     0x7ffff7ffd000     0x1000    0x22000 /lib/x86_64-linux-gnu/ld-2.17.so
      0x7ffff7ffd000     0x7ffff7fff000     0x2000    0x23000 /lib/x86_64-linux-gnu/ld-2.17.so
      0x7ffffffde000     0x7ffffffff000    0x21000        0x0 [stack]
  0xffffffffff600000 0xffffffffff601000     0x1000        0x0 [vsyscall]
また、類似のコマンドにinfo sharedがあります。こちらは、マップされている共有ライブラリのみを列挙します。Syms Readという列は、デバッグ用のシンボル情報が読み込まれているか否かを示します。
(gdb) info shared
From                To                  Syms Read   Shared Object Library
0x00007ffff7ddaaa0  0x00007ffff7df5439  Yes         /lib64/ld-linux-x86-64.so.2
0x00007ffff7a313c0  0x00007ffff7b7c39f  Yes         /lib/x86_64-linux-gnu/libc.so.6

GDBでPython scriptを実行する

最近(少なくともversion 7以降)のGDBは、Python scriptを実行できます。実行には、従来のGDBマクロと同じくsourceコマンドを使用します。

早速、試してみましょう。次のようなPython scriptを用意します。
$ cat hello.py
#!/usr/bin/env python
import sys
sys.stdout.write('Hello, my first script.\n')
GDBを起動して、実行します。
(gdb) source hello.py
Hello, my first script.

Python scriptからのGDB機能の利用

次に、Python scriptからGDBの機能を使用する例を紹介します。gdb.execute()関数を使用すれば、GDBのコマンドラインで行う操作を実行できます。

サンプルのデバッグ対象として以下のtarget.ccを使用します。
[target.cc]
#include <cstdio>
#include <cstdlib>
#include <time.h>

int getval(int div)
{
        return time(NULL) / div;
}

int main(void)
{
        printf("val: %d\n", getval(5));
        return EXIT_SUCCESS;
}
これをshow-bt.pyで次の4つのことを行います。
  • break pointをgetval()関数の先頭に設定
  • プログラムを実行
  • break pointで停止時のbacktraceを表示する
  • break pointで停止時のraxレジスタを表示する
[show-bt.py] 
gdb.execute('b getval')
gdb.execute('run')
gdb.execute('bt')
gdb.execute('p/x $rax')
以下はコマンドラインからスクリプトを実行させる例です。 コマンドライン引数の-qは、GDB起動時のcopyrightなどの表示を抑制します。-xで実行するスクリプトファイルを指定します。
$ gdb -q -x show-bt.py  target
Reading symbols from /home/foo/target...done.
Breakpoint 1 at 0x400627: file target.cc, line 7.

Breakpoint 1, getval (div=5) at target.cc:7
7               return time(NULL) / div;
#0  getval (div=5) at target.cc:7
#1  0x0000000000400656 in main () at target.cc:12
#2  0x00007ffff72d2ead in __libc_start_main (main=, argc=, ubp_av=, init=, fini=, rtld_fini=, stack_end=0x7fffffffe128) at libc-start.c:228
#3  0x0000000000400539 in _start ()
$1 = 0x7ffff763aee8

コマンドの出力をPythonの文字列として取得する

上記の例では、通常のGDBコマンドを実行するだけでしたが、この出力をPythonの文字列として取得してみましょう。これは、gdb.execute()関数のto_string引数にTrueを渡すことで実現できます。Pythonは、文字列処理も得意ですから、容易に特定の文字列を抽出したり、整形して表示することが可能になります。

以下の例では、stacktrace出力の各行からframe番号と最後の単語を抽出して表示します。
$ cat show-bt-and-format.py 
gdb.execute('b getval')
gdb.execute('run')
bt = gdb.execute('bt', to_string=True)
for line in bt.split('\n'):
  words = line.split(' ')
  print '%s %s' % (words[0], words[-1])
$ gdb -q -x show-bt-and-format.py  target
Reading symbols from /home/foo/target...done.
Breakpoint 1 at 0x400627: file target.cc, line 7.

Breakpoint 1, getval (div=5) at target.cc:7
7               return time(NULL) / div;
#0 target.cc:7
#1 target.cc:12
#2 libc-start.c:228
#3 ()