LinuxやUbuntuについてのTips。
UbuntuのバージョンごとのTipsは「インストールメモ」にて。
ロリポップのFTPSサーバーにlftpでアクセス †
set ftp:ssl-auth TLS set ftp:ssl-force true set ftp:ssl-allow true set ftp:ssl-protect-data true set ftp:ssl-protect-list true set ftp:ssl-protect-fxp true
を設定してから、
> open ftp://アカウント名@サーバー名
でうまくいった。
> debug 12
などたたいて接続すると、GNUTLSがいろいろ動いてる感じなんで、多分大丈夫。
端末上でsuしたユーザでXクライアントを使う †
リモートでもローカルでも、端末上でsuコマンドによってユーザを切り替えた場合、 普通はそのユーザの権限でXクライアント(GUIアプリ)を起動できない。 これは、普通のユーザは他人のXサーバに勝手にアクセスできないから。 suした先でもXサーバを使うためには明示的にサーバの利用権を渡す必要がある。 これには、xauthというコマンドを使う。
まず、suする前に
$ xauth list
として、権限をもつXサーバのリストを出力する。 そのうち使いたいサーバに該当する行をメモるか、どこかにファイルとして書き出す。 この行をsuした後にxauthでインポートする。
$ su - hogeuser $ xauth add (xauth listで取得した行のコピペ)
こうすれば、前に使っていたXサーバを引き続き使える。 実際にXサーバを使うためにはさらにDISPLAY環境変数を suする前の値に設定しておく必要がある。
WineでMIDIを再生する †
MIDIについては詳しくもないしそれほど興味もないが、Wineで実行するゲームの中でたまにBGMとしてMIDIを使っているものがあるので、WineからMIDIを再生するためのメモ。
Timidity++というMIDI音源・MIDIシーケンサを使うと、ALSA経由でソフトウェアMIDI音源デバイスとして使うことができるらしい。そうすると、Wineからも認識され、Wine上で動くソフトからMIDIを再生できるとか。
ただ、それなりに軽いサウンドフォントを使わないとMIDI再生の負荷が増大し、ゲームの実行にも支障をきたしかねないらしい。
Wineで仮想シリアルポートを使う †
USB-シリアル変換ケーブルはLinuxでは/dev/ttyUSB0
などの名前で仮想シリアルポートとして認識される。
この仮想シリアルポートをWine上で動かすWindowsプログラムから使いたい場合、
~/.wine/dosdevices
ディレクトリにシンボリックリンクの形でデバイスのマッピングを記述すればいいらしい。
例えば、
$ ln -s /dev/ttyUSB0 ~/.wine/dosdevices/com3
とすると、仮想シリアルポートをCOM3としてWineから使える。
NICにエイリアスアドレスを与える †
# ifconfig eth0:1 192.168.12.2
とかやるとNICにエイリアスアドレスを振ることができる。 つまり、一つのNICに複数のアドレスを持たせるということ。
/etc/network/interfacesに書く場合は、
iface eth0:1 inet static pre-up ifconfig eth0:1 192.168.12.2 address .... ....
とかやって、明示的にifconfig
からアドレスを与えないとうまくいかないようだ。
DHCP設定にしていてもOK。
また、eth0本体の記述がinterfacesファイルになく、eth0がNetworkManagerの管理下に入っている場合、 起動時にeth0:1が設定されない。 (起動後、NetworkManagerによってeth0がUPになったあとならうまくいく) eth0の設定もinterfacesファイルに直書きしておけばうまくいく。
2010/02/15 追記 †
/etc/network/if-up.dに、ifconfigでエイリアスアドレスを割り当てるスクリプトをねじこんどくと、 NetworkManagerでeth0を管理している場合でも仮想アドレスの割り当てができた。 その際、IFACE環境変数などをテストして、eth0がupされたイベントでのみ、ifconfigが実行されるようにする。
NetworkManagerは一体どこの設定ファイルを見てどういうふうに動作しているのか? 詳しいドキュメントはないだろうか。
シングルユーザモード †
Ubuntu8.04はシングルユーザモードに入ると なんかよく分からんリカバリメニューが出る。 rootのシェルを使うという選択項目があるが、パスワードの入力を要求される。 もちろんUbuntuではデフォルトでrootのパスワードは封印されているので ログインできない。
initにこういう機能が仕込まれているのだろうか? セキュリティ的にはいいだろうが、肝心な時に困る。
カーネルオプションにinit=/bin/bash
とか与えると、
initの代わりにbashを直接起動するという荒技が可能。
こうすることでrootシェルはとれる。
が、パスワードの変更を行うためにはro
でカーネルを起動するのではなく、
rw
を与える必要がある。
また、何せinitデーモンが起動していない状況なので、
shutdownなどでシステムを正常終了できない。
initとして与えたbashをexitするとカーネルパニックを起こす。
ということで、この方法でシェルを使うと電源をブチ切るしか手がない。
多分。
GTK+ ダイアログボックス zenity †
zenityというプログラムはGTK+のダイアログボックスを出して、 ユーザのレスポンスを呼び出し元に返すことができる。 簡単な対話型シェルスクリプトをGUIで作るのに使える。
さまざまな種類のダイアログボックスをサポートしているだけでなく、通知領域にアイコンを出したり吹き出しを表示させたりすることもできる。
参考: http://d.hatena.ne.jp/kakurasan/20070716/p1
Emacsでシェルを複数起動する †
C-u M-x shell
のように、数引数をつければいい。
…ヘルプを読めば書いてあるのに気づかなかった。。
ホスト名あれこれ †
コンピュータのホスト名は/etc/hostnameファイルをいじってから再起動すれば変更できる。 ホスト名はgethostnameシステムコールで取り出される。 これは単なる名前であって、ネットワークインタフェースとは直接関係ないようだ。
/etc/hostnameで設定したホスト名はhostnameというコマンドで確認できる。
$ hostname hogehoge-desktop
これはgethostnameシステムコールの内容を表示しているだけらしい。
一方、hostnameコマンドに-fオプションをつけるとこのコンピュータのFQDNを表示する。 ここで表示されるFQDNは/etc/hostnameの設定とは本質的に全くの別物。 hostnameコマンドのmanページによると、
Technically: The FQDN is the name gethostbyname(2) returns for the host name returned by gethostname(2). The DNS domain name is the part after the first dot.
らしい。 gethostbynameはネットワークホストの名前解決に使われる関数なので、この辺でネットワークが絡んでくる。 このようなことから、hostname -fが返すFQDNは/etc/hostnameで記述したホスト名がどのように名前解決されるかで決まる。 例えば、先程のような状況で/etc/hostsに次のようなエントリがあった場合、
127.0.1.1 hogehoge-desktop.mydomain hogehoge-desktop
FQDNはこうなる。
$ hostname -f hogehoge-desktop.mydomain
GNU Screen + GNU EmacsでCtrl+十字キーを有効にする †
ちょっとした興味で、GNOME端末上でGNU Screenを動かして その中でEmacsを使ってみた。
その時に気づいたのだが、GNOME端末から直接使った場合は Control + 十字キーで大きめのカーソル移動ができるのに、 Screenをはさんだ場合はそれができない('5A'とかの文字列が入力される)。 これはEmacsがTERM環境変数を見て挙動を変えているからのようだ。 Screen内部ではTERMはscreenに設定されている。
$ echo $TERM screen
これを強引にxtermに変えてEmacsを起動したらControl + 十字キーも使えるようになった。
$ TERM=xterm emacs
EmacsがTERM環境変数に応じてどのように設定を変えているのかは今のところよく分からない。
GUIモード、CUIモード切替 †
Xが動いている状態でCtrl + Alt + F1
〜 F6
でコマンドラインモードに移ることができる。その状態でAlt + F7
を押すとXへ復帰。
正確には、これは利用するttyを切り替えているということらしい。 tty7はXorgが管理していて、tty1〜tty6はCUIで使える。
ショートカットキーカスタマイズ †
「アプリケーション - システムツール - 設定エディタ」を用いて、任意のコマンドをショートカットキーに割り当てることができる。 → http://www.captain.at/howto-gnome-custom-hotkey-keyboard-shortcut.php
スティッキービット †
パーミッションの9bitに対応(8進表記で1000)。
ディレクトリにスティッキービットを立てると、そのディレクトリの下のファイルやディレクトリの削除や名前変更は以下のユーザーでしかできなくなる。
- スティッキービットの立っているディレクトリの所有者
- 削除・名前変更対象のファイルやディレクトリの所有者
- rootユーザー
通常、ディレクトリのothersにwビットが立っているとその下には誰でもファイル・ディレクトリを追加できるし、その下のファイル・ディレクトリは誰でも削除できる。でも追加と削除が同等の権限というのは明らかにおかしい。そこでスティッキービットを立てると、誰でも追加できるけど削除は所有者のみという設定にできる。
ファイルにスティッキービットが立っているとそのファイルはスワップ領域に常駐するとか何とか・・・。よく分からない。
chmodのmanページを参照。
ディレクトリの移動のパーミッション †
ディレクトリを別の場所に移すには、そのディレクトリのWrite権限が必要。その場でリネームするなら権限必要なし。(親ディレクトリのWrite権限に依存)
これは、ディレクトリを別の場所に移動するとそのディレクトリの".."エントリを書き換える必要があるからだと考えられる。
デーモンの管理 †
RedHat系ディストリビューションではデーモンの管理にservice
やchkconfig
といったコマンドが使えるが、UbuntuなどDebian系のディストリビューションには基本的にこのコマンドはない。
かわりに、invoke-rc.d
とupdate-rc.d
を使う。
Emacsモードラインの左側の印 †
モードラインの左端にはエンコーディングについての情報が表示されている。
-uuu:
とかいう部分。
これは、左から順に
- キーボード入力のエンコーディング(C-x RET k)
- 端末出力のエンコーディング(C-x RET t)
- ファイルに保存する際のエンコーディング(C-x RET f)
を意味し、それぞれ括弧で示したコマンドで変更可能である。 Emacsを独自ウィンドウで立ち上げると前の二つは表示されない。
Ubuntuでは、キーボード入力や端末出力はデフォルトでUTF-8であるはずなので そのように設定しておけば問題ない。 キーボード入力がUTF-8ならEmacsの入力方式を変更しないでも SCIM経由で日本語を入力することができる。
なお、ファイルを読み込む際のエンコーディングを指定するには、 C-x RET cでエンコーディングを設定した後にC-x C-fでファイルを読み込めばよい。 通常は自動判別で読み込んでくれるはずである。
指定可能なエンコーディング名はM-x list-coding-systemsで参照できる。
/etc/environment †
システムワイドの環境変数を設定する方法としては/etc/profileをいじるのが常套だが、
このファイルはあくまでログイン時にシェルによって実行されるスクリプトである。
したがって、su
コマンドを-
オプションなしで使ったときなどはこのスクリプトは実行されず、環境変数の設定が狙いどおりにならなかったりする。
よりグローバルな環境変数設定ファイルとして/etc/environmentというのがある。 これはシェルスクリプトではなく、デフォルトの環境変数を設定するファイルらしい。
このファイルを書き換えることで真にシステムワイドな環境変数設定をすることができるようだ。