読者です 読者をやめる 読者になる 読者になる

ハードディスクの構造と記録方法

 ハードディスクの構造がさっぱり分からなくて 101の受験時はとても苦労しました。

構造やパーティションの分け方、ファイルシステム等、ハードディスク (以下 HDD) 関連で LPIC に出るところを私なりにまとめてみます。

 

 

きたみりゅうじさんの本と以前紹介した自作パソコンの本に助けられました。同じような説明をしているリンクを貼っておこうと思います。

キタミ式イラストIT塾 ITパスポート 平成26年度 CBT対応

キタミ式イラストIT塾 ITパスポート 平成26年度 CBT対応

 

ストレージの基本をきっちり把握する - Part1 ハードディスク・ドライブの内部構造:ITpro

Insider's Computer Dictionary [シリンダ] − @IT

ここからは 101の話になります。

HDD にはいくつかの規格があります。

IDE , SCSI , SATA , SAS , USB です。

 

101 に出てくるのは、IDESCSI です。

IDE

Integrated Drive Electronics

IDEマザーボードに取付け部が 2つあって、優先順位によって プライマリ と セカンダリ と呼ばれます。この取付け部には 2台ずつ機器が取り付けられるようになっていて、これにも優先順位がありマスター と スレーブ と呼びます。

パソコンの基礎知識 > マザーボード > マザーボードの構成、チップセット、ATAインターフェイスの接続形態

Linuxデバイスファイル と言ってデバイスに対応するファイルが用意されています。

IDE の場合は下記のようになります。

/dev/hda:プライマリマスターに接続されたHDD

/dev/hdb:プライマリスレーブに接続されたHDD

/dev/hdc:セカンダリマスターに接続されたHDD

/dev/hdd:セカンダリスレーブに接続されたHDD

 

SCSI

Small Computer System Interface

IDE より高価。コスト以外の面だと、転送速度が速かったり、CPU 負荷が低かったり、拡張性が高い。

日本HP HP ProLiant White Paper:SAS (Serial Attached SCSI)テクノロジ:パラレルSCSIテクノロジ

 SCSI 機器を接続するには、SCSI アダプターカードをマザーボードPCI (Peripheral Component Interconnect) スロットに装着する必要があります。

Peripheral Component Interconnect - Wikipedia

デバイスファイルは以下のようになっています。

/dev/sda:1番目の SCSI HDD

/dev/sdb:2番目の SCSI HDD

/dev/sdc:3番目の SCSI HDD

/dev/sdd:4番目の SCSI HDD

 (SATA と USB も同じ)

 

パーティション

なぜパーティションに分割するのか?分割しないでそのまま使ってもいいじゃん?と当時思っていました。以下の理由が主だと思います。

◎不具合発生時のデータ救出

◎データのバックアップの効率化

HDDを複数のドライブに「分けて」使う理由 | Paragon(パラゴン)シリーズ情報サイト

1台のHDDでパーティションを分割する理由 - BTOパソコン.jp

パーティションの種類は 3種類あります。

基本パーティション

 最大 4つ作成可能。

拡張パーティション

 基本パーティションの 1つを拡張パーティションでさらに分割出来る。ファイルシステムではなく、論

 理パーティションが格納される。

論理パーティション

 拡張パーティション内に作成されたパーティション

実際にやってみましょう(SCSI HDD です)

 # fdisk /dev/sda

コマンド (m でヘルプ): m ← ヘルプを表示
コマンドの動作
a ブート可能フラグをつける
b bsd ディスクラベルを編集する
c dos 互換フラグをつける
d 領域を削除する
l 既知の領域タイプをリスト表示する
m このメニューを表示する
n 新たに領域を作成する
o 新たに空の DOS 領域テーブルを作成する
p 領域テーブルを表示する
q 変更を保存せずに終了する
s 空の Sun ディスクラベルを作成する
t 領域のシステム ID を変更する
u 表示/項目ユニットを変更する
v 領域テーブルを照合する
w テーブルをディスクに書き込み、終了する
x 特別な機能 (エキスパート専用)

コマンド (m でヘルプ): pパーティションテーブルを表示

ディスク /dev/sda: 21.5 GB, 21474836480 バイト
ヘッド 255, セクタ 63, シリンダ 2610
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0007288e

デバイス ブート 始点 終点 ブロック Id システム
/dev/sda1 1 25 200781 83 Linux

コマンド (m でヘルプ): nパーティションを作成
コマンドアクション
e 拡張
p 基本パーティション (1-4)

←基本パーティションの作成してみます
パーティション番号 (1-4): 2
最初 シリンダ (63-2610, 初期値 63): ←そのまま Enter で初期値63
初期値 63 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (63-2610, 初期値 2610): +200MB ←200MBを指定

コマンド (m でヘルプ): pパーティションテーブルを表示

ディスク /dev/sda: 21.5 GB, 21474836480 バイト
ヘッド 255, セクタ 63, シリンダ 2610
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0007288e

デバイス ブート 始点 終点 ブロック Id システム
/dev/sda1 1 25 200781 83 Linux
/dev/sda2 26 50 200812+ 83 Linux ←基本パーティションが作成されました

コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本パーティション (1-4)
e ←拡張パーティションを作成してみます

パーティション番号 (1-4): 3
最初 シリンダ (51-2610, 初期値 51):
初期値 51 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (51-2610, 初期値 2610): +200MB

コマンド (m でヘルプ): p

ディスク /dev/sda: 21.5 GB, 21474836480 バイト
ヘッド 255, セクタ 63, シリンダ 2610
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0007288e

デバイス ブート 始点 終点 ブロック Id システム
/dev/sda1 1 25 200781 83 Linux
/dev/sda2 26 50 200812+ 83 Linux
/dev/sda3 51 75 200812+ 5 拡張領域 ←拡張パーティションが作成されました

コマンド (m でヘルプ): n
コマンドアクション
l 論理 (5 以上)
p 基本パーティション (1-4)

l ←論理パーティションの作成
最初 シリンダ (51-75, 初期値 51):
初期値 51 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (51-75, 初期値 75): +52MB

コマンド (m でヘルプ): p

ディスク /dev/sda: 21.5 GB, 21474836480 バイト
ヘッド 255, セクタ 63, シリンダ 2610
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0007288e

デバイス ブート 始点 終点 ブロック Id システム
/dev/sda1 1 25 200781 83 Linux
/dev/sda2 26 50 200812+ 83 Linux
/dev/sda3 51 75 200812+ 5 拡張領域
/dev/sda5 51 57 56196 83 Linux ←論理パーティションが作成されました

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!

 ■ ファイルシステム

ファイルシステムとは?

HDD 上のどこに何というファイルがあるのか、といった情報を管理している。ファイルの読み書きは、ファイルシステムの情報をもとに行われます。

びぎねっと - はじめる人のびぎねっと。

 

101 は特に種類に関して問われることはなかったような。ext2,ext3,ext4,ReiserFS,XFS を押さえておきましょう。RHEL6 まではデフォルトのファイルシステムext4 だったのに対し、RHEL7 で XFS になったりなんかしています。

Linux パーティションにmkfsでファイルシステムを作る

 

 HDD を追加してパーティション上にファイルシステムを作成してみます。

f:id:iwamocchan11:20141231141429j:plain

f:id:iwamocchan11:20141231141444j:plain

f:id:iwamocchan11:20141231141505j:plain

f:id:iwamocchan11:20141231141519j:plain

f:id:iwamocchan11:20141231141538j:plain

設定出来たら、起動します。

# ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sdb

 おー、/dev/sdb が出来てる出来てる。

# fdisk /dev/sdb

コマンド (m でヘルプ): pパーティションテーブルを表示

ディスク /dev/sdb: 21.5 GB, 21474836480 バイト
ヘッド 255, セクタ 63, シリンダ 2610
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x585b1fdf

デバイス ブート 始点 終点 ブロック Id システム

(パーティション作成していないので何もでない)

コマンド (m でヘルプ): nパーティションを作成
コマンドアクション
e 拡張
p 基本パーティション (1-4)
p 

パーティション番号 (1-4): 1
最初 シリンダ (1-2610, 初期値 1):
初期値 1 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (1-2610, 初期値 2610): +200M

コマンド (m でヘルプ): pパーティションテーブルを表示

ディスク /dev/sdb: 21.5 GB, 21474836480 バイト
ヘッド 255, セクタ 63, シリンダ 2610
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x585b1fdf

デバイス ブート 始点 終点 ブロック Id システム
/dev/sdb1 1 26 208813+ 83 Linux

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!

 パーティションが作成できたので、パーティション上にファイルシステムを作成します。

 # mkfs -t ext4 /dev/sdb1

mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
52208 inodes, 208812 blocks
10440 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
26 block groups
8192 blocks per group, 8192 fragments per group
2008 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801

Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

 ext2,ext3,ext4 ファイルシステムを作成する場合には、mke2fs コマンドも使えます。

パーティション作成して ext3 ファイルシステムを作成してみます。

-j は journal です。ext3、XFS、ReiserFSは、ジャーナリングファイルシステムと呼ばれ、ジャーナルと呼ばれるデータ構造を持っています。

# mke2fs -j /dev/sdb2

mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
52416 inodes, 208844 blocks
10442 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
26 block groups
8192 blocks per group, 8192 fragments per group
2016 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801

Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

 mkswap も 101に出るのでパーティション追加して作っておきますか。

# mkswap /dev/sdb3
スワップ空間バージョン1を設定します、サイズ = 208840 KiB
ラベルはありません, UUID=c52f9a08-a4a9-4112-ad71-427207848651

 

ここからは 201の話になります。

■ LVM

Logical Volume Manager

この説明の仕方が好き。


Linuxキーワード - LVM:ITpro

円柱の切り分けみたいなよくある説明の仕方、あれ個人的によく分からなくて好きじゃないです。一般的なんですけどね。

 

LVM は、ディスクのパーティションを直接操作するのではなく、仮想的なパーティションである論理ボリュームを動的に管理します。

ディスクのパーティションを直接操作すると以下の制約あり。

・一度パーティションを作成するとサイズ変更不可(例外除く)

・別ディスクにパーティションを移動できない

・ディスクサイズを超えてパーティションの作成不可(RAID を使えば実現可)

 LVM 用のパーティションを準備します。パーティションを利用する為に、パーティションタイプを "8e"(Linux LVM) にします。(LPIC本変え方書いてないのね...時間消費したわ)

# fdisk /dev/sdb

コマンド (m でヘルプ): p

ディスク /dev/sdb: 21.5 GB, 21474836480 バイト
ヘッド 255, セクタ 63, シリンダ 2610
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0xa83e0ec0

デバイス ブート 始点 終点 ブロック Id システム
/dev/sdb1 1 26 208813+ 83 Linux

コマンド (m でヘルプ): m

コマンドの動作
a ブート可能フラグをつける
b bsd ディスクラベルを編集する
c dos 互換フラグをつける
d 領域を削除する
l 既知の領域タイプをリスト表示する
m このメニューを表示する
n 新たに領域を作成する
o 新たに空の DOS 領域テーブルを作成する
p 領域テーブルを表示する
q 変更を保存せずに終了する
s 空の Sun ディスクラベルを作成する
t 領域のシステム ID を変更する
u 表示/項目ユニットを変更する
v 領域テーブルを照合する
w テーブルをディスクに書き込み、終了する
x 特別な機能 (エキスパート専用)

コマンド (m でヘルプ): t
選択した領域 1
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 1 から 8e (Linux LVM) に変更しました

コマンド (m でヘルプ): p

ディスク /dev/sdb: 21.5 GB, 21474836480 バイト
ヘッド 255, セクタ 63, シリンダ 2610
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0xa83e0ec0

デバイス ブート 始点 終点 ブロック Id システム
/dev/sdb1 1 26 208813+ 8e Linux LVM

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!

 出来た。

 物理ボリュームとして初期化

# pvcreate /dev/sdb1

Physical volume "/dev/sdb1" successfully created

 ボリュームグループの作成

 # vgcreate testvg /dev/sdb1

Volume group "testvg" successfully created

 確認。

 # pvdisplay
--- Physical volume ---
PV Name /dev/sdb1
VG Name testvg
PV Size 203.92 MiB / not usable 3.92 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 50
Free PE 50
Allocated PE 0
PV UUID VIECXo-jy7s-Wb5W-Nc0W-QiGk-HRMR-tSNU42

 論理ボリュームの作成

 # lvcreate -L 100M -n lv01 testvg
Logical volume "lv01" created

 

RAID

Redundant Arrays of Inexpensive Disks、または Redundant Arrays of Independent Disks

レイドと読みます。(ライドって読んでた...やばい...(小声))

 

複数台の HDD を RAID 用のコントローラにつなげて、1台の仮想的な HDD として構築、運用する仕組みです。

HDD の速度や信頼性を向上させます。

RAID にはいくつか種類があって、RAID レベルといいます。下記を参照に。


RAIDの基礎知識:RAIDレベルを理解しよう (2/3) - @IT

HDD を追加して、/dev/sdc5 , /dev/sdc6 , /dev/sdc7 を使用します。

先程の LVM 作成時には、パーティションタイプを "8e" にしましたが、RAID は、"fd" にします。

デバイス ブート 始点   終点    ブロック    Id    システム
/dev/sdc1             1        14       112423+   83    Linux
/dev/sdc2             15      28       112455     83    Linux
/dev/sdc3             29      2610   20739915   5    拡張領域
/dev/sdc5             29      42       112423+    fd    Linux raid 自動検出
/dev/sdc6             43      56       112423+    fd    Linux raid 自動検出
/dev/sdc7             57      70       112423+    fd    Linux raid 自動検出

 こんなん。

RAID アレイの制御には mdam コマンドを使用します。

Mirror Device と覚えると頭に残るよーというアドバイスをいただきました。

 

RAID アレイの作成は CREATE モードで行う。

/dev/sdc5 , /dev/sdc6 , /dev/sdc7 から構成される RAID1 の RAID アレイ md1 を作成。

アクティブなデバイスは 2つ。1つは予備にします。

 # mdadm -C /dev/md1 --level 1 --raid-devices 2 --spare-devices 1 /dev/sdc5 /dev/sdc6 /dev/sdc7
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.

 /proc/mdstat ファイルで RAID アレイの状態を確認します。

 # cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sdc7[2](S) sdc6[1] sdc5[0]
112320 blocks super 1.2 [2/2] [UU]

 

unused devices: <none>

 /dev/md1 の状態を表示します。

# mdadm --query /dev/md1

/dev/md1: 109.69MiB raid1 2 devices, 1 spare. Use mdadm --detail for more detail.

詳細な情報を表示します。

# mdadm --detail /dev/md1

/dev/md1:
Version : 1.2
Creation Time : Thu Jan 1 00:07:07 2015
Raid Level : raid1
Array Size : 112320 (109.71 MiB 115.02 MB)
Used Dev Size : 112320 (109.71 MiB 115.02 MB)
Raid Devices : 2
Total Devices : 3
Persistence : Superblock is persistent

Update Time : Thu Jan 1 00:07:10 2015
State : clean
Active Devices : 2
Working Devices : 3
Failed Devices : 0
Spare Devices : 1

Name : localhost.localdomain:1 (local to host localhost.localdomain)
UUID : dcefdb25:64cbe4cd:e20b375f:0b7616eb
Events : 17

Number Major Minor RaidDevice State
0 8 37 0 active sync /dev/sdc5
1 8 38 1 active sync /dev/sdc6

2 8 39 - spare /dev/sdc7

 

LPIC に出る HDD の構築関連を書いてみました。大まかな部分はカバー出来ているのではないかなーと思います。