脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

追加したディスクを認識させて利用できるように設定する方法

HDDの容量が足りなくなってディスクを追加したはいいものの、認識されなくて使えない場合にやった解決法です

1. ディスク追加

追加前
# cat /proc/scsi/scsi
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: VMware   Model: Virtual disk     Rev: 1.0
  Type:   Direct-Access                    ANSI  SCSI revision: 02
Host: scsi2 Channel: 00 Id: 00 Lun: 00
  Vendor: NECVMWar Model: VMware IDE CDR10 Rev: 1.00
  Type:   CD-ROM                           ANSI  SCSI revision: 05
追加後

認識させる(hot add)

# echo "- - -" > /sys/class/scsi_host/host0/scan
# cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: VMware   Model: Virtual disk     Rev: 1.0
  Type:   Direct-Access                    ANSI  SCSI revision: 02
Host: scsi2 Channel: 00 Id: 00 Lun: 00
  Vendor: NECVMWar Model: VMware IDE CDR10 Rev: 1.00
  Type:   CD-ROM                           ANSI  SCSI revision: 05
Host: scsi0 Channel: 00 Id: 01 Lun: 00
  Vendor: VMware   Model: Virtual disk     Rev: 1.0
  Type:   Direct-Access                    ANSI  SCSI revision: 02
  • 追加したHDD情報が表示されている(今回は/dev/sdb)

2. パーティション設定

設定
# /sbin/fdisk /dev/sdb

Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x6f42ab55.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').
Command (m for help): > n

Command action
   e   extended
   p   primary partition (1-4)
> p

Partition number (1-4): 1

First cylinder (1-13054, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-13054, default 13054):
Using default value 13054
Command (m for help): > w

The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
確認
# /sbin/fdisk /dev/sdb

Command (m for help): > p

Disk /dev/sdb: 107.4 GB, 107374182400 bytes
255 heads, 63 sectors/track, 13054 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x6f42ab55
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1       13054   104856223+  83  Linux

# ls -altr /dev/sd*

3. ファイルシステム作成

今回はext3を利用

ファイルシステム作成
# /sbin/mkfs.ext3 -c /dev/sdb1

mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
6553600 inodes, 26214055 blocks
1310702 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
800 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872
Checking for bad blocks (read-only test): done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
作成したファイルシステムを利用する設定を記述
# cp -ip /etc/fstab /etc/fstab_bk
# vi  /etc/fstab
===以下を追加=======================================================================================
/dev/sdb1                       /extra_disk              ext3    defaults,noatime,data=writeback 1 2
===以上を追加=======================================================================================
  • /extra_distのところは好きな場所や名前を設定してください

4. マウント

# mount -a
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       26G  7.5G   17G  32% /
tmpfs                1004M   12K 1004M   1% /dev/shm
/dev/sda1             485M   53M  407M  12% /boot
none                 1004M   16K 1004M   1% /tmp
/dev/sdb1              99G  188M   94G   1% /roma

以上です。

ぼくがかんがえたさいきょうの.screenrc(とAutoHotKey)

screenrc

全体像

### Under Bar Style
hardstatus alwayslastline "%H[%n] [%w]"
termcapinfo xterm 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l'
shelltitle "$ |bash"

## active screen is red(rw)
## non active screen are blue(bw)
caption always "%?%F%{= rw}%:%{= bw}%?%H %-w%?%F%{=bu dk}%:%{=bu dc}%?%n %t%{-}%+w"

## split screen
# vertical
bind \ split -v
# horizontal(separate)
bind s split

## change screen size
# size up
bind + resize +1
# size down
bind - resize -1

### ウィンドウ操作モード(^z w でウィンドウを連続的に操作できるようになる))
bind w eval 'echo "Operate window"' 'command -c operate'

## Move screen
# Tabキーで一個前のスクリーンへ移動
bind -c operate ^] command

# iで上、jで左、nで下、kで右のスクリーンへ移動
bind -c operate i eval 'focus up' 'command -c operate'
bind -c operate j eval 'focus left' 'command -c operate'
bind -c operate n eval 'focus down' 'command -c operate'
bind -c operate k eval 'focus right' 'command -c operate'

# tでTop, bでbottomのスクリーンへ移動
bind -c operate t eval 'focus top' 'command -c operate'
bind -c operate b eval 'focus bottom' 'command -c operate'

## change screen size
bind -c operate + eval 'resize -v +1' 'command -c operate'
bind -c operate - eval 'resize -v -1' 'command -c operate'
bind -c operate > eval 'resize -h +1' 'command -c operate'
bind -c operate < eval 'resize -h -1' 'command -c operate'

# quit screen
bind Q quit

# Reload .screenrc
bind R source ~/.screenrc

各項目説明

UnderBarの設定
### Under Bar Style
hardstatus alwayslastline "%H[%n] [%w]"
termcapinfo xterm 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l'
shelltitle "$ |bash"

## active screen is red(rw)
## non active screen are blue(bw)
caption always "%?%F%{= rw}%:%{= bw}%?%H %-w%?%F%{=bu dk}%:%{=bu dc}%?%n %t%{-}%+w"
  • 現在操作中のscreenのアンダーバーを赤色に、それ以外を青色にする
画面の分割
## split screen
# vertical
bind \ split -v
# horizontal(separate)
bind s split
  • \で横分割
  • sで縦分割
スクリーンのサイズ変更
## change screen size
# size up
bind + resize +1
# size down
bind - resize -1
  • +で1行分大きくする
  • -で1行分小さくする
Windowモード
### ウィンドウ操作モード(^z w でウィンドウを連続的に操作できるようになる))
bind w eval 'echo "Operate window"' 'command -c operate'

## Move screen
# Tabキーで一個前のスクリーンへ移動
bind -c operate ^] command

# iで上、jで左、nで下、kで右のスクリーンへ移動
bind -c operate i eval 'focus up' 'command -c operate'
bind -c operate j eval 'focus left' 'command -c operate'
bind -c operate n eval 'focus down' 'command -c operate'
bind -c operate k eval 'focus right' 'command -c operate'

# tでTop, bでbottomのスクリーンへ移動
bind -c operate t eval 'focus top' 'command -c operate'
bind -c operate b eval 'focus bottom' 'command -c operate'

## change screen size
bind -c operate + eval 'resize -v +1' 'command -c operate'
bind -c operate - eval 'resize -v -1' 'command -c operate'
bind -c operate > eval 'resize -h +1' 'command -c operate'
bind -c operate < eval 'resize -h -1' 'command -c operate'
  • wでwindowモードに移行する

(Windowモード中に)

    • iで上、jで左、nで下、kで右のスクリーンへ移動
    • tでTop, bでbottomのスクリーンへ移動
    • +/-で上下のスクリーンサイズ変更
    • で左右のスクリーンサイズ変更
その他
# quit screen
bind Q quit

# Reload .screenrc
bind R source ~/.screenrc
  • Qでスクリーン終了
  • Rでスクリーンモードを終了せずにscreercへの変更を反映

おまけ(AutoHotkey)

screenは[Ctrl+a]でscreenコマンドの待機モードになるので、この[Ctrl+a]を押す機会が非常に多くなる。
なので、AutoHotKeyというToolでCapsLockキーを押した場合、このバインドが押されたこととするようにした
ちなみにAutoHotKeyスクリプトは以下のような感じ

#z::Run www.autohotkey.com
Capslock:: ^a
sc03a::^a
^!n::
IfWinExist Untitled - Notepad
	WinActivate
else
	Run Notepad
return

; for kinesis keyboard
;$Enter::Send,{Space}
;$Space::Send,{Enter}
;$LWin::Send,{Ctrl}
;$RWin::Send,{Ctrl}
;$Ctrl::Send,{LWin}s
;Delete::Alt
;Home::Delete
;LCtrl::Home
;Alt::End
;End::LCtrl

ライブラリの依存関係を調査するlddコマンド

lddコマンドを使ってライブラリの依存関係を調べることが出来ます。

ライブラリ調査

コマンド

ldd ${ライブラリ}

ldd libtokyocabinet.so

libbz2.so.1 => /usr/lib64/libbz2.so.1 (0x00002b859cd82000)
libz.so.1 => /usr/lib64/libz.so.1 (0x00002b859cf92000)
librt.so.1 => /lib64/librt.so.1 (0x00002b859d1b7000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b859d3c1000)
libm.so.6 => /lib64/libm.so.6 (0x00002b859d5dc000)
libc.so.6 => /lib64/libc.so.6 (0x00002b859d85f000)
/lib64/ld-linux-x86-64.so.2 (0x0000003a03000000)

ライブラリが設定されていない場合には

1. /etc/ld.so.confにライブラリの設定を記述するか、/etc/ld.so.conf.d/以下にconfファイルを作成して配置する
2. ldcofigコマンドでupdateを反映する

grepコマンドで指定したディレクトリ以下のファイル内容を全検索する方法

コマンド

grep -r '#{検索したい輪ワード}' #{検索したいパス}

  • カレント以下のファイルからhogehogeという文字を含む行を全検索する場合
grep -r 'hogehoge' ./

Linuxのセクタサイズとブロックサイズの調べ方

セクタサイズ

# fdisk -l /dev/sda1 | grep 'Sector size'
Sector size (logical/physical): 512 bytes / 512 bytes
  • HDDのデータ領域の最小単位

ブロックサイズ

# tune2fs -l /dev/sda1 | grep "Block size"
Block size:               4096
  • IO sysytemが利用する最小単位

例えば4095bytesのデータを読み込みたい時、PC側では1ブロック・4096bytesのデータを読み込んでから、その中の4095bytes分をユーザに返します。
しかし、4097bytesのデータを読み込みたい時は、PCは2ブロック・8192(4096 * 2)のデータを読み込んでから、その中の4097bytes分をユーザに返します。

    • (実際には読み込みたいデータがブロックをまたいでいる場合が多いのでもう少し多くなります)

ネットワークバイトオーダー・ビッグエンディアン・リトルエンディアンとは

バイトオーダー

  • マルチバイトデータのメモリ上での並べ方(順番)のこと
  • ホストバイトオーダー、エンディアンともいう
  • この並べ順は統一されておらず、プロセッサの種類によって異なる



並べ方

ビッグエンディアン

  • データの上位バイトからメモリに並べる並べ方
    • 1234とデータがあったら1234とメモリに格納する(実際にはちょっと違いますが)
利点
  • バイナリダンプするとそのまま読める(人類に優しい)
仕様しているプロセッサ


トルエンディアン

  • データの下位バイトからメモリに並べる並べ方
    • 1234とデータがあったら4321とメモリに格納する(実際にはちょっと違いますが)
利点
  • コンピュータがデータを処理しやすい(コンピュータに優しい)
  • 処理速度が早い
採用しているプロセッサ


指定の仕方

  • バイト順マーク(Byte Order Mark、通称BOM)と呼ばれる特殊なコード (U+FEFF) をデータの先頭に付与することで、データを受け取る側がエンディアンを判別できるようになっている
  • BOMがない場合には、ビッグエンディアンだと決められている


確認

ビッグエンディアンの場合は

# echo -n "12345" | od -t x
0000000 34333231 00000035
0000005

トルエンディアンの場合は

# echo -n "12345" | od -t x
0000000 34333231 35000000
0000005


言葉の由来

  • ガリバー旅行記の「(半茹で)ゆで卵を大きい方(下方)の端っこから割る」派と「小さい方(上方)の端っこから割る」派から来ている
  • それぞれ、「大きい方の端(=”Big-End”)から割る」”Big-Endian”派と「小さい方の端(=”Little-End”)から割る」”Little-Endian”派となる



ネットワークバイトオーダー

  • TCP/IPネットワークでは異なるコンピュータ間通信が前提なので、エンディアンが統一されていないと困ってしまう
  • 対応として、ビッグエンディアンに統一した
    • これをネットワークバイトオーダーという



どんな時意識すればよいのか

  • ネットワークを通してバイト単位でデータをやりとりする場合
  • 異なるシステム間でバイナリファイル等を交換する場合
  • 異なるシステムにプログラムを移植する場合
  • 構成するプロセッサが異なるマルチプロセッサ環境で共有メモリを使用する場合


I/O多重化の方法(selectとepollの違い)

select

  • 監視するファイルディスクリプタのサイズに制限がある
  • 一件一件FDを確認する
  • kernel側でFDのstatus情報を保持していないので、毎回チェックする必要がある
I/O処理の流れ

1. select側で監視するFDのリストを持つ
2. I/O処理のリクエストをselectが受け付ける
3. FDのリストをkernel側へ送る
4. kernelが送られたFDのstatusを一件目から順番に確認して更新する (※FDの数が多くなるほどここのコストが高い)
5. 全件の確認・更新が終わったらその情報をselect側に返す
6. 返ってきた情報をチェックしてstatusがReady状態のFDをさがす
7. 見つけたReady状態のFDに対してI/O処理を行う

epoll

  • 監視するファイルディスクリプタのサイズに制限なし
  • kernelの方でFDのstatusをチェックして管理してくれてるので、どのFDがReady状態かわかる
I/O処理の流れ

1. epoll側から監視して欲しいFDのリストをkernelへ送る
2. kernel側でリスト内のFDを常時監視してstatusを保存する
3. I/O処理のリクエストをepollが受け付ける
4. epollがkernelにReady状態のFDを問い合わせる
  - FDリストは再度送らない
5. kernelがReady状態のFDリストを返す
  - statusを保存しているので、一件一件Loopして確認・更新する必要がない
6. 返ってきたFDに対してI/O処理を行う
  - Ready状態のFDのリストが直接帰ってくるので再検索の必要なし

結論

管理するFDの数が増えるほど顕著に差がでるので、特別な理由がない限りepollの方を使いましょう