Edit
Linuxのファイル構造について

ハーディスクなどに関する追加や変更を考えているものにとって、Linuxのファイルシステムに関する概要を理解しておくことは非常に有用である。

Edit
装置の認識について

最近のLinuxでは装置の認識に特別なことを行う必要はなく、一般的なインターフェイス(IDE, SCSI, SATA, USB, FireWire等)を通して接続された装置は、再起動無く装置の登録が行われる。

Edit
記憶装置の追加などについて

通常、SATAによるHDの追加や、USBによるモバイルHDDなどの接続を行った場合、Linuxは接続された装置を/devのフォルダに登録をする。この/devへの登録や管理は最近では、udevというカーネルモジュールがその任を担っており、認識されたデバイスにudevが名称を与えて/devフォルダに追加するわけである。

以前では装置の追加はダイナミックに関するされることはほとんど無く、システムが勝手にhdaやらsdaなどの名称を割り振っており、ユーザーは記憶と勘によって、装置名を認識した名前を判断し、設定ファイルを作成していた。しかし近年、USBなどのリムーバブル装置も一般的になり、システム自動名称が不便な状況が生まれてきたため、ユーザールールをudevによって(例:「USGHD」は「MobileBackupHD1」という名前を割り振る)、装置の情報を元にユーザーがわかりやすいの識別名が与えられるようになった。

Edit
ファイルシステムのタイプ一覧

ext4Linuxで最新高性能なファイルシステム
ext3Linuxで一番標準的なファイルシステム
cifsWindowsなどとも互換性があるファウルシステム。以前のsmbfsの代替でもある
ntfs-3gWindowsのNTFSシステムのファイルシステム

Edit
udevについて

Linux カーネル2.6以上が必要となるこの機能は、以下のコマンドで確認できる。

# udevinfo -q path -n /dev/sda

このコマンドによって、/sys フォルダ内のこのデバイスに関する装置位置を確認できる。結果は /block/sda/sda1 などが表示される。次に、

# udevinfo -a -p /sys/block/sda/sda1

という形で、装置に関する多くの情報を獲得できる。この中でよく使われる装置識別のための情報として以下のものがある。

Edit
ドライブへのラベル設定とudev

ドライブによっては、ドライブラベルを格納できる場合がある、その場合にはudevinfoのコマンドから、ユニーク情報を引き出し設定せず、ドライブにラベルを書き込むことで、その代用が可能になる。

# e2label /dev/sda1 LabelName            <- ラベルの設定
# e2label /dev/sda1                      <- 設定の確認

その後、fstabの設定に追加する。

LABEL=LabelName    /media/usbhdd  ext3  defaults  0  0
/dev/sdb1          /usr/local/raid1  ext3  defaults 0 2
/dev/sdc1          /usr/local/raid0  ext3  defaults 0 2
/usr/local/raid0   /export/raid0     none  bind     0 0
/usr/local/raid1   /export/raid1     none  bind     0 0

※末尾の2つの数字は、左からDumpする(1)か、しないか(0)。右の数字はfsckの順番で、ルートドライブだけが、1で、それ以外は2を指定する。0の場合はfsckを行わない。

Edit
fstabを即時反映

# mount -a

Edit
gpt でのラベル付け

フォーマット時につける。(下記例は xfs フォーマット時)

# mkfs.xfs -L somelabel /dev/sdb1

Edit
ラベル確認

# ls -l /dev/disk/by-label

Edit
スワップへのラベル

swap パーティションにラベルを設定する場合は一度 swapoff してから mkswap でラベルを付けなおす。

# mkswap -L swap01 /dev/sda2

Edit
ハードディスクのベンチマーク

Edit
基本コマンド

# hdparm -t /dev/sdb1

Edit
Bonnie++

ハードディスクのベンチマークツール「bonnie++」を紹介する。各種アクセス方式の性能測定をこのアプリだけで対応することができる。
公式ページと思われるページ

# cd /usr/local/src
# wget http://www.coker.com.au/bonnie++/bonnie++-1.03e.tgz
# tar zxvf bonnie++-1.03e.tgz
# ./configure
# make
# make install

ただしRAMディスクなどの検証には、一部パラメータの変更が make の前に必要になる。

# emacs bonnie.h
  ....
  #define MinTime (0.01)             <- 元は0.5になっている。
  ....

実行は以下のとおり

# ./bonnie++ -u root -d /usr/local/src

Edit
ハードディスクのchkdisk

LinuxにおけるWindowsのようなセクタ単位でのエラーセクタの確認とパージは、以下のコマンドで実行する。

# e2fsck -p /dev/hda1

不良セクタの検出

# badblocks -vs -o hda1.bad /dev/hda1      <- hda1.bad が不良セクタ情報として作成される

検出されたセクタ番号を使用しないように登録

# fsck -l hda1.bad /dev/hda1

Edit
ハードディスクの状態を確認

# yum install hddtemp
# hddtemp /dev/sdb

Edit
USB型のハードディスクを利用する。

通常、USB型のハードディスクはCentos5.3では自動認識されるため、問題はないと思うが認識の状況を詳しく知る方法を説明する。

# cat /proc/bus/usb/devices

これは、バスに接続されているUSBデバイスの認識状況を表示する。

# cat /proc/scsi/scsi

通常USBハードディスクは、SCSIとして認識されるため、SCSIの認識状況を表示する。

# dmesg

dmesgでは、ndevが認識し新しいデバイス名を与えた結果を表示する。
※WindowsフォーマットのNTFSによるアクセスの場合は、下記を参照

Edit
NTFSフォーマットをマウントする。

NTFSフォーマットは未だ不安定な可能性が高く、重要度の高いバックアップに利用することはお勧めできないが、利便性が高いので使い方を気をつけることで、便利に使える。

Edit
インストールの前準備

FUSEという、filesystemをユーザースペース(カーネルコンパイルなどが必要無い)で利用できるようにするライブラリを導入する。

# wget http://jaist.dl.sourceforge.net/sourceforge/fuse/fuse-2.7.4.tar.gz
# tar zxvf fuse-2.7.4.tar.gz
# cd fuse-2.7.4
# ./configure
# make
# make install

Edit
インストール

# wget http://jaist.dl.sourceforge.net/sourceforge/linux-ntfs/ntfsprogs-2.0.0.tar.gz
# tar zxvf ntfsprogs-2.0.0.tar.gz
# cd ntfsprogs-2.0.0
# ./configure
# make
# make install

Edit
マウント

# ntfsmount /dev/sdd1 /mnt/winxp

Edit
NFSの設定

NFSv4 では、ユーザー名等とID番号をマップすることにより、UID/GID とユーザー名/グループ名が一致していなければ、ファイルへのアクセスは許可されない。 CentOSには初期段階ですでにインストールされている。もしインストールの必要があれば、yumでインストールを行う。

# yum install nfs-utils
# yum install nfs-utils-lib

NFSに関するサーバー群の説明

Edit
サーバー側の設定

nfs4では、chrootのようにサーバーの開放フォルダを、ルートフォルダのようにするために、fsid=0を指定する。そのためexportsファイルでは必ず、この行を記述する必要がある。

# vi /etc/exports
 /export        192.168.0.0/24(rw,sync,fsid=0)
 /export/data1  192.168.0.0/24(ro,sync,no_subtree_check,nohide)
 /export/data2  192.168.0.0/24(rw,sync,no_subtree_check,insecure_locks,nohide)

1行目のfsid=0は、nfsv4では必須、2行目以降のnohideも必須、nfs3とは性格が違いようだ

※右の設定項目については

コマンド概要
ro,rwRead Only, Read and Writeを意味し基本的なアクセスに制限を設定できる
sync遅延書き込みを有効 (async) にしておくと、サーバ上で実際に sync が行われる前にサーバがリブートした場合データが壊れる恐れがある。但しパフォーマンスは向上する。
fsid=0nfs4では、ルートフォルダに必ずこの記述を行う
subtree_check, no_subtree_checkNFSリクエスト発行の度に、現在のアクセス権限がツリー階層をさかのぼっても有効であるか、毎回チェックする。よって、セキュリティ的には subtree_check 有効ではあるがファイル数が多い、フォルダ階層が深い状態ではパフォーマンスが落ちる
insecure_locks, securesecureの場合、クライアントからの操作要求パケットの送信元ポートが 1024 より下、つまり特権ポートから発せられていないと受け付けない。
hide, nohideクライアントからの、exportフォルダの一覧機能で表示させるか非表示にさせるか選択
root_squash, no_root_squashNFSクライアントがルート権限としてファイルを書き込める(no_root_squash)か、ルート権限の場合に、勝手にnobodyにするか(root_squash)
all_squash, no_all_squashall_squashの場合は、ファイル書き込みのユーザーを、すべてanonuid, anongidで指定したものに強制的に変更する。
anonuid=xxx anongid=xxxidmapd.conf の Nobody-User, Nobody-Group の設定をこちらで上書きできる。ID 等はナンバーで指定

よって複数のフォルダを別に公開するためには、この仮想ルート(この設定におけるサーバの実態フォルダでは/home)の下に公開したいフォルダを別名マウントする。※起動時から設定したい場合にはfstabへの記述を忘れないこと。

# mount --bind /usr/local/real_folder /export/data1
# mount --bind /usr/data2_folder      /export/data2

その後、起動を行う。

# chkconfig nfs on
# service nfs restart
# exportfs -v (showmount -e でもOK)  <- mount チェック
# exportfs -ra            <- 修正した /etc/exports を反映させる。

また、iptablesの設定を行い、2049ポートの開放を行う。定義ファイルの説明については、ここを参照のこと。

# showmount -e localhost

これで現在exportしているファイルシステムを確認できる。これは、ホスト名を変えれば他のサーバーのものも確認できる優れもの。

Edit
クライアント側の設定

コマンドからマウント

# mount -t nfs4 server:/    /mnt/inport -o hard,intr

※注)サーバーの設定では、/export を公開しているがfsid=0を指定している場合はその場所がルートとなるので、クライアントからみると、server:/export ではなく、server:/ という形になる

※注)hard指定は、接続が切れたときに再度接続するまで、永遠にリトライする。そのため、フリーズしたように見えるが、サーバーが復活すれば、何事もなかったように接続してくれるのが便利。soft指定は、接続が切れたりした場合、エラーを返してすぐに終了するので、トラブルを発見しやすい

FSTABからマウント

# emacs /etc/fstab
  server:/   /mnt/inport    nfs4   ro,nosuid,_netdev,noauto,hard,intr  0 0

例:)

# mount -t nfs4 xen01.domain.com:/raid0 /usr/local/raid0 -o hard,intr

fstabの設定の詳細についてはここが詳しい

ドメイン名の追加

# vi /etc/idmapd.conf
 DOMAIN = mydomain.com

Edit
ファイルの構造について

Linuxでは、ファイルの構造について、ここで定義されている形でファイルやフォルダを配置することがきまっている。ここではルート直下にあるフォルダの簡単な存在意義の説明を行う。

Edit
/(ルート)フォルダ直下

フォルダ名役割
/binシステム管理者と一般ユーザーの両方が使う、極めて基本的なコマンド
/sbinシステム管理者が使う、極めて基本的なコマンド
/libシステムが利用するライブラリが保存されている。binファイルなどと同じ
/procカーネル内部の情報にアクセスするためのファイル
/sys/procと同じ機能を持つが、無秩序に広がった/procの領域を新しいkobjectの概念で再整頓されている領域で、未だすべてのデバイスやドライバが移行されているわけではない。一般ユーザーに取っては/procも/sysも同じものと考えて良い。(但し実装に違いがあるので、それぞれ違うフォルダ階層に違う機能が存在している点は注意)参照
/selinuxSELinux用の特殊なフォルダ。echo 0 > /selinux/enforce などでSELinuxをOFFにしたりできる。但し直接設定するよりも専用コマンドを利用した方が安全
/miscシステムが自動的に作成する特殊なフォルダ
/bootシステムが起動する際に読み込まれるOS本体が保管されている。通常はBIOSがディスクの先頭領域しか読めない関係で、boot用にディスクのパーテーションを別に確保して、ディスクの先頭領域にそのパーテーションを配置することで、BIOSがOS本体を読み込む際に発生するアクセス制限を回避する。
/rootルートユーザー用のユーザーフォルダ
/devOSで認識されたすべてのデバイスが配置されている
/etcシステムに関するすべての設定ファイルが保存されている。ユーザーが書き直すことができる
/homeユーザー用のフォルダ、システムとは関係が無い為、存在しない場合も多い
/mntファイルシステムにおいて、マウントを行う場合の特殊なフォルダ
/netオートマウント用マウントポイント。mntの兄弟
/lost+foundfsckでディスクをチェックしたときに作られる、破損ファイルの断片を収めるディレクトリ
/optyamなどのパッケージ管理システムで利用されるフォルダ。一般ユーザーが直接操作することは少ない
/tmp一時的な作業用のディレクトリ。リブートすると削除される。
/var変化していく(variable)ファイルを配置するディレクトリ。主にlogファイルなどが置かれる
/exportNFSをインストールすると作成されるNFS用共有ディレクトリ

Edit
その他の便利なコマンド

Edit
新規でハードディスクを追加する。

ゲストOSがパワーオフしている状態だとVM設定の画面が編集できるようになります。そこで、HDを必要分の容量を確保してHDを作成します。その後、ゲストOSを起動後、ルートでログインして以下の設定を行います。

# fdisk -l

このコマンドで「Disk /dev/hdb doesn't contain a valid partition table」と表示された/dev/sdb が新規の場所なので(hdbは台数によって変化します、SCSIで作成するとsdbとなります)この領域を設定します。

# fdisk /dev/hdb
  command (m for help): n     <- nはadd a new partitionのコマンドです。
   extend or prmary : p        <- pはPrimary Pertitionです。
   Pertition Number : 1        <- 通常は1でOKです。
   First Cylinder   : <空>     <- EnterだけでOKです。(1になります)
   Last Cylinder or etc : <空>  <- Enterで自動にMAX値を取ってくれます。
  command (m for help): t      <- Id の変更をします。
    Hex Code : 8e              <- LVMに変更します。
  command (m for help): w      <- 今変更したのを保存する。

次に物理ボリュームとして作成されたパーテーションを設定

# pvcreate /dev/sdb1
# vgdisplay                    <- VolumeGroupを表示される。
   .....
   VG Name        VolGroup00    <- この部分がボリューム名
   .....
# vgextend VolGroup00 /dev/hdb1  <- ボリュームに今回のドライブを追加
# vgdisplay -v VolGroup00        <- 設定を確認して定義されていない論理名を確認
# lvcreate -L 10G -n LogVol02 VolGroup00  <- 論理VolumeをLogVol02で作成(10G分)

※後からボリュームサイズを追加する。ただし、拡張するのと同じぐらいの空きも必要

# lvextend -L +200M /dev/VolGroup00/LogVol00      <- 200MB追加

最後にFSのサイズを変更する。

# resize2fs /dev/mapper/VolGroup00-LogVol00

※Logical Volumeの削除(ここも参照)

# umount -l /usr/local/mount-point      <- -lをつけるとbusyが終わり次第umount実行
# lvremove /dev/VolGroup00/LogVol03

ほかにも便利なコマンド

# pvs
# vgs
# lvs

論理ボリュームも作成できたので、フォーマットしてマウントします。

# lvscan                              <- これで名前を確認
# mkfs.ext3 -j /dev/VolGroup00/LogVol02   <- フォーマットです。
# mount /dev/VolGroup00/LogVol02 /usr/local/src    <- マウントです。
# df                                               <- マウント確認

※mkfsのmanpage:
※FAT32フォーマットの時は、「 # mkdosfs -F 32 /dev/sda1」など

最後に自動マウントのために設定

# emacs /etc/fstab
/dev/VolGroup00/LogVol02 /usr/local/src ext3 defaults 0 0  <- 追加

修正したFSTABのリロードは、以下のコマンド

# mount -a

Edit
追加でHDD領域を増やす。

Edit
その他のパフォーマンスUP

http://www.itmedia.co.jp/enterprise/articles/0707/19/news012_2.html

Edit
DISKの選定

通常利用するHDに何を選ぶか(単位はすべてByte/secに変更済み)

Edit
2TBを超えるディスクの利用について

多くのシステムにおいて、2TBを超える容量のハードディスクは、簡単なインストールが難しい状況である。Linuxにおいても同様であり、特殊なパーテーション管理(GPT)が必要になる。ただし、Linuxのシステム周りでGPTに対応していないものは多く(anaconda等)、あくまでもデータ領域にのみ使えるものと割り切ったほうがよいだろう。(BIOSの関係上、/boot, / (root) なども2TB以下でないと起動しない)

Edit
GPTパーテーション

通常、fdiskを利用してのパーテーション作成を、partedというパーテーション管理ツールを用いて、GPT(GUIDパーティションテーブル)を使用する。

# parted /dev/sdb                 <- デバイス名は、fdisk -l で確認すると良い。
(parted) mklabel gpt              <- GPT形式に変更
(parted) mkpart primary ext4 0 -0 <- パーテーション作成(-0 指定は最大容量)
(parted) quit

※ext4 を直接利用せず、LVMを通したい場合には、以下のコマンドを実行

# set 1 lvm on

Edit
トラブルシューティング

The resulting partition is not properly aligned for best performance.が、mkpartの時に出現する。

その場合、バーテーションの開始位置を以下のように変更する。
# mkpart primary ext4 1 -1

Edit
フォーマット

パーテーションで確保された後は、フォーマットを行う。

# mkfs -t ext4 /dev/sdb1

Edit
マウント

フォーマットが終わったら、次にデータフォルダの割り当てを行う。

# mount -t ext4 /dev/sdb1 /data

割り当て後、通常通りにディスクは利用できる。

Edit
アンマウント

# umount /dev/sdb1

もし、device is busy などが表示されたら、下記のコマンドでディスクにアクセスしているユーザーとプロセスが確認できる。

# fuser -muv /dev/sdd1

しかしながら、大抵は自分のカレントフォルダがマウント位置だったりする

Edit
HDDの名前付け(udev)

通常、ハードディスクを追加した場合などに、sda やら、sdb やらが勝手に付けられてしまい、ファイルツリーへのマウント時に不便が生じる場合がある。その場合には、udevの設定を行うことで、HDDに固有の名称を設定することで、その問題の回避が可能となる。

# udevinfo -a -p $(udevinfo -q path -n /dev/sda)

このコマンドで、追加されたハードディスクの情報が取得できる。この表示されたHDD情報を元に、udevの設定を行う。

# vi /etc/udev/udev.conf
BUS="scsi", SYSFS{rev}="0", SYSFS{model}=="eSATA-2 External", NAME="%k", SYMLINK="raid2"
BUS="scsi", SYSFS{rev}="0957", SYSFS{model}=="H/W RAID5       ", NAME="%k", SYMLINK="raid3"

この内容は、SYSFSで指定した条件のHDDに対して、システムで割り当てられる sda などの名前はそのままに、SYMLINKで指定するデバイス名も作成するというものである。これにより、このSYMLINKの名前を利用してマウントすることで、いつも決まったHDDが決まった位置にマウントされる。(SYSFSのどの条件を利用するかは、ハードウェアが提供する情報に合わせて先程のudevinfoの結果を見て自分で決める。)

Edit
参考リンク

Edit
JFSとは?

JFS(Journaled File System)は、IBMが同社の商用UNIX、AIX v3.1から実装したジャーナリングファイルシステムで、後にOS/2にも実装され、その後オープンソースとして公開され、現在はLinuxなどに移植されている。(Wikipedia)

Edit
インストール

通常 CentOS 5.3などでは yumでインストールすることができないので、IBMのサイトからダウンロードしてインストールを行う。JFS公式サイト

# yum install e2fsprogs e2fsprogs-devel     <- コンパイルに必要なもの
# cd /usr/lcoal/src
# wget http://jfs.sourceforge.net/project/pub/jfsutils-1.1.14.tar.gz

Edit
暗号化ファイルシステムについて

LinuxでもWindowsやOSXに存在するような暗号化ファイルシステムを導入することができるが、Linuxの場合暗号化とファイルシステムは別の仕組みで提供されているため、どのファイルシステムでも適用することができる。

<初期準備>

# shred -n 1 -v /dev/sdb                 <- あらかじめデバイスを乱数で埋める
# cryptsetup luksFormat -c aes-cbc-essiv:sha256 -s 256 /dev/sdb  <- パス設定
# cryptsetup luksOpen /dev/sdb sdb_crypt <- 暗号デバイスに接続   <- パス指定
# mkfs -t xfs -L raid5 /dev/mapper/sdb_crypt     <- フォーマット

<接続>

# cryptsetup luksOpen /dev/sdb sdb_crypt
# mount /dev/mapper/sdb_crypt ~/mnt/sdb

<解除>

# umount ~/mnt/sdb
# cryptsetup luksClose sdb_crypt

Edit
参考リンク