追加したディスクを認識させて利用できるように設定する方法
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
以上です。
reference
mkfs
mount
ぼくがかんがえたさいきょうの.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がない場合には、ビッグエンディアンだと決められている
ネットワークバイトオーダー
どんな時意識すればよいのか
- ネットワークを通してバイト単位でデータをやりとりする場合
- 異なるシステム間でバイナリファイル等を交換する場合
- 異なるシステムにプログラムを移植する場合
- 構成するプロセッサが異なるマルチプロセッサ環境で共有メモリを使用する場合
ガリバー旅行記 [ ジョナサン・スウィフト ] |
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の方を使いましょう