debianでブート時に/tmpを削除しない方法

/etc/default/rcSを編集する。このファイルはブートプロセス時の制御を行う。man rcSでマニュアルを表示できる。ここでTMPTIMEを設定する。

TMPTIME
0にすると、ブートの度ごとに/tmpにあるファイルが削除される。10とすると10日間使われていないファイルが削除される。

vmware playerで最大化したときの最上部のバーを消す

vmware playerでゲストOSを最大化したとき、最上部にバーが表れ、このバーの一番左のピンを抜いてもまだ細いバーが表示される。これを消すための方法。

vmware playerの設定ファイルをいじるわけだが、このある場所は、Linuxの場合は、~/.vmware/にあり、Windowsの場合はC:\Users\<USER>\AppData\Roaming\VMware\preferences.iniにある。このファイルを開くにはCtrl+Rで実行ダイアログを表示し、以下を入力する。

Ctrl+R and Enter %APPDATA%\VMware\preferences.ini

このファイルに以下を追加する。

しかし、これをやるとゲストOSでマウスを一番上にもっていってもバーは表示されなくなる。ゲストOSの最大化を解除するにはCtrl+Altをしないとならない。

関連:
vmware-vdiskmanagerとknoppixを使って仮想ディスクの容量を増やす
Fedoraのvmware ServerでゲストOS上でアンダーバーが入力できない

Linuxで音がならないときの対処法

自分も完全にはLinuxのサウンド関係を把握してる訳ではないんですが、自分のマシンにLinuxをインストールして音が出なかったとき右往左往しながら色々やって直したときのメモです。

結論からいうと、多分ですが、自分のマシンにはTVカードが刺さっていて、これは使ってなかったんですが、こいつのせいでサウンド関係のカーネルモジュールがうまく読み込まれなかったようです。

とりあえずもし音がならない場合は以下のことを調べるといいです。

・lspci | grep audioをして自分のマシンのサウンドボードが認識されているか確かめる。

・alsaconf(debian等)、system-sound-config(fedora等)を実行して、サウンドボードが認識されているか確かめる。

・lsmodして読み込まれているモジュールを確認し、modinfoでそのモジュールが本当に必要なのかを確認する。いらないなら/etc/modprobe.d/blacklistにいれてしまう。(自分の場合はこのやりかたで直りましたが、もっとましな方法があるのかもしれません。)

モジュールに関してはカーネルモジュール覚書に少し書いています。

vmware-vdiskmanagerとknoppixを使って仮想ディスクの容量を増やす

(注意)以下の作業は仮想マシンのハードディスクを壊してしまう危険性があります。

まず仮想マシンを終了し、vmwareを終了させます。つぎにvmware-vdiskmanagerを使い仮想ディスク(拡張子vmdk)の容量を拡張します。

vmware-vdiskmanager -x 12Gb Disk.vmdk

これでDisk.vmdkが12Gバイトに拡張されます。しかしこのままでは仮想マシンのOSからこのハードディスクを見ても前のサイズのままなので、knoppixのgpartedを使ってパーティションを拡大します。ここではknoppix_v5.1.1CD_20070104-20070122+IPAFont_AC20070123.isoを使いました。

このisoを仮想マシンに接続し、このCDからブートします。 knoppixでブートする前に仮想マシンのOSで正常にシャットダウンしておいてください。そうしないとknoppixがハードディスクをうまく扱えないことがあります。

コンソールを起動して、gpartedを起動します。

$ gksudo gparted

knoppix-console.png

ツールバーの一番右にあるディスク選択からディスクを選び、もとのパーティションを右クリックし、リサイズを選んで、右側に拡張します。

gparted.png

Editメニューの適用をクリックして、実際の作業を開始します。成功すると以下のようにパーティションが拡大されます。

gparted-done.png

knoppixを終了し、仮想マシンのOSを起動して、正常に拡張されているか確認します。

Fedoraのyumでパッケージを再インストールする

yumコマンドにはパッケージを再インストールするコマンドがないみたいなので、yumdownloaderを使ってパッケージをダウンロードし、rpmの–forceオプションを使って強制インストールする方法。

# yum install yum-utils
# yumdownloader <package>
# rpm -Uvh --force <package>.rpm


–forceオプションはちょっと恐い場合は、file-rollerでrpmを開けば中のファイルを展開できるので、必要なファイルを取り出して置き換えればいい。

# file-roller <package>.rpm

コマンドラインの場合は以下のコマンドでカレントディレクトリに展開できる。

# rpm2cpio <package>.rpm | cpio -id

 
    
[追記]
いつの間にかyumにreinstallコマンドが追加されているみたいです。(気づかなかっただけ?)
# yum reinstall [package]

Linuxでビープ音を無効にする

下に行くほど、影響範囲が大きくなります。

1、gnome-tarminalの設定でビープ音を無効にする。

メニューから「編集」->「現在のプロファイル」を選択し、 「端末のベルを鳴らす」をオフにする。

gnome-terminal-profile.png

2、readlineの設定で無効にする。

~/.inputrcに以下の行を追加する。

set bell-style none

noneの代わりにvisibleを使うと視覚化ベルを使う。

3、GNOMEの設定で無効にする。

gnome-sound-propertiesを起動し、以下のように設定する。

gnome-beep-off.png

4、 Xの設定で無効にする。

以下のコマンドで無効にする。有効に戻すにはonにする。

$ xset b off

起動時に自動的にやる方法はよく分からなかった。

5、システム全体で無効にする。

今だけ無効にする場合は以下のコマンドを実行する。

# modprobe -r pcspkr

有効に戻すには以下のコマンドを実行する。

# modprobe pcspkr

永遠に無効にするには、modprobe設定のブラックリスト(/etc/modprobe.d/blacklist)にpcspkrを追加する。

blacklist pcspkr

Fedora – yum でソースを取得してコンパイル、デバッグする

yumでインストールできるパッケージのソースを取得して、コンパイルする方法。ここではsedを対象に行った。Fedoraで行っている。

まず、rpm-buildとyum-utilsをインストールする。

# yum install rpm-build
# yum install yum-utils

次にsedのソースrpmを取得する。

# yumdownloader --source sed
# ls
sed-4.1.5-9.fc8.src.rpm
#

このrpmをインストールすると、/usr/src/redhat/SOURCEにソースコードがコピーされる。 多くの場合パッチも一緒に入っている。このソースコードのコンパイル方法は/usr/src/redhat/SPECにあるスペックファイルのビルドセクションに記述されているが詳細は見ない。

ビルドする。

# cd /usr/src/redhat/
# rpmbuild -bc SPECS/sed.spec
.................

-bcオプションは通常パッチをあてmakeすることを意味する。このコマンドが成功すれば、BUILDディレクトリにsedのいろいろなファイルが作られている。

しかしこれらはデバッグビルドではないので、このままでは中途半端にしかデバッグできない。幸いsedはCで書かれていて基本的なmakeコマンドで処理できるので、あとはどこかでCFLAGSとして”-O0 -g”を指定してmakeすればデバッグビルドできる。

ここでは、configureスクリプトをCFLAGSを変えて起動することで行った。configureスクリプトの起動方法はSPECファイルに記述されているので、そのとおりにやらないとエラーになるかもしれないが、ここでは面倒なので無視した。

# cd /usr/src/redhat/BUILD/sed-4.1.5/
# make clean
......
# CFLAGS="-O0 -g" ./configure
......
# make
......

これでsed/sedがデバッグビルドされ、gdbなどでデバッグできる。

# cat > ttt
aaa
bbb
ccc<CTRL+D>
# gdb sed/sed
GNU gdb Red Hat Linux (6.6-45.fc8rh)
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) break main
Breakpoint 1 at 0x8049864: file sed.c, line 179.
(gdb) r s/aaa/xxx/ ttt
Starting program: /usr/src/redhat/BUILD/sed-4.1.5/sed/sed s/aaa/xxx/ ttt

Breakpoint 1, main (argc=3, argv=0xbfd5b684) at sed.c:179
179 const char *cols = getenv("COLS");
Missing separate debuginfos, use: debuginfo-install glibc.i686
(gdb)

最後に上記作業は全部rootで行ったが、rpmdevtoolsパッケージに含まれるrpmdev-setuptreeを使えば、一般ユーザでも作業できる。参考

ホームディレクトリにある”デスクトップ”や”音楽”を英語にする

最近のLinuxのgnomeではデフォルトでデスクトップのディレクトリがそのまま日本語で”デスクトップ”となっている。しかしファイル名やフォルダ名に日本語を使うのはいささか抵抗があるので、これを戻す方法。

まずログアウトして、ログインマネージャで言語を英語にする。

changelang.JPG

ログインすると”デスクトップ”などのフォルダをリネームするか聞いてくるのでUpdate Namesを選択し、リネームする。

changetoeng.JPG

再びログオフし日本語に戻す。そしてログインすると再びリネームするか聞いてくるので、ここでリネームをしなければいい。

iptablesメモ。firewallとして

iptablesは多機能で複雑でわかりにくい。ここでは主にiptablesを入ってくるパケットに対するファイヤーウォール機能として考える。

まずiptablesはパケットに対して操作を行う。特にパケットのヘッダに対して行う。パケットのデータに対しては処理を行わない。

iptablesには3ビルトインテーブルfilter、nat、mangleがある、firewallとして使うにはfilterを用いる。filterはiptablesコマンドのデフォルトのテーブルであり、-tオプションを指定しなかった場合は、-t filterと同じ意味になる。

tableはchainの集まりとして定義される。chainはruleとtargetを組にしたものの集まりで定義される。ruleはフィルタそのもののことで、targetはそのフィルターにかかったパケットをどう処理するかを指定する。

filter tableにおけるビルドインchainとしてINPUT、FORWARD、OUTPUTが存在する。INPUTは入ってきたパケットで宛先が自分のものに適用される。FORWARDは宛先が自分でないもの、これはマシンをルーターとして動かしているときのもの、そしてOUTPUTは自分から出て行くパケットに適用される。

ユーザ定義のカスタムchainを定義することができ、これらのchainはビルドインchainのtargetととして利用できる。ビルドインchainはあらかじめどんなパケットに適用されているかが決まっているがカスタムchainはビルドインchainから呼び出される形で動くことになる。

targetにはACCEPT、DROP、REJECTなどのビルドインtargetがある。言葉のとおり、ACCEPTはパケットを受け入れ、DROPはパケットを捨て、REJECTはエラーパケットを返す。

実際に動かしてみる。ここではFedora8を使った。

現在のiptablesの状態を確認するには-Lオプションをもちいる。しかしこのオプションだけだと詳細が分からないので-vオプションも一緒に使う。-Lオプションはchain名を引数にとる。ここでは上記のように入ってくるパケットに対して考えているのでINPUT chainを見る。

# iptables -v -L INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
18 1727 RH-Firewall-1-INPUT all -- any any anywhere anywhere

まず、policy ACCEPTとあるが、policyとはすべてのruleにかからなかったパケットをどうするかを定義してもので、デフォルトではACCEPTになっている。つまりruleが一つも定義されてなければすべてのパケットを受け入れると言うことである。

コラムを順に見ると protはプロトコルでinは入ってきたパケットのインターフェース(ネットワークカード)でoutは出て行くパケットのインターフェース。しかしINPUT chainにおいてはoutは関係ないと思われる。sourceはパケットのソースIP、destinationはデストIP、しかし同様にここではINPUT chainなので、デストIPは自分自身のはずである。

エントリーをみると targetがRH-Firewall-1-INPUTになっていて、protなどがanyとなっている。つまりINPUT chainに入ってくるパケットはすべてRH-Firewall-1-INPUT chainに送られるようになっている。そこでこのchainを見てみる。

# iptables -v -L RH-Firewall-1-INPUT
Chain RH-Firewall-1-INPUT (1 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 ACCEPT icmp -- any any anywhere anywhere icmp any
0 0 ACCEPT esp -- any any anywhere anywhere
0 0 ACCEPT ah -- any any anywhere anywhere
0 0 ACCEPT udp -- any any anywhere 224.0.0.251 udp dpt:mdns
0 0 ACCEPT udp -- any any anywhere anywhere udp dpt:ipp
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ipp
179 27376 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- any any anywhere anywhere state NEW tcp dpt:ssh
4 926 REJECT all -- any any anywhere anywhere reject-with icmp-host-prohibited

一番最初のエントリーでinがloのものはすべてACCEPTしている。これによりブラウザなどでhttp://localhost/でアクセスしたときのパケットを許可している。

つぎにicmpでpingを許可し、esp、ahでIPSec関係のパケットを許可している。

重要なエントリーはstate RELATED,ESTABLISHEDのある行で、実際ほとんどのパケットはここで許可される。stateとは対象パケットが通信全体から見た場合どういう状態でのパケットなのかを表したもので、ESTABLISHEDはすでに通信が確立しているもの、例えばブラウザでどこかのサイトにアクセスし、その結果として戻ってきたパケットはstateがESTABLIEDになる。これを許可しないとほとんどの通信ができなくなってしまう。RELATEDは多分FTPのデータ経路などをACTIVEで開いたときに入ってきたパケットを許可するものだと思う。

つぎのエントリーでsshの接続を許可している、state NEWとあるので、通信開始時のパケットを許可していることになる。一度開始されればそれ以降のパケットは上記のESTABLISHEDで許可されることになるので、state NEWとしているのだと思われる。

一番最後のエントリーでそれ以外のすべてのパケットがREJECTされている。最初に書いたようにREJECTだとエラーパケットを返す。