「Linux」カテゴリーアーカイブ

コマンドの終了コードが128を超える場合はシグナルで終了した場合

コマンドの終了コードが128を超える場合はシグナルで終了した場合。

$ man bash
The return value of a simple command is its exit status, or 128+n if the command is terminated by signal n.
$ some_command
$ echo $?
139

例えば上記のように終了コードが139なら、139=128+11なので、シグナル11で終了したということになる。
man signalとかで見ると、シグナル11はSIGSEGVで、セグメンテーション違反だということが分かる。

yumアップデート時に変更点を表示する

yum-plugin-changelogプラグインをインストール。

# yum install yum-plugin-changelog

※ CentOS5はyum-changelog

# yum install yum-changelog

yum-plugin-changelogプラグインをインストールすると、--changelogオプションが追加される。
パッケージの変更点を表示するには、--changelogオプションを付けてyum updateを実行する。

# yum --changelog update

シェルの作業をファイルに記録する

$ script <ログファイル名>

scriptコマンドを実行すると、新たにシェルが起動し、 そのシェルを終了するまでの間の入出力をログファイルに記録してくれる。
終了するには、exit。
ログファイル名を省略した場合は、カレントディレクトリの typescript という名前のファイルに記録される。
デフォルトではログファイルは上書きされる。追記したい場合は、-a オプションを付ける。

コマンドの出力をファイルに記録する - いますぐ実践! Linuxシステム管理 / Vol.079.

Xenの仮想サーバでclockを設定

VPSのXenの仮想サーバで時刻がずれていた。
ntpdで設定されるようにしているが、ずれたまま。
DomUの時刻は、Dom0からのみ更新できるというXenの仕様によるものらしい。
検閲Tech: XenのDomUでNTPを使う
ということは、Dom0の時刻がずれているのか。

DomUでNTPを使って時刻が設定できるようにした。

# echo 1 > /proc/sys/xen/independent_wallclock

/etc/sysctl.conf

xen.independent_wallclock = 1

ntpdをセットアップ。

$ sudo yum install ntp
$ sudo /sbin/chkconfig ntpd on
$ sudo /etc/init.d/ntpd start

ntpdが時刻を同期する様子は以下で確認できる。

# ntpq -p

時刻が大幅にずれている場合はntpdでは時刻が補正されないので、ntpdateで時刻を合わせておく。

# /etc/init.d/ntpd stop
# ntpdate <ntpサーバ>
# /etc/init.d/ntpd start

ただし注意!

時刻が戻るとdovecotがダウンした。dovecotの仕様らしい。

/var/log/maillog

Feb 23 19:40:48 mail dovecot: Time just moved backwards by 105 seconds. This might cause a lot of problems, so I'll just kill myself now. http://wiki.dovecot.org/TimeMovedBackwards

dovecotのリスタートが必要だった。
この現象は、Dom0の時刻がずれている限り、DomUを再起動するたびに起きてしまう。
つまり、DomUを再起動したら、dovecotを再起動しないといけない。

/etc/fstabの記述ミスで起動できなくなった場合

fdiskでパーティションを削除した後、/etc/fstab に削除したパーティションのエントリを残したままサーバを再起動したところ、起動時のファイルシステムチェックでエラーになり、起動しなくなってしまった。
その対処方法。

  1. エラー画面でrootパスワードを入力してメンテナンスモードに入る。
  2. / が読み取り専用モードでマウントされているため、書き込み可能なようにマウントし直す。これをしないと、fstabを編集できない。

    # mount -o remount,rw /
    
  3. fstabの不要エントリ(実際には削除されているが、エントリに残っているディスクパーティション)を削除。

    # nano /etc/fstab
    
  4. システムを再起動。
    # shutdown -r now
    

/etc/fstabの記述ミスでOSブート不能 - shibainu55日記

さくらのクラウドでパーティションの移動

さくらのクラウドで、/homeディレクトリを追加ディスク内のパーティションに移動してみた。
まず、さくらのクラウドのコントロールパネルでディスクを追加してサーバに接続しておく。
下記では、追加したディスクは、/dev/hdb として認識されています。
移行の手順は以下の通り。

fdiskでパーティションを作成する

# fdisk /dev/hdb
このディスクのシリンダ数は 2610 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)
コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-2610, default 1): 
Using default value 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-2610, default 2610): 
Using default value 2610
コマンド (m でヘルプ): p
Disk /dev/hdb: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes
デバイス Boot      Start         End      Blocks   Id  System
/dev/hdb1               1        2610    20964793+  83  Linux
コマンド (m でヘルプ): w
領域テーブルは交換されました!
ioctl() を呼び出して領域テーブルを再読込みします。
警告: 領域テーブルの再読込みがエラー 16 で失敗しました: デバイスもしくはリソースがビジー状態です。
カーネルはまだ古いテーブルを使っています。
新しいテーブルは次回リブート時に使えるようになるでしょう。
ディスクを同期させます。

ここでいったんリブートする。

作成したパーティションにファイルシステムを作成する

# mkfs -t ext3 /dev/hdb1 
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
2621440 inodes, 5241198 blocks
262059 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
160 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 20 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

/mnt での新規ファイル・システムのマウント

いったん新しいディレクトリにマウントする。
ここでは、/mnt/newpart というディレクトリにマウントした。

# mkdir /mnt/newpart
# mount /dev/hdb1 /mnt/newpart

このマウントは一時的なものなので、/etc/fstabには記述しない。

ファイルのコピー

ここからは、さくらのクラウドのコントロールパネルのコンソールで操作する。
まず、安全にファイルをコピーするために、シングルユーザモードにする。

# telinit 1

ファイルをコピーする。

# cd /home
# cp -ax * /mnt/newpart/

マウントポイントの変更

# mv /home /home.old
# mkdir /home
# mount /dev/hdb1 /home

exitでシングルユーザモードを抜ける。

# exit

/etc/fstabの編集。

# nano /etc/fstab

/etc/fstab に以下の行を追加。

/dev/hdb1               /home                   ext3    defaults        1 2

再起動

再起動すると、/dev/hdb1 が /home のみにマウントされた状態になる。
確認。

$ df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/hda2              18G  8.8G  7.8G  53% /
/dev/hda1              99M   18M   76M  20% /boot
tmpfs                1006M     0 1006M   0% /dev/shm
/dev/hdb1              20G  5.6G   14G  30% /home

元に戻す場合

問題があって元に戻す場合は、さくらのクラウドのコンソールでシングルユーザモードにして、/homeをumount後、/homeを削除、/home.oldを/homeにリネームすればよい。あと、/etc/fstab から/homeのマウントのエントリを削除するのを忘れずに。
/homeディレクトリをumountするとき、device is busy となってアンマウントできない場合は、

# umount -l /home

でアンマウントする。
パーティションの活用: /home の移動編
ITmedia エンタープライズ : Linux Tips「「/home/」などのディレクトリを,ほかのドライブ(パーティション)に移動したい」
マウントポイントの移動 - Linux on Titan700

さくらのクラウドでディスクを追加

さくらのクラウドでディスクを追加、サーバ(CentOS 5.7)に接続、マウントして使えるようにした。

ディスクの追加

まず、さくらのクラウドのコントロールパネルで、ディスクを追加して、サーバに接続しておく。

パーティションの作成

# fdisk -l
Disk /dev/hda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes
デバイス Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14        2355    18812115   83  Linux
/dev/hda3            2356        2610     2048287+  82  Linux swap / Solaris
Disk /dev/hdb: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes
ディスク /dev/hdb は正常な領域テーブルを含んでいません

/dev/hdb が追加されているのが分かる。
fdiskの引数に追加したディスクのデバイスファイルのパス(/dev/hdb)を指定して実行。

# fdisk /dev/hdb
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルを作成します。あなたが書き込みを決定するまで、変更は
メモリ内だけに残します。その後はもちろん以前の内容は修復不可能になります。
このディスクのシリンダ数は 2610 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります
コマンド (m でヘルプ):

この警告は気にする必要はない。
続いてパーティションを作成する。
まず p コマンドで現在設定されているパーティションを確認。

コマンド (m でヘルプ): p
Disk /dev/hdb: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes
デバイス Boot      Start         End      Blocks   Id  System

パーティションはまだない。
n コマンドでパーティションを作成する。
基本領域を作成するので、コマンドアクションは「p」を指定。
領域番号は「1」を指定。
最初シリンダと終了シリンダはデフォルトでOK。

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-2610, default 1): 
Using default value 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-2610, default 2610): 
Using default value 2610

p コマンドでパーティションを確認。

コマンド (m でヘルプ): p
Disk /dev/hdb: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes
デバイス Boot      Start         End      Blocks   Id  System
/dev/hdb1               1        2610    20964793+  83  Linux

w コマンドで書き込む。

コマンド (m でヘルプ): w
領域テーブルは交換されました!
ioctl() を呼び出して領域テーブルを再読込みします。
警告: 領域テーブルの再読込みがエラー 16 で失敗しました: デバイスもしくはリソースがビジー状態です。
カーネルはまだ古いテーブルを使っています。
新しいテーブルは次回リブート時に使えるようになるでしょう。
ディスクを同期させます。

警告が出たので、ここでいったんリブートした。

パーティションをフォーマットする

# mkfs -t ext3 /dev/hdb1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
2621440 inodes, 5241198 blocks
262059 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
160 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 21 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

必要に応じて、tune2fsでfsckのタイミングを設定する。
tune2fs

マウント

マウントポイントを作成する。

# mkdir /backup

マウントを実行。

# mount /dev/hdb1 /backup

正しくマウントされているかを確認。

# mount
/dev/hda2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/hdb1 on /backup type ext3 (rw)

システム起動時に自動マウントするようにするため、/etc/fstabに以下を追加する。

/dev/hdb1               /backup                 ext3    defaults        1 2

※万一、fstabの記述にミスがあった場合、ブートできなくなってしまう。
その場合は、コントロールパネルのコンソールでメンテナンスモードに入り、fstabを修正して、リブートする。
手順は以下を参照。
/etc/fstabの記述ミスで起動できなくなった場合

参考:
memomemo : さくらのクラウド ディスクの追加 on CentOS5

電子署名でダウンロードファイルを検証

gnupgがインストールされているか確認。

$ yum list installed gnupg
Loaded plugins: fastestmirror
Installed Packages
gnupg.x86_64                     1.4.5-14.el5_5.1                      installed

インストールされていなければインストール

$ sudo yum install gnupg

※Mac OS X の場合は、MacPortsでgnupgをインストールできる。
設定ファイルを初期化する。
--list-keysはgpgに登録されている公開鍵を表示するコマンド。
初回実行時に設定ファイルが自動的に作成される。

$ gpg --list-key
gpg: ディレクトリー「/home/pistolfly/.gnupg」ができました
gpg: 新しい構成ファイル「/home/pistolfly/.gnupg/gpg.conf」ができました
gpg: 警告: 「/home/pistolfly/.gnupg/gpg.conf」のオプションは起動している間、有効になりません
gpg: 鍵輪「/home/pistolfly/.gnupg/pubring.gpg」ができました
gpg: /home/pistolfly/.gnupg/trustdb.gpg: 信用データベースができました

~/.gnupg/gpg.conf を編集。

$ vi ~/.gnupg/gpg.conf 

以下の部分のコメントを外して、公開鍵を鍵サーバから自動的に取得できるようにする。

#keyserver-options auto-key-retrieve

 ↓

keyserver-options auto-key-retrieve

ダウンロードファイルの真正性を確認する

gpg --verify <電子署名ファイル>

例:

$ ls emacs*
emacs-23.3a.tar.gz emacs-23.3a.tar.gz.sig
$ gpg --verify emacs-23.3a.tar.gz.sig 
gpg: 2011年08月03日 00時39分07秒 JSTにDSA鍵ID BC40251Cで施された署名
gpg: 鍵BC40251Cをhkpからサーバーsubkeys.pgp.netに要求
gpg: 鍵BC40251C: 公開鍵"Chong Yidong <cyd@stupidchicken.com>"を読み込みました
gpg: 絶対的に信用する鍵が見つかりません
gpg:     処理数の合計: 1
gpg:           読込み: 1
gpg: "Chong Yidong <cyd@stupidchicken.com>"からの正しい署名
gpg: 警告: この鍵は信用できる署名で証明されていません!
gpg:       この署名が所有者のものかどうかの検証手段がありません。
主鍵の指紋: AF1A 0574 841E 0F2D EDE2  829A 764D A716 BC40 251C

gpg: "Chong Yidong <cyd@stupidchicken.com>"からの正しい署名
とあるので、OK。
gpg: 警告: この鍵は信用できる署名で証明されていません!
は、公開鍵を信頼していない状態なので表示されている。

制御文字の入力方法

Emacs

C-q 制御文字

例: エスケープ文字を入力

C-q C-[

シェル、vim

Ctrl+V 制御文字

例: エスケープ文字を入力

Ctrl+V Ctrl+[

コントロールキーと同時に押す文字は?

上記で「制御文字」と記載しているところは、Ctrl+(コントロールキーと同時に押す)で送出するが、この時のコントロールキーと同時に押す文字は、入力したい制御文字の7ビット目に1をセット、つまり0x40(64)を足した文字である。
man ascii 等でASCII文字の一覧を表示して探す。

例:
エスケープ文字は0x1B(27)
7ビット目に1をセットする=0x40(64)を足すと0x5B(91)
0x5B(91)は[
よってエスケープ文字を送出するにはCtrl+[

改行は0x0A(10)
7ビット目に1をセットする=0x40(64)を足すと0x4A(74)
0x4A(74)はJ
よって改行を送出するにはCtrl+J

https://ja.wikipedia.org/wiki/ASCII#ASCII.E5.8D.B0.E5.AD.97.E5.8F.AF.E8.83.BD.E6.96.87.E5.AD.97

なお、印字可能文字のうち「@」から始まる32文字については、ASCII値を64減じて対応する制御文字を求め、この制御文字を「コントロール+」(英: control+)という前置表現を付けた印字可能文字で表記する慣習がある。

例:BELコード(07) →「コントロール+G」(受信した側の機器で注意喚起音が鳴る)

この制御文字の表記方法は、キーボード上の印字可能文字キーを制御文字の送出に用いていた機器の名残りであると考えられる(7ビット目を0にセットする専用キー(Ctrlキー)を、印字可能文字キーと同時に押して制御文字を送出)。

エスケープ文字の入力方法 - nelnalog.note