d.sunnyone.org
sunnyone.org

ページ

ラベル Ubuntu の投稿を表示しています。 すべての投稿を表示
ラベル Ubuntu の投稿を表示しています。 すべての投稿を表示

2022-11-03

PulseAudioのデバイス接続時自動切替とデフォルト入出力の設定

Ubuntuを再起動すると入力デバイスが変わって音が拾えなくなる問題が起きていたのだけど、デバイス接続時にPulseAudioがデフォルトデバイスを自動切り替えする機能を切ればよくなりそうなので、無効にする方法をメモしておく(この環境では結果的にUSBオーディオデバイスがいくつもぶら下がっている形になっているので、認識順やつないでいる状態で順番が変わったりするのだと思う。バスパワーのハブにつながったカメラが怪しい)

PulseAudio 自動切り替えの無効化

自動切り替えを無効化するには、/etc/pulse/default.pa のmodule-switch-on-connectの記述をコメントアウトする。

### Use hot-plugged devices like Bluetooth or USB automatically (LP: #1702794)
##.ifexists module-switch-on-connect.so
##load-module module-switch-on-connect
##.endif 

デフォルト入出力デバイスの設定

これの前はデフォルトの設定を変える方法を試していたので、それも併せてメモしておく。

1. デバイスのnameを探す

汎用的には、pacmd list-sources / pacmd list-sinks でデバイスのname:を探す。
$ pacmd list-sources
(略)
  * index: 8
        name: <alsa_input.usb-C-Media_Electronics_Inc._MARANTZ_M4U_20190520-00.mono-fallback>
(略)

ここで出てきたname: を後で使う。アスタリスクは今デフォルトに選ばれているもの。

GNOMEの設定の「サウンド」で選択していれば、pactl get-default-source / get-default-sinkでも得られる。

$ pactl get-default-source
alsa_input.usb-C-Media_Electronics_Inc._MARANTZ_M4U_20190520-00.mono-fallback

2. 設定ファイルに記述する

/etc/pulse/default.pa.d/00-default-device.conf に以下のように記述する。
set-default-source alsa_input.usb-C-Media_Electronics_Inc._MARANTZ_M4U_20190520-00.mono-fallback
set-default-sink alsa_output.usb-Resonessence_Labs_Resonessence_Labs_HERUS-00.iec958-stereo
なお、pactlコマンドでも変えることができるので、シェルスクリプトに書くのも可。
$ pactl set-default-source alsa_input.usb-C-Media_Electronics_Inc._MARANTZ_M4U_20190520-00.mono-fallback

参考

安定のArchWiki。

PulseAudio/サンプル - ArchWiki

2021-09-22

Linux/Windowsデュアルブート環境のインストール方針

自分のWindows PCはLinux (Ubuntu) をインストールしてデュアルブートにすることが多い。 端末のタイプによってインストールの仕方が異なり、このやりかたが参考になるかもしれないので書いておく。
  1. 空のディスクが複数ある場合→1台ずつWindows, Linuxとインストール
  2. 空のディスクが1つのみの場合→Windowsをインストール後空いたところにLinuxをインストール
  3. Windowsが入ったディスクがある場合→パーティションを縮小してLinuxをインストール

空のディスクが複数ある場合

複数のディスクがPCに搭載できる/したい場合、それぞれにインストールする。まずWindowsをひとつのディスクにインストールしてから、別のディスクにLinuxをインストールする。 一番無難なかたち。

この場合では、データの受け渡しをするためのNTFSパーティションをLinux側のディスクにちょろっと用意しておくと、Windows側のCドライブをマウントしなくてよくて便利だったりする (NTFSマウントはなんだかんだあることがあるので)

空のディスクが1つのみの場合

ディスクが1つのみの場合、Windowsインストール時に容量を指定して(例えば半分)パーティションを作成し、インストール後、 空いた領域にLinuxをインストールする。 手元にあるPCがこのパターンで、こんな構成。

ディスク /dev/nvme0n1: 931.53 GiB, 1000204886016 バイト, 1953525168 セクタ
Disk model: WDS100T1X0E-00AFY0                      
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: gpt
ディスク識別子: B1EA5819-908C-4E4F-8542-CCBD4314BXXX

デバイス        開始位置   最後から    セクタ サイズ タイプ
/dev/nvme0n1p1      2048     206847    204800   100M EFI システム
/dev/nvme0n1p2    206848     239615     32768    16M Microsoft 予約領域
/dev/nvme0n1p3    239616  818331110 818091495 390.1G Microsoft 基本データ
/dev/nvme0n1p4 818331648  819437567   1105920   540M Windows リカバリ環境
/dev/nvme0n1p5 819437568 1600688127 781250560 372.5G Linux ファイルシステム

この順番の理由は、Windowsが作る予約領域をきちんと作成したいというのと、ブートローダ(grub)を持つのはLinuxになるため。

Windowsが入ったディスクがある場合

ノートPCなど、最初からWindowsが入ったディスクの場合、まず回復ディスクを作成し、 その後Windowsのディスクの管理からボリュームを縮小、空のディスクが1つのときと同様に空いた領域にLinuxをインストールする。

2020-06-30

virt-install + cloud-initでUbuntu 20.04をインストールする

Ubuntu 20.04 (focal)のVMをいつもの通りvirt-installと--locationを使ってセットアップしていたら、WARNINGに遭遇したので、気になっていたcloud-initでインストールしてみたところうまくいったのでまとめる。
sudo virt-install (略) --location 'http://ftp.jaist.ac.jp/pub/Linux/ubuntu/dists/focal/main/installer-amd64/' --extra-args 'console=ttyS0,115200n8 serial'
WARNING  Using legacy d-i based installer, that has been deprecated and will be removed in the future. https://discourse.ubuntu.com/c/server

概要

Ubuntu 20.04 ServerのVM「cloudtest」をUbuntu Cloud Imagesのイメージを使って、virt-installでセットアップする。 ディスクは、"vg0"というLVM volume groupにroot用, swap用のvolumeを作成して利用する。

LVMでボリュームの作成

lvcreateでボリュームを作る。
$ sudo lvcreate -n cloudtest-root -L 8G vg0
$ sudo lvcreate -n cloudtest-swap -L 4G vg0

イメージのダウンロードと展開

cloud-images.ubuntu.comからイメージをダウンロードする。QCOW2 Image (v2)形式らしいので、qemu-img convertを使って、rawイメージに変換しつつLVM volumeに流し込む。
$ wget https://cloud-images.ubuntu.com/releases/20.04/release/ubuntu-20.04-server-cloudimg-amd64.img
$ sudo qemu-img convert ubuntu-20.04-server-cloudimg-amd64.img -O raw /dev/vg0/cloudtest-root

cloud-init用の設定ファイルの作成

Ubuntu Cloud Imagesでは、インストーラでの設定入力ではなく、cloud-initで初期設定を行う。 NoCloudデータソースでは、設定内容をイメージから読んでくれるので、それを使う。そのイメージのための設定ファイルをまず用意する。 (詳しくは第561回 ローカルインストール時もcloud-initを活用する:Ubuntu Weekly Recipeを参照)

 今回の主な設定内容は以下の通り。
  • ホスト名
  • ユーザー名・初期パスワード
  • パーティションテーブルの作成
  • ファイルシステムの作成
  • マウントポイントの設定
  • ネットワーク
(その他の例はCloud config examplesを参照)

ファイルにするとこんな感じ。 ここで注意すべきなのは、networkは別ファイルだということと、disk_setupに罠があるということ。

 examplesによく出てくるdisk_setupのlayout: Trueは ドキュメントを読むと、
The layout option specifies how partitions on the device are to be arranged. If layout is set to true, a single partition using all the space on the device will be created.
とのことだが、新しめの環境とmbrでは機能しないので、Trueと同じように100%の領域を使いたい場合は以下のように指定する。
disk_setup:
  /dev/vdb:
    table_type: 'mbr'
    layout:
      - [100]
    overwrite: False
詳しくはBug #1851438 “cloud-init disk_setup fails to partition disk for ...” : Bugs : cloud-initを参照。

設定ファイルが並ぶ感じになると思うので、gitで並べる用のテンプレートを作った。hosts/{hostname}以下にconfigファイルを書いて./build-images.shするとbuild/にできる。 https://github.com/sunnyone/cloud-init-configs

cloud-init用のイメージの作成

cloud-init用のイメージの作成にはcloud-localdsコマンドが便利なので、cloud-image-utilsパッケージをインストールして使う。
$ sudo apt install cloud-image-utils
$ cloud-localds --network-config network-config.yaml user-data.img user-data

virt-installの実行

これで準備できたので、virt-installを実行してVMを作る。
sudo virt-install \
    --name cloudtest --ram 512 --arch x86_64 --vcpus 1 \
    --os-type linux --os-variant ubuntu20.04 \
    --disk path=/dev/vg0/cloudtest-root \
    --disk path=/dev/vg0/cloudtest-swap \
    --disk path=$PWD/user-data.img,device=cdrom \
    --network bridge=br0,model=virtio \
    --graphics none --serial pty --console pty \
    --import
しばらくしたら設定が完了して、sshでログインできる。

cloud-init設定のデバッグ

インストーラと違って対話的でないので、うまくいかないときは積極的なデバッグが必要。 基本的にはログを見ると良くて、ログは以下の場所にある。
  • /var/log/cloud-init-output.log
  • /var/log/cloud-init.log
詳しくはFAQを参照。 イメージごときれいにしなおしても良いが、/var/lib/cloudをきれいにするともう1度走らせることができる。
$ sudo rm -rf /var/lib/cloud/*

cloud-init用のイメージのeject

最後にuser-data.imgを外してあげておしまい。
$ sudo virsh change-media cloudtest sda --eject --config

2016-05-10

Xubuntu 16.04 をインストールして最初に行う設定

Xubuntuは、XFceを使ったUbuntuのフレーバー。ここからダウンロードできる。デフォルトではGNOME2ライクな見た目の画面が使える。


そのままでも使えるのだが、自分はもうちょっとWindowsライクに使いたいので、いつもやっている設定を書いておく。

パネルを下側に移動する(いわゆる「タスクバー」を下に)

デフォルトでは上側にある黒いバー「パネル」には、デフォルトではアプリケーションを呼び出すメニュー、ウィンドウ一覧、インジケータ、時計が置いてある。要はタスクバーのようなものだ。これを下側に移動する。


下側に移動するには、パネルを右クリックし、パネル>パネルの設定を選択し、「パネル」ウィンドウを開く。

そして「パネルをロックする」チェックボックスをオフにして、パネル左側に出る取っ手を掴んで下に移動する。

Whisker Menu を押しやすくする(「スタート」ボタンを作る)

左下にある(左下に移動された)青いボタンを押すといわゆるスタートメニュー的なもの(Whisker Menuという名前らしい)が出てくるが、青いアイコンだけなので押しにくい。領域を増やして押しやすくする。

領域を増やすには、まずWhisker Menuを右クリックして「プロパティ」を選択し、「Whisker Menu」ウィンドウを開く。


「パネルボタン」の「表示」を「アイコンとタイトル」に変更して、「タイトル」を表示するようにする。「タイトル」はデフォルトでは「Application Menu」であるが、これはちょっと大きすぎるので自分は「Start」にしている。

時計の表示内容を変更

右下の時計はデフォルトでは「4 5月, 15:03」みたいな変な感じなので、カスタマイズしてそれっぽくする。

時計の表示内容をカスタマイズするには、時計を右クリックして「プロパティ」を選択して「時計」ウィンドウを表示する。


あとは「表示形式」を「カスタム」に設定し「%m/%d(%a) %H:%M:%S」などとする。選べる値はヘルプボタンを押せば飛べるがhttp://docs.xfce.org/xfce/xfce4-panel/clockを見ればわかる。

クイック起動(ピン)のショートカットを追加

クイック起動やピン留めのように、アプリケーションをパネルから起動したい。

パネルにアプリケーションの起動ボタンを配置するには、Whisker Menuを起動し、アプリケーションを右クリックして「パネルに追加」を選ぶ。

すると、パネル右側にアイコンが現れるので、右クリックして移動を選び、好きな場所に配置する。

これでだいたい定番の設定はおしまい。パネルを右クリックして「新しいアイテムの追加」を選ぶと、他にも増やせるものがあるので、好きに選ぶといいかも(ワークスペーススイッチャーとか)

おまけ: $HOMEのディレクトリを英語にする

デフォルトでは$HOMEに置いてある「デスクトップ」や「ピクチャ」はカタカナでcdしにくい。Xubuntuに限った話ではないが、これでは不便なのでいつもこれをしている。

$ LANG=C xdg-user-dirs-gtk-update

変えていいか確認するウィンドウが現れるので、従えばOK。

おまけ2: キーボードショートカットの変更(2017/6/1追記)

画面では設定>キーボード>アプリケーションショートカットキーから設定できる。

毎回やるのはだるいのでコマンドで覚えておく

# 一覧
xfconf-query -c xfce4-keyboard-shortcuts -lv

# Ctrl+Fn でのワークスペース切り替えを無効化
xfconf-query -c xfce4-keyboard-shortcuts -l | grep '/xfwm4/custom/F' | xargs -l1 xfconf-query -c xfce4-keyboard-shortcuts -r -p

# Ctrl+Alt+Lでのロックを無効化し、Super+Lに変更
xfconf-query -c xfce4-keyboard-shortcuts -p "/commands/custom/<primary><alt>l" -r
xfconf-query -c xfce4-keyboard-shortcuts -p "/commands/custom/<super>l" --create -t string -s xflock4

参考:ターミナルなどからXfceの設定をする

2016-03-15

Rust の開発環境を作る (Ubuntu + Visual Studio Code)

今回はRustとその開発環境のセットアップの仕方について。Ubuntu 14.04環境に、Visual Studio Codeをインストールして、コード補完ができるようになるまで。Ubuntu Makeのところ以外は、Macでも大体同じじゃないかなと思う。


Rust コンパイラまわり

multirustのインストール

multirustは、stableやnightlyなどrust環境を切り替えられるようにするツール。普通にrustcをインストールしてもよいが、便利なのでmultirustで入れておく。

$ curl -sf https://raw.githubusercontent.com/brson/multirust/master/blastoff.sh | sh
(略)
$ rustc --version
rustc 1.7.0 (a5d1e7a59 2016-02-29)

rustc的にはこれでおしまい。

Visual Studio Codeまわり

アーカイブを展開するだけでも良いのだけど、便利なUbuntu Makeツールを使う。

Ubuntu Makeのインストール

$ sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make
$ sudo apt-get update
$ sudo apt-get install ubuntu-make
新しいUbuntuではubuntu-makeのppaはいらないかもしれない。

Visual Studio Codeのインストール

$ umake ide visual-studio-code
(インストールパスを聞かれるけどデフォルトでこんな感じに。)
Choose installation path: /home/yoichi/.local/share/umake/ide/visual-studio-code 

便利なので本来のコマンド名codeでシンボリックリンクを貼っておく。
$ ln -s ~/.local/share/umake/ide/visual-studio-code/code ~/.local/share/umake/bin/code

visual-studio-codeのリンクが壊れているようだけど、Gitでは直っているようなので、少しするとvisual-studio-codeでも起動できるようになると思う。

RustyCode extensionのインストール

VSCodeのRust言語用拡張のRustyCodeをインストールする。codeで起動後、Ctrl+Shift+pでコマンドパレットを起動し、install RustyCodeでインストール。

開発支援ツールまわり(racer, rustfmt)

Codeを起動してRustyCodeで書こうとすると、以下のようにエラーが出るので、必要なツールを入れる。
The "racer" command is not available. Make sure it is installed.

racer (コード補完ツール) のインストール

$ cargo install racer
(略)
  Installing /home/yoichi/.multirust/toolchains/stable/cargo/bin/racer
be sure to add `/home/yoichi/.multirust/toolchains/stable/cargo/bin` to your 
PATH to be able to run the installed binaries
cargoに言われる通りPATHを~/.bashrcなどに設定する

export PATH=$PATH:~/.multirust/toolchains/stable/cargo/bin

その後racerを実行するとわかるが、racerには参照用にRustのソースが必要なので、ダウンロードして適当なところに置いておく。

$ racer
RUST_SRC_PATH environment variable must be set to point to the src directory of 
a rust checkout. E.g. "/home/foouser/src/rust/src"
$ mkdir ~/src
$ wget https://static.rust-lang.org/dist/rustc-1.7.0-src.tar.gz
$ tar zxvf rustc-1.7.0-src.tar.gz

racer用にソースの配置場所を環境変数に設定する(~/.bashrcなどに書く)
export RUST_SRC_PATH=~/src/rustc-1.7.0/src

racerコマンドを叩いてusageが出ればOK。

rustfmt (ソースコードフォーマッター) のインストール

なくてもエラーは出ないが、入れておくとCtrl+Shift+I でコードフォーマットできる。cargo fmtでもOK.

インストールはcargoで。
$ cargo install rustfmt

Hello Worldプロジェクトの作成

試すには、適当にプロジェクトを作成してCodeで開く。
$ cargo new hello --bin
$ code hello &

src/main.rsを適当に編集したら、Ctrl+Shift+Rか、コマンドパレット(Ctrl+Shift+p)からRun Debugで実行できる。

2016-01-10

avahi-browse で mDNS/DNS-SD のホスト・サービスの探索をする

apt-get install avahi-utilsして「avahi-browse -alr」とすればよい。たいした話ではないけれど、多分忘れるので。

出力例はこんな感じ。
$ avahi-browse -alr
+   eth0 IPv6 sample [00:11:22:33:44:55]                      Workstation          local
+   eth0 IPv4 sample [00:11:22:33:44:55]                      Workstation          local
+   eth0 IPv4 Jenkins                                         Web Site             local
+   eth0 IPv4 jenkins                                         _jenkins._tcp        local
+   eth0 IPv4 jenkins                                         _hudson._tcp         local
=   eth0 IPv6 sample [00:11:22:33:44:55]                      Workstation          local
   hostname = [sample.local]
   address = [fe80::82ee:1234:5678:9999]
   port = [9]
   txt = []
=   eth0 IPv4 sample [00:11:22:33:44:55]                      Workstation          local
   hostname = [sample.local]
   address = [192.168.1.152]
   port = [9]h
   txt = []
=   eth0 IPv4 Jenkins                                       Web Site             local
   hostname = [jenkins.local]
   address = [192.168.1.101]
   port = [8005]
   txt = ["version=1.643" "url=http://jenkins.example.local:8005/" "slave-port=46298" "path=/" "server-id=5ca870f7e5eb41888299af4853b2021b"]
=   eth0 IPv4 jenkins                                       _jenkins._tcp        local
   hostname = [jenkins.local]
   address = [192.168.1.101]
   port = [8005]
   txt = ["version=1.643" "url=http://jenkins.example.local:8005/" "slave-port=46298" "path=/" "server-id=5ca870f7e5eb41888299af4853b2021b"]
=   eth0 IPv4 jenkins                                       _hudson._tcp         local
   hostname = [jenkins.local]
   address = [192.168.1.101]
   port = [8005]
   txt = ["version=1.643" "url=http://jenkins.example.local:8005/" "slave-port=46298" "path=/" "server-id=5ca870f7e5eb41888299af4853b2021b"]

2015-12-13

Loqui 0.6.4 リリース

今回のリリースは主に、昨晩の「Ubuntu 15.10 リリース記念オフラインミーティング 15.12」のあとの飲み会で、@ut_maito氏が初めて使っているところを見て、使いにくそうに見えた部分のうち、さらっと改善できそうな部分についての対応です。バグを見つけたので併せて直しました。

主な変更点はこんなかんじ。

* Shift+Enterで送信する機能の追加
→複数行モードのときキーボードで送信する手段がなかったので送信できるようにした。すでにCtrl+Enterは1行モード時にNOTICEとして送信にしていたので、Shift+EnterでPRIVMSGで送信。1行の側もShift+Enterで送信できるようにして、どちらもCtrl+EnterでNOTICE / Shift+EnterでPRIVMSGになるよう統一した。

* 初回起動時にアカウント設定ダイアログを表示
→最初に何していいかわからない感じが強く出ていたので、手っ取り早くできそうなところで、最初に使うことになるアカウント設定ダイアログを出すことにした。

* アカウント削除時にクラッシュするバグの修正
→アカウント設定の検証をしていたら、アカウント削除で落ちることがあるバグを見つけたので修正。

* アカウント設定からプロトコル選択の削除
* 不要な「ツール」メニューの削除
→拡張用に若干複雑なUIになっていたのだけど、多分追加しないので削除。プロトコル選択画面で選べるIP Messenger機能は若干実装されていたのだけど、使っている人はいないよね。


初回起動時はチャンネルバッファの部分が余っているので、ここにガイド的なことを書いてあげたいなぁと思ったのだけど、だいぶ拡張がいりそうなので見送り。

キー(Ctrl+↑/Ctrl+↓)でチャンネルを選択すると、チャンネルツリーの選択部分がわかりにくいという話もあったのだけど、直そうとするとややこしそうなので見送り。手元のCinnamonだと起きないので、テーマに依ってしまう部分もある。

こんなんだけど、ちょっとでもわかりやすくなってるといいな。

2015-11-08

失われたUEFIブートエントリを取り戻す(Ubuntu インストールメディアから)

ある夕暮れ。VT-xを有効にすべくBIOS設定画面をいじっていて、再起動しようと思って「Reset」ボタンを押したら、再起動ボタンではなくFactory Resetボタンだった。設定が工場出荷時に戻されるのはまぁ戻せばいいのだけど、問題はブートエントリまで消されてしまったために、Ubuntuが起動できなくなってしまったということだ。

危険なResetボタン

update-grubすれば万事OKよね、と思っていたがそうでなかったので、UbuntuのUSBメモリを使って復旧する手順を記録しておく。

復旧手順

「Rescue a broken system」でレスキューモード起動

 Ubuntu 14.04 Server のUSBメモリをUEFIで起動すると、grubメニューが現れる。その中の「Rescue a broken system」を選んで起動する。

Serverなのは手元にあっただけで、Desktopなら普通のliveブートできるからもうちょっと楽かもね。

rootをインストール先にしてshell起動

言語だとかを選びウィザードを進めていくと、ルートファイルシステムを選ぶ画面が現れるので、Ubuntuをインストールしたパーティション、例えば/dev/sda6を選択後、「Execute a shell in /dev/sda6」を選んで、シェルを起動する。

efibootmgrでエントリが存在しないことを確認

efibootmgr あるいは efibootmgr -v(-vは詳細情報を表示)と叩くと、記録されたブートエントリの一覧が確認できる。

以下は例。長いID他が出ているが本筋ではないので省略した。
# efibootmgr -v
BootCurrent: 0015
Timeout: 0 seconds
BootOrder: 0000,0012,0013,0014
Boot0000* Windows Boot Manager HD(2,fa800,82000,(略))File(\EFI\Microsoft\Boot\bootmgfw.efi)WIND
OWS.........x...B.C.D.O.B.J.E.C.T.=.(略)
Boot0010  Setup FvFile((略))
Boot0011  Boot Menu FvFile((略))
Boot0012* Built-in Storage Device VenMsg((略))
Boot0013* USB Device VenMsg((略))
Boot0014* Network VenMsg((略))
Boot0015* Onetime Boot Device VenMsg((略))
Boot0016* VaioNextBoot Device VenMsg((略))
UbuntuやLinuxらしき項目は見つけられない。

/boot/efiにEFIパーティションをマウント

ブートローダが格納されているパーティションを/boot/efiにマウントする。今回は/dev/sda2なので以下の通り。
# mount /dev/sda2 /boot/efi
パーティションがどこなのかは、fdisk -lやparted /dev/sdX print、efibootmgr -vの出力、/etc/fstabの記述などから判断する。

grub-installによる復旧

grub-installでブートローダをインストールする。
# grub-install --bootloader-id ubuntu /dev/sda
もっとローレベルにefibootmgr -cでもできると思うが、試していない。

efibootmgrによる確認

efibootmgr -vを実行し、ubuntuの行があること、その行がBootOrderの先頭にあることを確認する。
# efibootmgr -v
BootCurrent: 0015
Timeout: 0 seconds
BootOrder: 0001,0000,0012,0013,0014
Boot0000* Windows Boot Manager HD(2,fa800,82000,(略))File(\EFI\Microsoft\Boot\bootmgfw.efi)WIND
OWS.........x...B.C.D.O.B.J.E.C.T.=.(略)
Boot0001* ubuntu HD(2,fa800,82000,(略))File(\EFI\ubuntu\shimx64.efi)
Boot0010  Setup FvFile((略))
Boot0011  Boot Menu FvFile((略))
Boot0012* Built-in Storage Device VenMsg((略))
Boot0013* USB Device VenMsg((略))
Boot0014* Network VenMsg((略))
Boot0015* Onetime Boot Device VenMsg((略))
Boot0016* VaioNextBoot Device VenMsg((略))

これで再起動して、Grubメニューが出てきたら成功。

参考:Restore Ubuntu UEFI Boot Entries after BIOS Update
---

このブートエントリ飛ばしちゃった問題は某co-edoで起きていたのだけど、うっかり復旧しようとしてたら確実にこれで時間を使いきっていた。あきらめて正解であった。

2015-11-03

MSI N3150I ECO と Ubuntu 14.04.3 の罠

以下の構成でPCを組んだ。用途によっては良い構成だと思うので、後々の参考のためメモ。

M/B(CPU)MSI N3150I ECO (Celeron N3150 Braswell)
メモリCrucial 4GB DDR3-1600 SO-DIMM 1.35V CL11 (CT51264BF160B)
HDDHGST 2.5" 500GB/5400rpm (0S03794)
ケースIN WIN IW-BM639余ってたやつ
ケースファンAinex OMEGA TYPHOON 8cm/15mm厚 (2000rpm/25.26cfm/20.4db)

第385回 Celeron N3150で省エネPC生活:Ubuntu Weekly Recipe」では、いくや先生が「IW-BP671/300B」で組んでいるのだけど、うちの「IN WIN IW-BM639」はそれのずっと昔のモデルだと思う。多分「Wavy II(IW-BMR651)」が現行モデルで、ちょっとずつデザインを変えながら生き続けている模様。このサイズで3.5"ドライブを2つ格納する場所がある上、ロープロファイルの拡張カードが挿せるのはオンリーワンだと思うのでIN WINには引き続き作って頂きたい。(拡張スロットが2つついていても、Micro-ATXが入るわけではないだろうし、Mini-ITXだとつけようがないと思うのだけど、一体何がささるのだろうというのはあるが。)

メモリは別の構成用に検討したので1.35Vになってるだけで1.5V使えるらしいし、HDDも3.5インチ入るのに2.5インチなのは単に静かそうだからってだけ。

しかし、ここまで到達するのに紆余曲折あったので、順番がおかしいのだけど、はまりそうな順に。

罠1: インストーラがインストールメディアを認識しない

Ubuntu 14.04 (14.04.3) をインストールしたのだけど、ちょっとだけコツがある。インストール中にCD-ROM(USBメモリ)の認識に失敗する(「cd-rom couldn't be mounted」というメッセージが表示される)ので、Alt+F2でコンソールに降りて以下のコマンドを叩いた後、インストーラ画面に戻ってボタンを押すとなぜか進む。Braswellのせい?USBメモリの作り方が悪い?

# df
→/mediaがマウントされている場所を確認。ここではsdb2とする。
# umount /media/
# mount /dev/sdb2 /cdrom

参考:debian - Unattended installation of Ubuntu from USB drive -- Not mounted correctly - Server Fault

罠2: ケースファンとメモリモジュールが当たる

写真の通り、メモリスロット1の位置とケースファンを設置する位置が近いので、もともとつけていたよくある25mm厚のファンだと干渉して配置することができなかったので、15mm厚のファンに取り替えた。ケースファンなんてなくてもいけそうな構成だけど一応つけてみた。スロット2があるからそっち使えば?と思うかもしれないが、1枚しか挿さない場合は1のほうに挿すことになっているらしいのだ。
写真はうまく入っている15mm厚のファンをつけた場合。マザーボードとケースの板までの間隔は20mm程だったので、それ以下でないとあやしい。

罠3: ASRock N3150-ITX には ATX12V がない(拡張カードを使うには電力不足)

最初は、Weekly RecipeにあわせてASRockで組んでいたのだけど、PCI-E x1スロットはあるものの、拡張カードによってはドライブできない(できなかった)のでやめた。N3150-ITXにはATX12V (「田」の形をしているコネクタ)がないので、PCI-Expressへの電力が足りないのだと思う。拡張カードを挿す予定ならこのMSI N3xxI ECOが良いと思う。

パフォーマンス

別に期待してないからどうでもいいのだけど、CPU性能はどんなもんかなと思ってうちの子達とsysbenchを使ってざっくり測ってみた。

「sysbench --test=cpu --cpu-max-prime=20000 --num-threads=$I」のtotal time。数値が小さいほど処理にかかった時間が短い。

CPU / --num-threads124
Atom CPU N270 @ 1.60GHz (2008, Diamondville, 1C/2T, 2.5W) 341.3614207.2697207.3816
Celeron N3150 @ 1.60GHz (2015, Braswell, 4C/4P, 6W) 52.550225.218112.5651
Core2 Duo P8600 @ 2.40GHz (2008, Penryn, 2C/2T, 25W)32.207717.155417.1533
Core i7-5500U CPU @ 2.40GHz (2015, Broadwell, 2C/4T, 15W)25.021812.93997.7414
Core i5-3570S CPU @ 3.10GHz (2012, Ivy Bridge, 4C/4T, 65W)22.27211.44816.2018
Core i7-4790S CPU @ 3.20GHz (2014, Haswell Refresh, 4C/8T, 65W)20.589310.54065.5582

整数演算だけ見てもなぁというところだけど、ざっくり。カテゴリ的には上の表でめちゃくちゃ遅いN270と似たような立ち位置になると思うのだけど、さすがに年代が進んでかなり速くなっているといえる。

ちなみに計測はこんな感じでやった。1回の結果しか使わない雑っぷり。


[2016/5/10 追記]
別の環境でも試してみた。
CPU / --num-threads124
Core i7-2700K @ 3.50GHz (2011, Sandy Bridge, 4C/8T, 95W)22.533811.50435.9518
Core i7-6700K @ 4.00GHz (2015, Skylake, 4C/8T, 91W)17.67738.84584.4978

消費電力

大事な消費電力はどうかと思ってワットチェッカーで計測してみると、起動時19W, 通常時15Wだった。起動時高いのは、HDDを使っているせいだろう。sensors読みで温度的にも40度いくかどうかって感じ。非常に省エネで、こっちのほうが重要なので満足。

2015-10-22

UbuntuからローカルのLinux KVM上のWindowsにリモートデスクトップする環境を作る

今回は、Ubuntu DesktopにLinux KVMを構成し、その上にWindowsをインストールし、Desktopの側からリモートデスクトップ(RDP)で接続する環境を作る方法について。絵にするとこういう環境。



「普通Windows上にLinuxじゃないの?」と思うかもしれないが、 Windowsのリモートデスクトップは優秀なので、Windows上にVirtualBoxでLinux desktopを上げるよりは快適に使うことができるので、どちらも使いたい環境では個人的には気に入っている使い方である。

前提として、Ubuntu Desktop 14.04がセットアップされているものとする。なお、今となっては同じことGUIでもできるじゃん?と思う手順もあるが、動くなら全然そっちで構わないと思う。断片的に作業してる部分があるので、ちょっと足りてない話があるかも。

こだわらない手順ざっくり版

長くなってしまったので、なくてもいい部分を省いたざっくり手順を先に記載。ピンとこなければ、詳しくを参照。

  • Intel VT/AMD-VをBIOSで有効化 (詳しく)
  • sudo apt-get install qemu-system qemu-kvm libvirt-bin virt-manager (詳しく)
  • sudo virt-managerを実行し、localhostを右クリック→「新規」からVMをウィザードで追加 (詳しく:特にWindows10の場合)
  • VMにWindowsをインストールし、リモートデスクトップを構成。振られるIPを確認 (詳しく)
  • sudo apt-get install remmina-plugin-rdpし、remminaで「TLS」に設定してWindowsに接続 (詳しく)

ここからは、もう少し詳しい+やったら良いかもしれない手順。

初期設定

VMを作成する前に一度だけ必要になる作業。

BIOSの設定

KVMを使うので、Intel VT (Intel Virtualization Technology) のようなCPUの仮想化支援機能をBIOS上で有効にしておく。

ブリッジを構成する(必要であれば)

デフォルトのNATでは都合が悪い場合、VM用のネットワークを設定する。自分の環境ではホストNICを含むブリッジネットワークを作るのが便利なことが多いので、ホスト側にブリッジを構成してしまう。…と思っていたが、デフォルトで作成されるvirbr0 (192.168.122.0/24) のネットワークで十分かも。なお、後述の仮想マシンマネージャー(virt-manager)のGUIでも作れそうだが、やったことはない。

bridge-utilsパッケージをインストール。
sudo apt-get install bridge-utils

/etc/network/interfacesを例えば以下のように設定する。

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        bridge_ports eth0
        address 192.168.1.X
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.254
 dns-nameservers 192.168.1.254

VMイメージ用のLVMの構成(お好みで)

VMのイメージはデフォルトでは/var/lib/libvirt/imagesに普通のファイルとして作られるので、ここの容量が十分にあれば別に使えるのだが、ファイルで取るよりLVMでブロックデバイスとして切り出してあげたほうが効率的と思うので、この構成を取るときはLVM用のパーティションを切ってLVM Volume Group vg0を作ることにしている。

ここでのパーティション構成はこういう形と想定する(本当は別ディスクにしたい)。


上記の前提のため、sda3をPV (Physical Volume)とし、それだけを含むvg0を作る。

$ sudo apt-get install lvm2
$ sudo pvcreate /dev/sda3
$ sudo vgcreate vg0 /dev/sda3

KVM関連ソフトウェアのインストール

qemu-kvm単体で使うのはさすがにしんどいので、libvirtを使って管理する。その管理用GUIであるところの仮想マシンマネージャー(virt-manager)も入れる。
$ sudo apt-get install qemu-system qemu-kvm libvirt-bin virt-manager

なお、Webで管理したい場合は「KVMの仮想マシンをWebブラウザから管理する」の記事を参照。

virt-managerを起動するときは
$ sudo virt-manager
とする。

仮想マシンマネージャー(virt-manager)からのストレージ・ネットワークの設定(お好みで)

virt-managerを起動し「localhost」をダブルクリックすると、ホストの設定画面がでてくる。ここで「仮想ネットワーク」「ストレージ」「ネットワークインタフェース」タブを選ぶと、それぞれの設定ができる。私は使っていないが、うまく使えば便利かもしれない。

VMの作成

VMを作成するごとに必要になる作業。基本的にはひとつだけだと思うが、複数使う場合はここを繰り返す。

VMイメージの作成(LVMを使ったとき)

LVM(かつvirt-managerでストレージの構成を行っていないとき)は、事前にストレージを作っておく。
$ sudo lvcreate -L 48G -n win1 vg0
win1の部分はVM名あるいはVM名-rootなどを入れることが多いが、名前なのでわかればなんでもいい。

仮想マシンの追加

ISOイメージを準備した後、virt-managerを起動し、localhostを右クリックして「新規」を選択。ウィザード画面が表示されるので聞かれる情報を入れていくだけ。

入力の注意点は以下の通り。

・OSはWindows, Windows 7を選ぶ(7なのはそれ以降の項目がないので。できたら選ぶ。Vista以前は使わないですよね?)

・メモリ容量、ディスク容量ともに適切に増やす。

・LVM(略)を使った場合、ストレージで既存のストレージを選択するを選び、先ほど作ったLVのパスを入力する。



・ウィザードの最後の画面で、詳細オプションを表示し、必要なネットワーク、例えば「ホストデバイス br0」を選択する。

なお、Windows 10のときは、ウィザードの最後で「インストール前に設定をカスタマイズする」を選択し、CPUを適切に選ばないと(例えばCore2 Duo)エラーで立ち上がらないみたい。


参考:仮想環境(KVM)でのwindows10が、一度起動した後リブートすると起動しなくなる (症状は違うが、この対処と同様にCPUを変更すると動作が変わる)

Windowsのインストール

virt-manager上から淡々とインストールする。リモートデスクトップを有効にする。必要であれば普通にIPアドレスを設定する(デフォルトのNATだと192.168.122.0/24のIPが振られていると思う)。このマシンにIPアドレスで接続しにいくので、設定しなくても確認をしておく。

VMの起動・停止

もちろんGUIからもOn/Offできるのだが、普段リモートデスクトップからの接続となるので、ターミナルからの起動・停止も覚えておくと便利。

確認
$ sudo virsh list --all

起動
$ sudo virsh start win1

停止
$ sudo virsh destroy win1


リモートデスクトップ接続

上記でVMができたら、ホスト側から接続する。

Remminaを使う方法

普通にRemminaを使うのであれば、apt-get installして起動して設定画面で設定すればOK。

$ sudo apt-get install remmina remmina-plugin-rdp

ただし「リモートデスクトップの設定」の「高度な設定」にある「セキュリティ」の項目がデフォルトの「ネゴシエーション」だと、最近のWindowsには接続できないので、他の項目、例えばTLSに変更する。


なお、RemoteFX を選ぶと、RDPの品質の設定でフォントスムージングが有効でも有効にならないので、それ以外、例えばTrue Color 32bitを選ぶこと。また、品質は最高(最低速)を選ぶこと。

xfreerdpを使う方法

Remminaを使うのはお手軽で良いのだが、アンチエイリアスが効かないのでガタガタで悲しい。しかし、xfreerdpを使うと有効にできる。
追記: と思っていたが、上述の通り品質でフォントスムージングを選んでおき、RemminaでもRemoteFXを選ばなければ有効になる模様。xfreerdpの手順も一応残しておくが、Remminaでいいと思う。

$ sudo apt-get install xfreerdp-x11

毎回コマンドを打つのはだるいので、以下のようなシェルスクリプトを置いて起動することにしている。パスワード入力をssh-askpassを使うのはちょっとチート気味。



---

これで設定方法と使い方はおしまい。両方使う方は試してみてはいかがか。

2015-05-11

boot2docker を Linux + KVM で使う

管理の都合上Docker用のVMの上でDockerコンテナを動かしたいなー、Dockerコンテナ動かすだけなら薄いやつがいいだろうからboot2dockerかなーと思ったのだけど、WindowsとMac OS Xで動かす例ばかりでLinuxで動かしている話を見かけない。使えないわけではなく、isoから入れれば使えそうなのでやってみた。なお今回の前提はKVMだけども、boot2dockerをカスタマイズしたいとなれば、Hyper-VやVirtualBoxでも設定の部分は参考になるかも。

手順の概要

概ねやりかたは以下の通り。
  • 永続化データ領域を確保・設定する。
  • virt-installでVMを作成する。
  • IPアドレスやSSHなどの設定をする。
  • リモート接続用の鍵を取り出して使う。

環境

ハイパーバイザ
Ubuntu 14.04 (libvirt/KVM設定済)
boot2docker
1.6.1
ここで試したのはUbuntuだけど、今回の例ではvirt-installが使えればだいたい一緒だと思う。

注意

boot2dockerはデフォルトではかなりinsecure (固定デフォルトパスワードあり・SSHパスワードログイン可) なので、信頼できないネットワーク、例えばインターネットに直接晒されるような環境で作業しないこと。

データ保存領域の設定

boot2dockerはOS部分となる揮発性の領域と、永続的なデータ保存領域(dockerイメージ格納領域を含む)で動作する。そのため、VMを立ち上げる前にデータ保存領域を事前に準備する。揮発性の部分の領域も用意してもいいのだが、今回はしないことにする。

やりかたとしては、qemu-imgで領域を確保し、partedでパーティションを切り、mkfs.ext4でファイルシステムを作成する。このとき、"boot2docker-data"というラベルを設定することがポイント。boot2dockerはこのラベルを見てマウントしに来る。

コマンドライン例は、以下の通り。2Gと書いてみたけど、dockerコンテナのデータが全て来るので、適切なサイズに設定する。
# qemu-img create -f raw /home/images/boot2docker-data.img 2G
# chmod 600 boot2docker-data.img

# losetup -f
/dev/loop0
# losetup /dev/loop0 boot2docker-data.img
# parted --script /dev/loop0 'mklabel msdos'
# parted --script /dev/loop0 'mkpart primary 0% 100%'
# mkfs.ext4 -L boot2docker-data /dev/loop0p1 
# losetup -d /dev/loop0

mkpartで、0の代わりに0%とすると、アラインメントをよしなにしてくれる(警告はなくなるが意味はあるか?)。コマンドが短いのでpartedを使っただけで、fdiskでもいいし、再起動回数が増えるけどもboot2dockerが上がってきた後fdiskを使うとlosetupはしなくていい。

なお、LVMを使うなら、qemu-imgの代わりに、lvcreateでこんな感じ。
# lvcreate -L 8G -n boot2docker-data vg0

virt-installでVM作成

まず、boot2dockerのisoをどこかにダウンロードする。ずっと使うのでうっかり消さなそうな場所に。ここでは、/home/images/boot2docker.isoにダウンロードしてきたのを想定する。

そして、libvirtでVMを作成する。libvirtのXMLを自前で生成する例を見かけたけども、virt-installがやってくれるので、virt-installで作る。

例としては、こんな感じ。
# virt-install --name=boot2dockertest --ram=1024 --vcpus=1 \
   --os-type=linux --os-variant=virtio26 \
   --disk path=/home/images/boot2docker-data.img \
   --network bridge:br0 \
   --livecd --cdrom=/home/images/boot2docker.iso 
この--livecdをつけないと、初回だけCDがある状態になって、2回目の起動以降起動できなくなる。

さまざまな設定

これでboot2dockerが立ち上がってくる。virsh console VM名(ここではboot2dockertest)とすれば、コンソールに接続でき、dockerなどとユーザー名を入れればログインできる。poweroffコマンドでシャットダウン。

このように、/var/lib/{boot2docker,docker}が/mnt/vda1に向いていれば、データ領域の準備もOK。
docker@boot2docker:~$ df
Filesystem                Size      Used Available Use% Mounted on
rootfs                  445.5M     87.5M    358.0M  20% /
tmpfs                   445.5M     87.5M    358.0M  20% /
tmpfs                   247.5M         0    247.5M   0% /dev/shm
/dev/vda1                 1.9G     18.0M      1.8G   1% /mnt/vda1
cgroup                  247.5M         0    247.5M   0% /sys/fs/cgroup
/dev/vda1                 1.9G     18.0M      1.8G   1% /mnt/vda1/var/lib/docker/aufs
docker@boot2docker:~$ ls -al /var/lib
total 0
drwxrwxr-x    3 root     staff          100 May  9 15:26 ./
drwxrwxr-x    8 root     staff          180 May  9 15:26 ../
lrwxrwxrwx    1 root     root            29 May  9 15:26 boot2docker -> /mnt/vda1/var/lib/boot2docker/
lrwxrwxrwx    1 root     root            24 May  9 15:26 docker -> /mnt/vda1/var/lib/docker/
drwxr-xr-x    4 root     root           160 May  9 15:26 nfs/

ここから、いろいろと設定していく。

hostnameの設定

/var/lib/boot2docker/etc/hostname を変更する。データ保存領域にあるので、書き換えればOK.
$ sudo vi /var/lib/boot2docker/etc/hostname 

sshd_configの設定

パスワードログインできないように設定する。こちらも書き換えればOK.
$ sudo vi /var/lib/boot2docker/ssh/sshd_config
(以下を変更/追記)
PasswordAuthentication no 

ssh 公開鍵の配置

ssh ログインできるよう、公開鍵を配置する。作業用ユーザである「docker」のホームディレクトリは永続化されないので、boot2dockerの「/var/lib/boot2docker/userdata.tarを置いておくとホームディレクトリに展開される」という機能を利用して、SSH鍵を配置することにする。

公開鍵の取り方はなんでもいいが、ここではgithub.com/{username}.keysにアクセスするとそのユーザの公開鍵が得られるという方法で鍵を取ってみる例を載せる。

$ cd /var/lib/boot2docker
$ sudo mkdir userdata
$ sudo chown docker userdata
$ cd userdata
$ mkdir .ssh
$ chmod 700 .ssh
$ cd .ssh
$ curl -o authorized_keys https://github.com/{username}.keys
$ cd /var/lib/boot2docker/userdata
$ tar cf ../userdata.tar .

起動時スクリプトの設定(IPアドレス他の設定)

デフォルトでは、dhcpでIPアドレスをもらうだけなので、固定IPアドレスにしたいときは、設定が必要になる。boot2dockerの「起動時に/var/lib/boot2docker/bootsync.shとbootlocal.shが呼び出される」という機能を利用して、スクリプトにIPアドレス他を設定するコマンドをいれておくことにする。bootsync.shは/etc/rc.d/dockerが起動される前、bootlocal.shは後に動くので、先に動くbootsync.shに設定する。

例は以下の通り。boot2dockerのVMのIPアドレスは192.168.1.100と仮定する。
$ sudo vi /var/lib/boot2docker/bootsync.sh
(以下を記述)
#!/bin/sh
/etc/init.d/services/dhcp stop
ip addr flush eth0
ip addr add 192.168.1.100/24 dev eth0
ip route add default via 192.168.1.254
echo "nameserver 192.168.1.254" >> /etc/resolv.conf

$ sudo chmod 755 /var/lib/boot2docker/bootsync.sh

リモート接続用の鍵の再生成

初回起動時に/var/lib/boot2docker/tls/にリモート接続用の鍵が生成されて、必要なものが~/.dockerにコピーされているが、IPアドレスが含まれているので、再生成する。生成の方法は/etc/rc.d/dockerに書いてあるが、簡単にするため、いったん消して再起動時に作らせてしまうことにする。
$ sudo rm -rf /var/lib/boot2docker/tls

あとは、rebootで再起動して設定が反映されていることを確認する。

リモート接続用の鍵の取り出し

このままboot2dockerのVMでdockerコマンドを叩いても使えるが、作業用のPCからdockerコマンドで接続できるようにすると便利。先ほど生成させたキーを、作業用のPCにscpでもらってくる。

$ mkdir -p ~/.boot2docker/certs/boot2dockertest
$ scp 'docker@192.168.1.100:~/.docker/*.pem' ~/.boot2docker/certs/boot2dockertest

あとは、ここに接続するための環境変数を設定するスクリプトを用意して、dot sourceして使えばOK。
$ vi ~/bin/use-boot2dockertest
export DOCKER_CERT_PATH=~/.boot2docker/certs/boot2dockertest
export DOCKER_TLS_VERIFY=1
export DOCKER_HOST=tcp://192.168.1.100:2376
$ . ~/bin/use-boot2dockertest

これで一通りの設定が終了。例えばこんな風に動かして、VM上でdocker psすると、boot2docker VMで動いていることがわかる。dockerのバージョンが合ってないとつながらなかったりするので注意。
$ boot2docker run ubuntu:14.04 -i -t /bin/bash

今後の展開

もう少しスクリプト化することもできるのだろうけど、それはDocker Machineの仕事だよねと思ってやめた。Docker Machineがlibvirtに対応すれば、ほとんどの作業を一通りやってくれるはずなので期待して続報を待とう。

2015-04-07

シェルスクリプトでゲームパッドのボタン入力をキー入力に変換する

ステップオーバーやステップインなどの作業はF7, F8などにバインドされていることが多いが、IDEによって異なるので、Windowsではゲームパッド/ジョイスティックのボタン入力にバインドしていた。Ubuntuでも同じようなことがしたいなぁと思ってやってみた。最終的なキーの対応は、こんな感じ。


パッケージのインストール

ツールが入っている「joystick」パッケージと、GUIで確認できる「jstest-gtk」パッケージをインストールする。
# apt-get install joystick jstest-gtk
これで、jstest-gtkコマンドが使えるようになるので、GUIで見ながら動作するかどうかを確認する。マッピング変更もできるらしい。jstest /dev/input/js0 などとすると、コマンドラインでも確認できる。

普通の使い方

さらに「xserver-xorg-input-joystick」パッケージをインストールし、Xを再起動すると、スティックがマウスカーソルに、ボタンがマウスボタンのように使えるようになる。Xの設定やら、xbindkeysの設定などすればそれはそれで良い感じで使えると思う。が、今回は消した。

シェルスクリプトで処理する

ただ、Xの入力に変換すると、どこのインプットデバイスから来たのかなど設定が面倒そうなので、(cf. Multiple keyboards)今回はシンプルにシェルスクリプトと先ほどのjstestコマンド、それからキー操作がコマンドでできるxdotoolコマンドでやることにした。

jstest --event /dev/input/js0 とすると、以下の感じで1行1イベントで飛んでくる。type 1がボタンのイベントで、numberがボタンの番号、valueがpress/releaseを意味している。type 2は軸の動作。

releaseだけ見ておけば使える感じになったので、こうなった。

sedにはバッファしない-uオプションを忘れないようにしないと、流れてこなくなる。

Pythonで処理する(おまけ)

jaraco.inputで一応できたけど、余計なイベントが飛んでくる感じだったので、もう少し気合を入れて実装しないといけなそうだった。今回は、コマンド実行するだけなのでシェルスクリプトで行くことにした。なお、pipでインストールできるjaraco.input 1.0.1はバグっていて、コンストラクタの処理を肩代わりしないといけないのに注意。最新版はもう少し頑張っている模様。

2015-04-03

Ubuntu 14.04でLogicool TrackMan Marbleを左利き設定で使う

たまにやってくる右手の指の付け根の痛みが来たので、緩和策を打つべくトラックボールを買ってきた。機種は、Logicool TrackMan Marble

普通に右利き用としてはそこそこ機能するのだけど、左手で使いたいので、左手用に設定する。

Xの設定

 /usr/share/X11/xorg.conf.d/20-trackman.conf
Section "InputClass"
  Identifier "Marble Mouse"
  Driver "evdev"
  MatchProduct "Logitech USB Trackball"
  MatchDevicePath "/dev/input/event*"
  MatchIsPointer "yes"
  Option "ButtonMapping" "3 2 1 4 5 6 7 8 9"
  Option "EmulateWheel" "true"
  Option "EmulateWheelButton" "9"
  Option "YAxisMapping" "4 5"
  Option "XAxisMapping" "6 7"
EndSection

最初のほうはこのマウスにマッチさせる設定。

Option "ButtonMapping"は、1 2 3 4 5 6 7 8 9の物理ボタンを、どのボタンとして割り振るかという設定。今回は3と1、すなわちleft clickとright clickを交換する。
元のボタンは、1=左ボタン(大)、3=右ボタン(大)、8=左ボタン(小)、9=右ボタン(小)。詳しくはArch Wikiを参照。

EmulateWheel以下は、「9」すなわち右ボタン(小)を押しながらボールを操作することによって、上下左右のスクロールをできるようにする設定。

設定の確認

これが効いていることの確認。

xinput listでデバイスを探しだす。
$ xinput list
⎡ Virtual core pointer                     id=2 [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer               id=4 [slave  pointer  (2)]
⎜   ↳ Logitech Unifying Device. Wireless PID:402d id=11 [slave  pointer  (2)]
⎜   ↳ Logitech USB Trackball                   id=12 [slave  pointer  (2)]
⎣ Virtual core keyboard                    id=3 [master keyboard (2)]
    ↳ Virtual core XTEST keyboard              id=5 [slave  keyboard (3)]
    ↳ Power Button                             id=6 [slave  keyboard (3)]
    ↳ Video Bus                                id=7 [slave  keyboard (3)]
    ↳ Power Button                             id=8 [slave  keyboard (3)]
    ↳ USB Keyboard                             id=9 [slave  keyboard (3)]
    ↳ USB Keyboard                             id=10 [slave  keyboard (3)]
    ↳ Eee PC WMI hotkeys                       id=13 [slave  keyboard (3)]

id=12だとわかる。あとはxinput get-button-mapで確認する。
$ xinput get-button-map 12
3 2 1 4 5 6 7 8 9 
3と1が入れ替わっていることがわかる。

ちなみに、xinputには他の機能もある。set-button-mapにすれば一時的に設定を変えることも可能だし、list-propsで詳しい情報を得ることも可能だ。
$ xinput list-props 12
Device 'Logitech USB Trackball':
 Device Enabled (143): 1
 Coordinate Transformation Matrix (145): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
 Device Accel Profile (275): 0
 Device Accel Constant Deceleration (276): 1.000000
 Device Accel Adaptive Deceleration (277): 1.000000
 Device Accel Velocity Scaling (278): 10.000000
 Device Product ID (264): 1133, 50184
 Device Node (265): "/dev/input/event16"
 Evdev Axis Inversion (279): 0, 0
 Evdev Axes Swap (281): 0
 Axis Labels (282): "Rel X" (153), "Rel Y" (154)
 Button Labels (283): "Button Left" (146), "Button Middle" (147), "Button Right" (148), "Button Wheel Up" (149), "Button Wheel Down" (150), "Button Horiz Wheel Left" (151), "Button Horiz Wheel Right" (152), "Button Side" (268), "Button Extra" (269)
 Evdev Middle Button Emulation (284): 0
 Evdev Middle Button Timeout (285): 50
 Evdev Third Button Emulation (286): 0
 Evdev Third Button Emulation Timeout (287): 1000
 Evdev Third Button Emulation Button (288): 3
 Evdev Third Button Emulation Threshold (289): 20
 Evdev Wheel Emulation (290): 1
 Evdev Wheel Emulation Axes (291): 6, 7, 4, 5
 Evdev Wheel Emulation Inertia (292): 10
 Evdev Wheel Emulation Timeout (293): 200
 Evdev Wheel Emulation Button (294): 9
 Evdev Drag Lock Buttons (295): 0

GNOMEの左手設定の罠

上記のget-button-mapで、以下のように1と3が入れ替わっていないことがある。
$ xinput get-button-map 12
1 2 3 4 5 6 7 8 9 
1と3以外なら変更が効く、大変に腹立たしい状況。

こんなことがないか検索したところ、mouse - X11/Gnome/TrackPoint: custom button mapping not working - Super Userという記事に情報があったので、期待を膨らませて実行するも変わらず。
$ gsettings set org.gnome.settings-daemon.plugins.mouse active false

だいぶ悩んだが、「マウスとタッチパッド」設定の「左利き」に関係があるだろうと思い、変更してgsettings list-recursivelyのdiffを取ってみると、org.cinnamonなんちゃらというキーが変わっていることに気付き、まさかと思って探してみるとgnomeをcinnamonに変えただけのキーが存在したので、以下を実行して解決。
$ gsettings set org.cinnamon.settings-daemon.plugins.mouse active false
悲しい結末だった。


2014-09-26

Linux版HipChatで日本語入力できないときの対処(Ubuntu + 野良Qt5アプリで日本語入力)

Linux版HipChatで日本語入力ができなくて、最初そんなもんかと思ったけど追っかけてみたら直せた。
結論的にはださいがこれでいけた:

今回はこうだったが、実際は環境によっていろいろだと思うので、進め方を残しておく。

環境

Distribution
Ubuntu 14.04 Japanese Remix (amd64)
Desktop 環境
Cinnamon →第342回 デスクトップ環境Cinnamonを使用する:Ubuntu Weekly Recipeを参照

Qt5での日本語入力に必要なこと

Qt5でbuildされた QtCreatorで日本語入力をできるようにする(@Linux環境) によると、どうやら2つのことが必要らしい。
  • 環境変数QT_IM_MODULEの設定
  • platforminputcontextsプラグインの配置(or 環境変数でプラグインパスの変更)

対象アプリケーションの構成の確認

HipChatのインストール方法はHipChat - Downloadsに書いてある通り、apt-lineを追加してapt-get install。つまり、公式ではない野良アプリケーション。

以下のコマンド出力からわかるように、自前でQt5ライブラリを抱えており、シンボリックリンク"/usr/bin/hipchat"からのbash script "/opt/HipChat/bin/hipchat"からの/opt/HipChat/lib/hipchat.binで起動するようになっている。
$ dpkg -L hipchat
/usr
/usr/bin
/usr/share
/usr/share/applications
/usr/share/applications/hipchat.desktop
/usr/share/icons
/usr/share/icons/hicolor
/usr/share/icons/hicolor/256x256
/usr/share/icons/hicolor/256x256/apps
/usr/share/icons/hicolor/256x256/apps/hipchat.png
(略)
/opt
/opt/HipChat
/opt/HipChat/bin
/opt/HipChat/bin/linuxbrowserlaunch
/opt/HipChat/bin/hipchat
/opt/HipChat/bin/HipChatNowPlaying.rb
/opt/HipChat/lib
/opt/HipChat/lib/libvorbis.so.0.4.5
/opt/HipChat/lib/libvorbisfile.so.3.3.4
(略)
/usr/bin/hipchat
(略)
/opt/HipChat/lib/hipchat.bin
(略)
/opt/HipChat/lib/libQt5Network.so.5
/opt/HipChat/lib/libvorbis.so
/opt/HipChat/lib/libQt5Sql.so.5
/opt/HipChat/lib/libdbusmenu-qt5.so.2
$ file /usr/bin/hipchat
/usr/bin/hipchat: symbolic link to `/opt/HipChat/bin/hipchat' 
$ file /opt/HipChat/bin/hipchat 
/opt/HipChat/bin/hipchat: Bourne-Again shell script, ASCII text executable
$ tail -1 /opt/HipChat/bin/hipchat 
exec -a "$0" $commandtorun "$hipchatRoot/lib/hipchat.bin"  $arguments

環境変数QT_IM_MODULEの設定

QT_IM_MODULEが設定されていることを確認する。

$ env | grep IM_
CLUTTER_IM_MODULE=xim
QT_IM_MODULE=fcitx
QT4_IM_MODULE=fcitx
GTK_IM_MODULE=fcitx

fcitxに設定されているようだ。

platforminputcontextsプラグインの確認

先ほどの記事によると、platforminputcontextsプラグインが重要らしい。ということでパッケージを調べてみると

$ dpkg -L hipchat | grep platforminput
/opt/HipChat/lib/plugins/platforminputcontexts
/opt/HipChat/lib/plugins/platforminputcontexts/libibusplatforminputcontextplugin.so
/opt/HipChat/lib/plugins/platforminputcontexts/libcomposeplatforminputcontextplugin.so

ということで、fcitxはない。ibusはあるので、おそらくibusだったらそのまま入力できたのだろう。

Ubuntu側にあればもらってこようと思って調べたら、
$ dpkg -S fcitxplatform
fcitx-frontend-qt5:amd64: /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so
ということで、存在していた。なければapt-get install fcitx-frontend-qt5で入りそうである。

そのため、以下のようにシンボリックリンクを張ることで日本語入力を行うことができるようになった。
$ sudo ln -s /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so \
 /opt/HipChat/lib/plugins/platforminputcontexts/
それぞれビルドされた環境が異なるし、いつまでこれができるかわからないので、いっそcpでコピーしたほうがいいかもしれない。

番外:環境変数QT_PLUGIN_PATHの設定

先ほどの記事からするとQT_PLUGIN_PATHを/usr/lib/x86_64-linux-gnu/qt5/pluginsに向ければいけそうであるが、そうはいかない。というのも、/opt/HipChat/bin/hipchatがunsetしているからである。

/opt/HipChat/bin/hipchat抜粋:
thisfile="`readlink -f "$0"`"
thisdirectory="`dirname "$thisfile"`"
hipchatRoot=$thisdirectory/../
export HIPCHAT_LD_LIBRARY_PATH=$LD_LIBRARY_PATH
export HIPCHAT_QT_PLUGIN_PATH=$QT_PLUGIN_PATH
export LD_LIBRARY_PATH=$hipchatRoot/lib
unset QT_PLUGIN_PATH
exec -a "$0" $commandtorun "$hipchatRoot/lib/hipchat.bin"  $arguments

自前のほうに向けないとあらぬプラグインを読んだりするかもしれないものね。こういうケースもあるので、野良アプリケーションでは起動するときの流れを確認されたい。

2014-09-19

一部のSSDとext4でWriteが激しく遅い問題に対処する

結論:dbench 5 -D .で3MB/s程度しか出ないときは、barrier=0マウントオプションを検討する。

背景

Windows8.1の上のVirtualBoxにUbuntuを乗せて開発をしていたのだけど、開いたウィンドウがフルスクリーンの裏/表に回っちゃうとか、3D性能が下がるせいでウィンドウマネージャが限定されて効率が悪いといった不満があったので、今のご時勢にデュアルブートにすることにした。

それ自体はまぁいつもの感じでできて、グラフィックがサクサクになって期待通りの感じだったのだけど、ディスクI/Oが異常に遅い。apt-getすると「Unpacking~」で数十分とか待たされて、apt-get upgradeが全然終わらない。

これでは使い物にならないので、なんとかすることにした。
 

対処

使っているSSDはcrucialの「CT256V4SSD2」。ファームウェアが更新されていて、変更内容がパフォーマンス改善だったので、更新してみるものの、改善されない(なお、ディスクは消去されるのでインストールし直した)。

遅くなる事例がないかなと思って調べてみると、どうやら廉価なモデルらしく、painfully slowとか言われていて、機種のせいかとあきらめかけたら、まさかの日本のAmazonレビューに気になる記述を発見。

※2013/2/14追記
公式フォーラムでの情報を参考に、Linux ext4ファイルシステム環境において
ほぼ完全な動作を得られましたので一応追記しておきます。

mountオプションとしてnoatime,nodiratime,data=writeback,barrier=0,commit=180,nobhを指定することでフリーズを回避できるようです。
CD/USBブート後当SSDに対してtune2fs -o journal_data_writeback /dev/sd**を実行、
fstabのオプションフィールドに上記パラメータを追加することで、ようやく完全にSSDとしての性能を発揮するようになりました。
http://www.amazon.co.jp/product-reviews/B0092LHA7Y

この中ではbarrier=0が気になったのでmount -o remount,rw,barrier=0 /でマウントしたらapt-getのひっかかりがなくなった。

計測

もう体感では明らかに速くなっているのでこれでもいいのだけど、検索してみると同じ症状ではないかと思われる人がベンチマークを取っている(ext4のボトルネック除去:(SSDの)命懸けベンチマーク編)ので真似して「dbench 5 -t 30 -D .」で1回だけざっくり測ってみた結果がこちら。

Crucial CT256V4SSD2 / dbench 5 -t 30 -D . / 1回
Throughputmax_latency
未設定3.29658 MB/sec1222.288 ms
barrier=0106.397 MB/sec841.859 ms
barrier=13.29504 MB/sec1100.531 ms

体感と一致するありえないぐらいの遅さが数字に出ていた。3MB/sって光回線より遅いよ...

barrier=1がいつでもここまでインパクトを与えるかというとそうではなく、ずっと使っているノートPCのSSD(Crucial C300-CTFDDAC128M)では以下の通り。

Crucial C300-CTFDDAC128M / dbench 5 -t 30 -D . / 1回
Throughputmax_latency
未設定118.525 MB/sec52.287 ms
barrier=0144.024 MB/sec29.145 ms
barrier=1118.909 MB/sec44.737 ms

確かに遅くはあるのだけど、桁が変わるほどではない。max_latencyを見ると、さっきのSSDは投げ捨てろって感じだけどね...

ついでなので、SSDにTRIMコマンドを発行するようになる「discard」オプションをつけて測ってみたが、特に変化はない様子。

結局

上記の結果と、たいして重要なデータを置いていない作業用PCだということを踏まえて「barrier=0,discard」を/etc/fstabにマウントオプションとして追記することにした。

大事なデータを扱っている機械なら、こんな個体に当たったら使うのをやめるべきと思う。

2014-08-29

LXDE (Lubuntu) でマルチディスプレイ設定を維持する

Lubuntu (LXDE) でのマルチディスプレイ設定画面を探したのだけど見つからなかったので、やりかたを書いておく。XubuntuやGNOMEだと画面があるのだけど。

そのセッション限定でマルチディスプレイ設定を行う

LXDEに限った話ではないが、xrandrコマンドを使うとマルチディスプレイの設定ができるので、このコマンドで設定できる。

まず、xrandr -qでモニタの一覧を出す。
$ xrandr -q
Screen 0: minimum 64 x 64, current 3840 x 1080, maximum 16384 x 16384
VBOX0 connected 1920x1080+0+0 0mm x 0mm
   1920x1080      60.0*+
   1440x1050      60.0  
   1280x960       60.0  
   1024x768       60.0  
   800x600        60.0  
   640x480        60.0  
VBOX1 connected 1920x1080+1920+0 0mm x 0mm
   1920x1080      60.0*+
   1440x1050      60.0  
   1280x960       60.0  
   1024x768       60.0  
   800x600        60.0  
   640x480        60.0  

モニタの名前がわかったら、--outputと--right-ofや--left-ofを使って、モニタの位置を指示する。
xrandr --output VBOX1 --right-of VBOX0

このあたりの操作は、ArandrというXrandrコマンドのフロントエンドがあるらしいので、Arandrを使うとGUIでできるのだと思うが、後述の自動起動のためにコマンドで行っておく。

参考:https://help.ubuntu.com/community/Lubuntu/MultiDisplay

マルチディスプレイ設定を維持する


上記のxrandrコマンドによる設定は、そのセッション限定なので、Xを使うたびに設定する必要がある。ただ、それは面倒なので、自動起動することにする。

~/.config/autostart/ に.desktopファイルを置くと、Xセッション起動時に自動起動が走るので、これを活用する。

具体的には、~/.config/autostart/multidisplay.desktopファイルとして、以下の内容を記述する。

[Desktop Entry]
Name=multidisplay
Exec=xrandr --output VBOX1 --right-of VBOX0
Type=Application

参考:Autostarting (日本語) - ArchWiki


これで自動でマルチディスプレイ設定が毎回行われるようになる。

2014-07-03

KVMの仮想マシンをWebブラウザから管理する

自分用にLinux KVM (Kernel-based Virtual Machine) で検証用他の仮想マシン達を立てている。その仮想マシンの管理に、今まではvirshコマンドと仮想マシンマネージャー (virt-manager)を使っていたが、各VMの画面が見たいとなると、VNCでXにログインして... という感じで煩わしかった。そこで、ハイパーバイザとなるPCのリプレースを契機に、Web管理ツールのWebVirtMgrを使って、Webブラウザから管理できるようにしてみた。

こんな感じの画面がWebブラウザから使えるようになる。


環境/前提

  • Ubuntu 14.04 Server
  • libvirtでKVMの仮想マシンを起動できる状態
    • (BIOS設定他+apt-get install qemu-kvm libvirt-bin的な状態)

Web側の設定


WebVirtMgrはPython + Djangoで書かれたWebアプリケーションなので、それが動くようにする。基本的には、https://github.com/retspen/webvirtmgr/wiki/Install-WebVirtMgr に書かれている手順の通り。このページには、RedHat/CentOS/Debianなんかのときの方法も書いてある。

Python他のインストール

apt-getで入れる。

$ sudo apt-get install git python-pip python-libvirt python-libxml2 novnc supervisor nginx 

アプリケーションのダウンロードと設定

gitで落としてきて、いくつか設定する。
$ git clone git://github.com/retspen/webvirtmgr.git
$ cd webvirtmgr

ここで本来の手順は「sudo pip install -r requirements.txt」なのだけど、パッケージ管理されないファイルが増えてしまう。requirements.txtを見ると、書いてあるライブラリがUbuntu 14.04のバージョン的にいけそうだったのでパッケージで入れることにした。
$ sudo apt-get install python-django gunicorn python-lockfile

スクリプトで初期設定をする。
$ ./manage.py syncdb
You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'ユーザ名'): 
Email address: user@example.org
Password: パスワード
Password (again): パスワード
Superuser created successfully.
$ ./manage.py collectstatic

ディレクトリをまるっと移動する。
$ sudo mkdir /var/www
$ cd ..
$ sudo mv webvirtmgr /var/www/
$ sudo chown -R www-data:www-data /var/www/webvirtmgr

バックグラウンド起動の設定

バックグラウンドで起動するようにsupervisorを設定する。
/etc/supervisor/conf.d/webvirtmgr.confに以下の内容を書く。
[program:webvirtmgr]
command=/usr/bin/python /var/www/webvirtmgr/manage.py run_gunicorn -c /var/www/webvirtmgr/conf/gunicorn.conf.py
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/webvirtmgr.log
redirect_stderr=true
user=www-data

supervisorのリスタート(これで8000/tcpで立ち上がる)
$ sudo service supervisor restart 

フロントのWebサーバの設定

フロントに立つnginxを設定する。プロキシしているだけなので、Apacheでもいいと思うが、サンプルがこうなっているのでそうした。

/etc/nginx/sites-available/webvirtmgrに以下を記述する。
server {
    listen 8008 default_server;

    server_name $hostname;
    #access_log /var/log/nginx/webvirtmgr_access_log; 

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-Proto $remote_addr;
    }
}

$ sudo ln -s /etc/nginx/sites-available/webvirtmgr /etc/nginx/sites-enabled/webvirtmgr
$ service nginx restart 

これで http://hostname:8008/ にアクセスすると画面が見えるようになる。

novncの設定

ブラウザからコンソールを使うためのnovncの設定。この設定ファイルもwebvirtmgrに入っているので、使うだけでOK.

$ cd /var/www/webvirtmgr
$ sudo cp conf/initd/webvirtmgr-novnc-ubuntu /etc/init.d/webvirtmgr-novnc
$ sudo service webvirtmgr-novnc start
$ sudo update-rc.d webvirtmgr-novnc defaults

(コメントにnova-novncproxyとか書いてあったのでOpenStack Novaから持ってきたのであろう...)

libvirtの設定

WebVirtMgrはlibvirtdにTCP接続するので、その設定をする(なので、ハイパーバイザは別ホストでもOK)
ここの設定は https://www.webvirtmgr.net/docs/ を参考にした(証明書切れてる...)。

/etc/default/libvirt-binのlibvirtd_optsの行に-lを足して、tcpでlistenするようにする。
libvirtd_opts="-d -l"

/etc/libvirt/libvirtd.conf を以下のように編集する。今回はハイパーバイザが同一ホストなので127.0.0.1でlistenさせる。
listen_tls = 0
listen_tcp = 1
listen_addr = "127.0.0.1"

libvirt用のパスワードを設定する。
$ sudo apt-get install sasl2-bin
$ sudo saslpasswd2 -a libvirt ユーザ名
Password: 
Again (for verification): 
$ sudo sasldblistusers2 -f /etc/libvirt/passwd.db 
ユーザ名@ホスト名: userPassword

libvirtdを再起動する。
$ service libvirt-bin restart

以下のようにして接続できることを確認する。

$ virsh -c qemu+tcp://127.0.0.1/system nodeinfo
Please enter your authentication name: ユーザ名@ホスト名
Please enter your password: 
CPU model:           x86_64
CPU(s):              8
CPU frequency:       800 MHz
CPU socket(s):       1
Core(s) per socket:  4
Thread(s) per core:  2
NUMA cell(s):        1
Memory size:         16318576 KiB

Web画面にログインしての設定

http://hostname:8008/ にアクセスすると、ログイン画面が表示されるので、最初の「syncdb」を実行したときのユーザ/パスワードでログインする。

あとは画面ベースなので詳細は省略するが、以下のように設定すれば使えるようになる。

  • Servers List画面で127.0.0.1を追加する。
  • Storage Pools画面で、仮想マシン用のディレクトリorLVMプールとISOを配置するディレクトリを追加する。
  • Networks画面でネットワークを追加する。
  • Instances画面でインスタンスを追加する。

感想

OpenStackをこのようにVMを管理するために使おうと検証してみたのだけど、LVMのストレージやOpen vSwitchのブリッジを自前でIDを振って管理したりしていて、トラブルがあったときに追いづらくなるデメリットのほうが大きそうだったのでやめた。一方で、このWebVirtMgrはlibvirtやLVMをそのまま見せる設計思想なので、何かあったときにも追いやすく、1台~数台の管理ならかなり向いていそうだった。

2014-07-01

GPT パーティションテーブルを別のディスクにコピーする

sdaからsdbにパーティションテーブルをコピーするには、sgdiskを使うのが簡単。コマンドを先に書くとこう。不用意に実行するとさっくり壊れるので注意。
# sgdisk -R=/dev/sdb /dev/sda
# sgdisk -G /dev/sdb
sgdisk --backup sda.table /dev/sdaとかしておいたほうが安心かも?
参考: http://askubuntu.com/questions/57908/how-can-i-quickly-copy-a-gpt-partition-scheme-from-one-hard-drive-to-another

sgdiskがないとき

GPT版のfdiskであるところのgdiskをインストールする。
# apt-get install gdisk
cfdisk, sfdiskがあるように、cgdisk, sgdiskも入ってくる。ただし、コマンドラインオプションは違うので注意。
正直デフォルトで入っていて欲しい...

コマンドの説明

前提として、こんなディスクが二つあるとする。
$ sudo sgdisk -p /dev/sda
Disk /dev/sda: 16777216 sectors, 8.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 1519615B-B82D-4CA6-9849-28F3198A90E7
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 16777182
Partitions will be aligned on 2048-sector boundaries
Total free space is 3102653 sectors (1.5 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            4095   1024.0 KiB  EF02
   2            4096        13676543   6.5 GiB     FD00

$ sudo sgdisk -p /dev/sdb
Creating new GPT entries.
Disk /dev/sdb: 16777216 sectors, 8.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 65906D3D-B672-4373-AB55-F0C473EC52ED
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 16777182
Partitions will be aligned on 2048-sector boundaries
Total free space is 16777149 sectors (8.0 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name

ここで以下を実行することでパーティションテーブルをコピーできる。
$ sudo sgdisk -R=/dev/sdb /dev/sda
The operation has completed successfully.

これだけでコピーされているのだが、ディスクとパーティションに振られた固有IDまでコピーされてしまっている。

以下はディスク本体と2番目のパーティションの状態。
$ sudo sgdisk /dev/sda -p -i 2
Disk /dev/sda: 16777216 sectors, 8.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 1519615B-B82D-4CA6-9849-28F3198A90E7
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 16777182
Partitions will be aligned on 2048-sector boundaries
Total free space is 3102653 sectors (1.5 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            4095   1024.0 KiB  EF02
   2            4096        13676543   6.5 GiB     FD00
Partition GUID code: A19D880F-05FC-4D3B-A006-743F0F84911E (Linux RAID)
Partition unique GUID: CEA27178-6FB4-4358-B921-C75352CE33D7
First sector: 4096 (at 2.0 MiB)
Last sector: 13676543 (at 6.5 GiB)
Partition size: 13672448 sectors (6.5 GiB)
Attribute flags: 0000000000000000
Partition name: ''

$ sudo sgdisk /dev/sdb -p -i 2
Disk /dev/sdb: 16777216 sectors, 8.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 1519615B-B82D-4CA6-9849-28F3198A90E7 ←同じ
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 16777182
Partitions will be aligned on 2048-sector boundaries
Total free space is 3102653 sectors (1.5 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            4095   1024.0 KiB  EF02
   2            4096        13676543   6.5 GiB     FD00
Partition GUID code: A19D880F-05FC-4D3B-A006-743F0F84911E (Linux RAID)
Partition unique GUID: CEA27178-6FB4-4358-B921-C75352CE33D7 ←同じ
First sector: 4096 (at 2.0 MiB)
Last sector: 13676543 (at 6.5 GiB)
Partition size: 13672448 sectors (6.5 GiB)
Attribute flags: 0000000000000000
Partition name: ''

そこで、sgdisk -Gで振りなおす。

$ sgdisk -G /dev/sdb

そうすると、IDが新しくなっていることがわかる。
$ sudo sgdisk /dev/sdb -p -i 2
Disk /dev/sdb: 16777216 sectors, 8.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): CCC50747-7D41-4662-9FFE-93E7EE7644A3 ←変わっている
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 16777182
Partitions will be aligned on 2048-sector boundaries
Total free space is 3102653 sectors (1.5 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            4095   1024.0 KiB  EF02
   2            4096        13676543   6.5 GiB     FD00
Partition GUID code: A19D880F-05FC-4D3B-A006-743F0F84911E (Linux RAID)
Partition unique GUID: 29394950-7433-4913-8BA9-64E36B979394 ←変わっている
First sector: 4096 (at 2.0 MiB)
Last sector: 13676543 (at 6.5 GiB)
Partition size: 13672448 sectors (6.5 GiB)
Attribute flags: 0000000000000000
Partition name: ''

2014-01-04

Jenkins入門 (LibreOfficeをビルドするまで)

新年あけましておめでとうございます。今年もよろしくおねがいします。
今年はJenkinsさんの記事でスタートです。この記事は主にLibreOfficeの開発者や翻訳者に向けて作られています…が、Jenkinsの部分はLibreOfficeに限った話ではないので、なんでも使えます。

Jenkinsを使いはじめる上で一番難しいのは、機能や手順を調べたりすることではなく「どうやって使ってみたらいいのか」を認識することだと思っているので、その点について掴んでもらえれば、この記事の目指すところはおしまいです。

環境はUbuntu(記事を書いたときに試したのは12.04)を想定していますが、Windowsでもインストーラがあるし、ほとんどがWeb UIでの操作なので読みかえは容易だと思います。

Jenkinsとは

JenkinsはCI, Continuous Integration「継続的インテグレーション」をするためのツールです(以前は Hudson という名前でした)。聞いたことない人にとっては、なんか恐そうな感じですが、Jenkinsに関してはだいたい「Web UIのついたすごいcron」だと思ってもらっていいです。まぁそれじゃ本筋じゃないので一応書いとくと、開発者が独自に個別に部品を作ってどんどん進んじゃうと、いよいよ結合だーバーンってやったらそりゃあひどいことになるよね、よくないよねと。結合するフェーズがやってきたらくっつけるんじゃなくて、毎日とか、数時間ごととか、コミットごととかに、ビルドしたりテストかけたりして、継続的に合体できて動くことを確認しましょうね、っていうのを実現するためのツールです。

なので、本当はもっといろいろなことができるわけですが、今回はそのJenkinsのビルド(しかも手動)という側面だけとりあげて書きます。


今回の構成

今回の構成を絵にすると以下の通りです。upstream以外、すべてローカルPCを想定しています。


upstreamのgit repositryから、pullしてきて、そこでなんだかんだ作業します。そのなんだかんだ作業したローカルのレポジトリをJenkinsさんにcloneしてもらって、ビルドして成果物を作ってもらいます。

(ここは翻訳の確認のためのビルドという使い方を想定しているので、普通のCI環境とは違うところだと思います。"upstream"にあたる共有の作業レポジトリを定期的にビルドしてもらうというのがCIという意味では多いと思います。)



手順

LibreOfficeを普通にビルドできるようにする

まずはビルドする環境で、Jenkinsなしで対象としたいプロダクトがビルドできるように準備します。LibreOfficeをUbuntuでビルドするケースでは簡単です。ほとんどWikiの「How_to_Build」や「How_to_Build/localized」に書かれている通りにするだけ。

sudo apt-get build-dep libreoffice
sudo apt-get install translate-toolkit dos2unix

これでビルド環境の準備はOK. あとは、絵の中段の作業レポジトリをcloneして作ります。今回の作業対象となる「libreoffice-4-1」ブランチをcheckoutしておきます。
(話を簡単にするためothersも読めるホームディレクトリ直下にcheckoutすることを想定していますが、(あとで作られる)jenkinsユーザも読めるディレクトリであればどこでもいいです。)
git clone git://anongit.freedesktop.org/libreoffice/core libo
cd libo
git checkout libreoffice-4-1

念の為、普通にビルドできることも確認しましょう。
./autogen.sh --with-lang="ja"
make

instdir/program/sofficeから起動できましたね?

Jenkinsをインストールする


さて本題のJenkinsです。こちらも簡単で、手順JenkinsのWikiの「Installing Jenkins on Ubuntu」に書かれているので、その通りやればOK. apt-lineが用意されているので、ちょちょいと追加してapt-get installするだけです。

wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins

おわり。あとは/etc/init.d/jenkins startで上がってくるので、
http://127.0.0.1:8080/
にブラウザからアクセスすれば画面を見ることができます。

が、LibreOfficeはレポジトリがでかいので、gitのcloneがローカル内なのにデフォルトタイムアウトの10分を越えてしまいました(VMのせいかな?)。なので、startする前に以下の通り/etc/default/jenkinsファイルを修正して、タイムアウトを延長しておくのをおすすめします。
JAVA_ARGS="-Dorg.jenkinsci.plugins.gitclient.Git.timeOut=120"
「O」は大文字なので気をつけてください。
参考:https://issues.jenkins-ci.org/browse/JENKINS-20387

Jenkinsを設定する(Gitプラグインの追加)

Jenkinsを設定するために、まずはトップ画面(http://127.0.0.1:8080/)を表示します。


「新しいジョブを作成してください」と言っていますが、デフォルトではGitが使えないので、まずはプラグインを入れます。

 プラグインを追加するには、画面左の「Jenkinsの管理」を表示したあと、「プラグインの管理」をクリックします。
 (ただ、セキュリティを設定の警告が出ている通り、現在のJenkinsは誰でもアクセスできてしまう危険な状態なので、自分だけしかいないネットワークじゃなければ、プラグインを入れる前に、セキュリティを設定をクリックして設定しておくのがいいと思います。ここでは割愛します。)

そこで利用可能のタブを選ぶと、使えるプラグインの一覧が出てきます。その中に「Git Plugin」があるので、チェックして「ダウンロードして再起動後にインストール」をクリックします。


するとインストールがはじまるので、「インストール完了後、ジョブがなければJenkinsを再起動する」にチェックを入れれば、Jenkinsが再起動されてプラグインのインストールは完了します。

Jenkinsの設定(ジョブの追加)

いよいよ、ジョブを追加していきます。ジョブを追加するには、左側の「新規ジョブ作成」をクリックします。そうすると、入力画面がでてくるので、ここでは「Build-LibreOffice」などの好きなジョブ名を入力し、「フリースタイル・プロジェクトのビルド」を選択して「OK」をクリックします。

 そうすると、ジョブの設定画面がでてきます。名称などの基本的な設定が一番上にあり、その次にでてくるのが「ソースコード管理」です。

これはなにかというと「成果物を作成するためのソースをどこからもってくるのか」という設定です。「Git」のラジオボタンを選択して、レポジトリの場所を「Repositry URL」に、ビルドしたいブランチを「Branches to build」に入力します。さきほどの下準備通りであれば場所は「/home/USERNAME/libo」、ブランチは「libreoffice-4-1」みたいな感じになっているでしょう。もちろん「git://anongit.freedesktop.org/libreoffice/core」にしても、ビルドはできます。


スクリーンショットでは選択していませんが、Additional Behavioursで「Clean after checkout」を選んでおくほうがいいかもしれません。

次はこのジョブの肝、 ビルド処理とビルド後の処理を設定します。まずは「ビルド手順の追加」をクリックし「シェルの実行」を選ぶと、「シェルスクリプト」の入力欄がでてきます。ここに、プロダクトをビルドするコマンドを入力します。

ただし、成果物をあとで取得しやすくするために、tarでまとめるコマンドを追加しています。

./autogen.sh --with-lang="ja"
make
tar zcf libreoffice.tar.gz instdir

あとは「ビルド後の処理の追加」をクリックし「成果物を保存」を選ぶと、「保存するファイル」欄がでてきます。これはなにかというと、ビルドの結果としてJenkinsが残しておきますというファイルです(Webからダウンロードできます)。*とかも使えますが、ここでは先程tarした「libreoffice.tar.gz」を入力します。

あとは保存を押せば設定終了です。

Jenkinsジョブをビルドする


ビルドする方法はWeb画面からでもいくつかあるのですが、普段一番触ると思われるトップからやってみます。

トップにジョブの一覧があるので、右側にある時計のマークをクリックするとビルドがはじまります。


あとは左下にある「ビルド実行状態」にビルド中表示が出るので、ここの#ビルド番号 のリンクをクリックすると、ビルド状況がわかります(「コンソール出力」でビルドログをリアルタイムに表示)。今、上の画面で灰色になっている○が、青くなれば成功です!赤くなったら失敗です…


完了すると、ジョブの画面の「最新成功ビルドの成果物」からlibreoffice.tar.gzをダウンロードすることができます。


あとは何度もビルド実行をすれば、がんばってビルドしてくれます。


使い方はイメージつきましたでしょうか?本当は、コミットを検知してビルドを開始したり、ビルドが終わったらメールを送ったりすることができますが、たぶんここまでこれればあとは検索で戦えるでしょう。

自分が開発しなくても、upstreamを追いかけるなどで何度もビルドするような方は便利だと思います。作業時間を覚えてて推定残り時間をプログレスバーに出してくれたり、ログを残しておいたりしてくれるので、単なるバッチ管理に使うのも便利です。


Tips - どこでビルドされているのか?


成果物にしていなかったものでも、前回ビルド時のファイル群を見てみたいことがあります。そんなときは、/var/lib/jenkins/jobs/{ジョブ名}/workspaceを見に行くと便利です。ここで作業が行なわれています。

2013-01-27

Loqui 0.5.4 released (bug fix for Solaris11)

久々に出しました。Loqui 0.5.4です。ほぼほぼSolaris11で動くようにしただけなので、すでに動いてる環境の方々は別に上げなくても大丈夫です。具体例がSolaris11ですが、特殊対応をしたわけではなく、「これだと裏でunsigned使われてたらうまくいかないよなぁ」という感じのものを直しただけなので、もしかしたら前は動かなかったけどこれで動くようになったプラットフォームがあるかもしれません。

aboutの画面を書きかえたときに、「Copyright (C) 2002-2013」というのを見て、ブランクがあるとはいえ結構な時間たってるんだなーと思ってちょっと驚いた。もう10年以上経つのね...