Skip to content

Instantly share code, notes, and snippets.

@261shimizu
Last active April 21, 2024 00:37
Show Gist options
  • Save 261shimizu/c5ab9cd712ef15d7a6223253e0eaed8a to your computer and use it in GitHub Desktop.
Save 261shimizu/c5ab9cd712ef15d7a6223253e0eaed8a to your computer and use it in GitHub Desktop.
パーティションとか、ファイルシステムとか+ファイル管理基礎

パーティションのあれこれ

背景


パーティションを何気なくfdisk /dev/sdbとかやって作ったとき、に様々な警告について出くわす
1つずつ調べたのでまとめる

このギストに書いてあること


  • 4Kバイトセクタと512バイトセクタの話
  • 共有ディスクにパーティションを切った話
  • fdiskが古い
  • fdisk vs parted
  • MBRとGPT
  • ディスク拡張とファイルシステムの拡張、LV拡張

エラーメッセージ一覧


  • partition1 does not end on sylinder boundary
  • partition1 does not start on physical sector boundary
  • WARNING: Re-reading the partition table failed with error 22: Invalid argument

メッセージについての概要


fdiskコマンドは、LBA(論理ブロックアドレッシング、、、だったかな)とCHS(シリンダヘッダセクタ)方式の両方で情報を持っている、、、、かもしれない。
CHS方式はDOSで使うものであり、Linuxでは使っていない。
現在はほとんどがLBA方式を使っている

⇒なので、partition1 does not end on sylinder boundaryは無視でOK  

partition1 does not start on sylinder boundaryについては、
fdiskコマンドは、近年デフォルトになりつつある4KBセクタディスク(AFT規格?:Advanced Format Technology)に完全には対応していない
昔のものとの互換性を残しているために、何も考えずにパーティションを作成すると(物理セクタ境界とずれてしまって)ディスク性能が落ちる
(fdiskコマンドの論理セクタは512バイト)

⇒パーティションの開始セクタを8の倍数(第一パーティションは2048セクタ始まりが推奨)にしてあげればよい  
⇒これは 4096/512=8 から来てる。つまり論理セクタ境界と物理セクタ境界を合わせてやることが必要  
⇒実はfdiskたたいた後に、サブコマンドcを押すと2048始まりになる。確認するにはサブコマンドuでセクタ表示にする  
⇒これ実は最初に警告として出てるんだけど誰も言及していない。  
⇒とりあえずサブコマンドcとuを押してから作業すればよい  

⇒ちなみに別の方法として、fdisk -H 224 -s 56 /dev/sdaとかするとできるらしい  

ちなみに、fdiskのバージョン2.18以降なら対応している模様。
これはrhel7系なら使える
6系では2.17が安定板

更にちなみに、物理セクタのバイト数を確認する方法は、
fdiskコマンド実行したときに、Logical/Physical みたいなところに表示されている
もしくは、lsblk -t /dev/○○とかでも見られる

3つ目のメッセージについては、
fdisk のmanを読むと、
パーティションテーブルが更新されると、「終了する前にsync()とioctl()が実行される、すっごい昔はリブートが必要だったけど今は治っていると思う」って書いてある。
と思うって何ぞ。
なのでリブートしてねみたいなメッセージは実はリブート必要ない、、、かもしれない。

だけど、今回のメッセージ「Re-reading the partition table failed with error 22: Invalid argument」に関してはちょっと注意が必要。

普通に訳すと、引数が間違ってるよ!と言われている。
つまり、fdiskコマンドに渡すデバイス名に誤りがある可能性がある。

このメッセージが出るパターンで確認できたのは、

  • 共有ディスクへのパーティション作成
  • ディスク名の誤り(/dev/sda1とかしちゃったり。)
  • LVへのパーティション作成

このうち、問題ないのが共有ディスクへのパーティション作成
これは、共有ディスクなのでたしかカーネルとは別の何かがロックをかけてるから~みたいな話。
リブートで解決

ディスク名の誤りはともかく、
LVにはパーティション作れない!!ってことっぽい。
おそらくこんなことしようとしたのは、LVがどんなものかわかってなかった自分だけで、他の人はやろうとも思わないから情報が無い
でも多分作れない

fdisk vs parted


fdiskとparted、どちらを使うべきか。
fdiskは最後にwを押して保存するまで実際には書き換えない
partedはサブコマンドを押した瞬間に保存される

また、fdiskはGPT(GUIDパーティションテーブル)に対応していない。
EFI(UEFI)を搭載しているPCならGPTでもブートできる

つまりfdiskはMBR方式でパーティションを切ることになる。
MBR方式は、2TiBまでのパーティションしか作れない。

partedは、GPTを使えるので、2TiBを超えるパーティションを作るならpartedで行うべし。

やり方は、

# parted /dev/sda
(parted) print
(parted) unit s(MBとか、MiBとか%とかもできるみたい)
(parted) mklabel gpt
(parted) mkpart

とかでできる

ちなみに、partedは、パーティションの拡張/作成とかと一緒にファイルシステムの拡張/作成もできるという強みが、、、あった。

現在はファイルシステムをいじるのは非推奨で、mkfs.ext4とかでやれって書いてある
そしてそもそもpartedはext4とか対応していない可能性がある(最新なら対応しているかも)

また、partedは、gpartedという、GUIでグラフィカルにパーティションをいじれるコマンドも仲間

あと、fdiskはGPT対応していないといったけれど、gdiskなるコマンドが出てきて、こちらではfdisk的にgptを扱えるらしい(rhel7系からデフォルトインストールだったかな?)
そしてこのgdisk、かなり優れものらしいので、あればこっちを使うのがいいんでないかな。

ちなみに、2TB以上を認識することと、2TB以上のパーティションを作ることは別の話
4KBセクタにすることで、32ビットでも2TB以上のデバイスを認識することは可能になった
が、fdiskは512セクタで論理的には進めてMBRを使っているので、2TB以上のパーティションは作れない

MBRとGPT


HDDへのアクセスは、現在LBA(Logical Block Adressing)方式が一般的
この方式は、各セクタにユニークな番号を振っていき、そのセクタ番号を元にアクセスする
(HCSはどのヘッダのどのシリンダのどのセクタ)
どうやらこの方式に制限がかかる理由がある、、、、らしい

一般にHDDの論理セクタは512バイト。
fdiskはMBR(master boot record)という方式でパーティションを管理している。
このMBR方式とは、先頭セクタをMBRと呼び、その中にパーティションの情報や起動用の初期プログラムを書き込む
MBR方式で管理するHDDの場合、パーティションの先頭セクタとセクタ数を32bitで表記するので、2の32乗で4GB×512B=2TB となり、2TBの壁ができる

また、同じ理由で、パーティションを4つしか作れない(パーティション情報に使うビット数の制限から)
この課題を解決したのが、基本パーティションと拡張パーティション
拡張パーティションを1つとして、その中に論理パーティションをつくることで、4つの壁を超えた

しかし、2TBの壁は越えられない。

この壁を超えるために、MBRを64bitにするのは、めんどいので新しいのを作った

それがGPT(GUID Partision Table)。こちらは2番目のセクタから可変長の基本GPTと呼ばれるパーティションテーブルが置かれる
このパーティション情報は64bitで行われるため、2の64乗で1844京セクタまで扱え、×512バイトとすると8ZiBまで対応可能になった。

これにともなって、パーティションが128個まで作られるようになり、MBRのような基本・拡張パーティションという概念が不要になった。
全て基本パーティションである

こちらでは、MBRのUUIDのように、GUIDというものがある。

パーティション・ファイルシステム・LVMの拡張


パーティションを拡張し、それに伴ってファイルシステムも拡張したい場合

partedコマンドを使用すると、サブコマンドでファイルシステムも一緒に拡張してくれるものがある。 が、partedコマンドはどうもファイルシステムをいじらない方向にシフトしたいようで、パーティションだけ広げてファイルシステムは専用コマンド(resize2fs)を使用するのが推奨というニュアンスの記載がある

こうなると結局、partedでもfdiskでもやることは変わらない。
パーティション切りなおすだけ。
一回パーティション削除して、始まりのセクタを同じにして、パーティション作り直す。それだけ。

パーティション作り直したら、マウントして、resize2fs /dev/sdaとかするとファイルシステム拡張できる。
このresize2fsコマンドは、マウント状態に関わらず拡張できる。

多分、始まりのセクタを合わせればデータを残したままパーティションのサイズ変更できるけど、一応バックアップは(当然だけど)とった方が良い。

以上が、固定パーティションの拡張の話。

LVMを使うと、もっと柔軟にできる。
増設した分のパーティション切って、領域タイプ(システムタイプ?)をLinux LVMにしておく。
この増設パーティションに対してpvを作る(pvcreate /dev/sdb2)
↓ pvをボリュームグループに追加(vgextend VolGroup /dev/sdb2)
↓ LVを拡張(lvextend -l +100%FREE lvpath)
↓ ファイルシステム拡張(resize2fs lvpath)
(出来れば拡張前後でファイルシステムのチェックをした方が良い:fsck.ext4 lvpath)

実は、ディスクを丸ごとpvにする場合(複数パーティションが必要ない場合)、パーティションを作らなくても、ディスクをそのままpvにできる。
これの何が問題なのか、問題ではないのかは不明。
ただ、できる。

pvcreate /dev/sdb

ちなみに、拡大時はマウント状態でも(LVMなら)可能だが、縮小時はアンマウント必須
更にちなみに、拡大時は、lv拡張→ファイルシステム拡張の順番だが、縮小時は逆になって、ファイルシステム縮小→LV縮小となる。(考えれば当然か。)

参考


共有ディスクにパーティションを作るときのメッセージ
4KBセクタディスクでLinuxを使用する
4KBセクタディスクでLinuxを使用する2
2TBの壁
ext4ファイルシステムの拡張

ファイルシステム(ext4)のオーバーヘッドについて

背景


1TB(1000GiB←1TiBではないのはご愛嬌)のディスクにパーティションを切り、ファイルシステム作成、マウントとした。
パーティションは2つで、1つは20MiB、2つ目が残り全領域。
マウントの確認として、df -h コマンドをたたいた時に、サイズが微妙に小さくなっていることに気付く。

df -h の結果を簡単に(パーティションサイズは1000GiB)

  • サイズは985GiB
  • 使用済みは200MiB
  • 利用可能は935GiB

問題


  1. 「サイズ=使用済み+利用可能」とならない。
  2. サイズが15GiB減っている(1000GiB⇒985GiB)

結論


  1. ext4でフォーマットするときに(ext系なら起こると思われる。他は知らん)、予約領域と呼ばれる領域がデフォルトで5%分確保される。

  2. ファイルシステムには、管理領域(この言葉の使い方は正しいかはわからないけど、イメージとして。)が存在する。
    どうやらこの管理領域、メタデータが1.5%程度(1000GiB×1.5%=15GiB)のオーバーヘッドになっているらしい
    ファイルの断片化を減らし、パフォーマンスを向上する為にも使われる
    redhat的には、ファイルシステムが大きい場合を除き、デフォルト値を減らすことは非推奨。
    でもファイルシステムが大きい場合っていったいどれくらいから大きいということなのか、、、、。

解決法


2. の1.5%は解決するのは無理
1. の5%の方は、予約領域を減らすことが可能(0にもできる)

予約領域とは、rootユーザのみが書き込める予約領域であり、他ユーザがこのファイルシステムを目いっぱい使ってしまうことを予防する領域のこと。
これがあることによって、ディスクに空き容量がなくなってもrootは予約領域を使って作業ができ、修復作業などに使える
いっぱいになってもsyslogdなどのシステムデーモンも通常に機能できるのは、この領域のおかげ。

予約領域の変更方法は、

tune2fs -m 1 /dev/sda1 ← 予約領域を1パーセントにする

というように、tune2fsコマンドに-mオプションをつけて変更できる。
ちなみにこの方法は、マウントしていてもつかうことができる

tune2fs -r 2621440 /dev/sda1

とすると、予約領域が10GBにできる(ブロック数指定。4096*2621440=10GB)

ちなみに、ファイルシステムを作る前であれば、作成時に-mオプションにて予約領域の指定ができる

mkfs.ext4 -m 0 /dev/sda1

詳細


ext4ファイルシステムのブロック構成は、

項目 サイズ 意味
ブートブロック - OSの軌道に必要なブートローダなどが格納される。ブートでなければ存在しない?かも
スーパーブロック 1ブロック i-nodeの総数やブロックサイズ、秋ブロック数などの情報が記録される
グループディスクリプタ 可変 データブロックビットマップ、i-nodeビットマップ、i-nodeテーブルのアドレスを管理する
予約済みGDTブロック 可変 GDTはグループディスクリプタテーブル。ファイルシステムの拡張に備えてGDTの予備領域として予約している
データブロックビットマップ 1ブロック データブロックの使用状況が記録される
i-nodeビットマップ 1ブロック i-nodeの仕様状況が記録される
i-nodeテーブル 可変(実質512ブロック) ファイルやディレクトリなどのi-nodeを格納する
データブロック 可変 実データを格納する

予約領域は、データブロックの一部を使用する
ジャーナル領域(ジャーナルを書き込む領域)もデータブロックの一部

上記の内、データブロック以外は、使用可能領域ではなく、df -hのコマンドで容量としてカウントされない。
更に、データブロックの内、ジャーナル領域も容量としてカウントされない
前述のように、データブロックのうち、予約領域は使用可能領域としてカウントされない

つまり、
「ディスクサイズから、データブロック以外のブロックを引いて、更にジャーナル領域を引いたものが、df -hで見えるサイズ」
更に、
「df -hで見えるサイズから、予約領域を引いて、usedを引いたものが、avail」

で、結論としては、予約領域以外のこれらのオーバーヘッドが大体1.5%ってこと

予約領域の用途について


デフォルトで5%確保される予約領域は、特に何かに使われるということはない。
ただrootユーザのみが書き込める領域というだけ(こういう役割から、95%フルで使ってからでないとこの領域は使えないのかもしれない、真偽は不明)
しかし、この5%があることによって、結果的に断片化の防止に役立ったり、95%フルで使ってしまってもsyslogなどのサービスが継続して動作することができる。

仮にこの領域を減らした時に起こるリスクとしては、サイズを目いっぱい使ったりするときの動作が不安定になったりする。
大きな容量を持つとき、予約領域が必要な量が固定であれば、%は低くなる。したがってこの%を減らしても大丈夫だったりする、
が、どれくらいが大きいのかという目安はない。

ちなみに、なぜsyslogの話が出てきたかというと、logは、書き込める場所がないと、停止する(ずっと待ってる)。
したがって、書き込める場所がないと、システムが動かなくなったりする。
そのためにsyslogの件に言及したのではないか、と思われる。

100%使用するとシステムがハングアップするので、その防止にもなる。

ちなみに、結果的に断片化の防止に役立つ、と言っているが、具体的になぜ断片化防止に一役買うのかは不明。

確認方法


tune2fs -l /dev/sda1

とかするといろいろ情報が見えるらしい。

dump2fs /dev/sda1

とかだとグループディスクリプターブロックの数とか、ブロックグループのっ数とか見れる見たい

参考


ext4ファイルシステムのオーバーヘッドを厳密に理解する
dfコマンドが出力するディスクサイズが不正確
dfコマンドが正しい値を表示しない理由

ファイル管理

ファイル管理


Linuxでは、全てのもの(通常のデータファイルだけでなく、HDDやマウスなどのデバイスを含め)をファイルとして扱う
Linuxのファイル管理にはハードディスクとファイルシステムとディレクトリ構造の知識が必要

  • ファイルシステムとは
    ファイル情報(名前、更新日付などの属性データ、ファイルデータ本体等)を効率よく管理するための仕組み
    ファイルシステムにはいくつか種類があり、これらはファイルにアクセスしたときに得られる効率や安全性がに違いがある

  • パーティションとは
    ハードディスクを利用するために、ハードディスクを区切った単位
    ディスク内部を複数のパーティションに区切る作業(パーティショニング)が必要
    わける目的は、システムとデータのバックアップ頻度を差別化する、障害発生時の影響範囲を狭める、ファイルアクセスの速度向上

  • Linuxのディレクトリ構造
    ファイル単位でデータを管理していると、ファイルが多くなっていく
    多くのファイルシステムでは、複数ファイルを、ディレクトリという入れ物で管理する仕組みがある
    Linuxのディレクトリ構造は、/(ルート)ディレクトリを頂点に持つツリー状となっている

  • マウント
    Linuxでは、Windowsと異なり、ハードディスクやUSB、光学ドライブといったストレージデバイスを接続しただけではファイルを読み書きできるようにはならない
    (Linuxでは、デバイスを認識することと使用できることは別)
    ディスクを利用するためには、1つ目を/ディレクトリ以下に必ずマウントしなければならない
    2つ目以降は、すでにマウントされているディスクの中のディレクトリにマウントする(??)
    既に中身があるディレクトリに何かをマウントすると、マウントされたディレクトリの中身は上書きされ、今までの中身は参照できなくなる

  • 自分の中での理解

    ファイルシステムについての自分のイメージとしては、

    • ファイル≒データ
    • データは、ディスクのどこかに記録されている(100101011110...みたいな)
    • でもこれだと、どのデータがディスク上のどこにあるかユーザにわかりづらい
    • この、データ(日付や所有者情報を含む)と記録されている場所の紐付けを行ったり、
    • データに名前を付けたり(ファイル)
    • 複数データをパッケージ化・関連付けしたり(ディレクトリ構造)する
    • これによって、データを管理しやすくしたり、データの安全性を高めたりして、ユーザにわかりやすいように提供しているのがファイルシステム
    • ともかく、データに関する様々な情報を管理しているイメージ
    • その、管理する際の方法等が、ファイルシステムによって少しずつ異なる

    パーティションについてのイメージ

    • ディスクの分割
    • パーティションごとに役割を持たせる(?)
    • HDDも、ファイル(ディレクトリ)として扱われる
    • Windowsは、Cドライブ、Dドライブが別々のツリー構造になっているけど、Linuxは、HDDの全パーティションも、/(ルート)配下に位置している
    • このパーティションごとにファイルシステムを作って、それごとにどこかにマウント(ディレクトリとして登録するイメージ)して初めてディスクが使用可能になる

ハードディスクを使用可能にするには、以下の手順が必要

  1. パーティションの作成 → fdiskコマンド
  2. ファイルシステムの作成 → mkfsコマンド
  3. マウント → mountコマンド

パーティション


コンピュータのハードディスクとしては主にSATAとSASという二つのインターフェース(周辺機器を接続するためのハードウェア)規格が広く使われている
ハードディスクは、1つのパーティションとして使うか、4つまでの複数パーティションとして使う
パーティションは、基本パーティションと拡張パーティションとして扱われる
基本パーティションは4つまで、拡張パーティションは0または1で、合計で4つまでしか作れない
しかし、拡張パーティションの中に論理パーティションを複数作ることができるため、数は増える
(IDE:論理60個まで、SATA:論理12個まで、SCSI:論理12まで)
拡張パーティションは、論理パーティションの入れ物であり、ファイルシステムを作成することはできない

基本的な構成としては、基本パーティション3つ+拡張パーティション1つ
LVM(Logical Volume Manager)機能を使って複数のハードディスクを統合した1つのハードディスクとして使うことも多い

  • パーティション情報の参照、パーティションの作成
    fdisk [オプション] [デバイスファイル]
    オプションは、-lで、デバイスのパーティション情報を表示
    分けられたパーティションには、/dev/sda1や、/dev/sdb2など、末尾に数字が降られる
    /devディレクトリは、Linuxが認識するすべてのデバイスが置かれている
    このうち、hd*もしくはsd*となっているのがハードディスクドライブ
    fdiskコマンドを実行すると、コマンド入力を求められる(このコマンドのヘルプはm)
    パーティション作成の流れは以下の通り
    1. fdisk実行
    2. nで新しいパーティション作成
    3. eまたはpで基本パーティションか論理かを選択
    4. パーティション番号を指定
    5. 最初シリンダの指定
    6. Lastシリンダ(または、+シリンダ数)の指定(確保するサイズの指定)
    7. tで、使用目的を変更
    8. コードを指定(Lでコードリスト表示)
    9. wで保存
    10.qで終了

ファイルシステム


ディレクトリやファイル情報やデータをディスクのどこに保存してあるか管理するためのシステム
Linuxでは、ディストリビューションによって採用するファイルシステムが異なるが、多くの場合ext3,ext4を使う
Windowsの場合は、多くの領域を管理できるNTFSを利用していることがほとんど
CDやDVDではISO9660というファイルシステムが使われる

FS名 内容 最大サイズ 最大ファイルサイズ
ext2 Berkley Fast File Systemを参考にした16ビット構造 16TB 2TB
ext3 ext2にジャーナル機能を付加し、機能を拡張 2-32TB 16GB-2TB
ext4 ジャーナリングファイルシステム、ファイルの断片防止など機能拡張しパフォーマンス向上 1EB 16TB
ReiserFS 小さなファイルの扱いに向いたジャーナリングファイルシステム 8TB 16TB
XFS SGI社。ジャーナリングファイル 8EB 8EB
JFS IBM社。ジャーナリングファイル 512TB 4PB-8EB
FAT16 セクタを1次元配列で管理するファイルシステム。現在は使われない 2TB 2GB
FAT32 セクタを1次元配列で管理。外付けディスクなどで使われている 2TB 4GB
NTFS NT/XP/Vista用ジャーナリングファイルシステム 256TB 16TB
exFAT フラッシュメディア向けファイルシステム 8ZB 16TB

ジャーナル機能とは、ファイルシステムに対する書き換え処理のコマンドをファイルシステムに逐一記録する機能

HDDにデータを書き込む際、「ジャーナル」というデータベースにその操作を記録する。そして、実際にデータの書き込みが終了したあと、ジャーナルに書き込んだ操作情報を削除する。もしファイルの書き込み中にシステムがダウンしても、ジャーナル内のログを確認することで、ファイルの整合性を維持でき、高速な復帰が可能になる。

  • ファイルシステムの作成
    mkfs -t ファイルシステム名 -c デバイスファイル名コマンドを実行する
    オプションの-tはタイプ(ファイルシステム)の指定、-cはディスクの壊れている箇所を検出してそこを使用しないようにする

  • ラベルの付与
    ラベルとは、パーティションを認識するための名前のようなもの
    USBなどは、デバイス名が変わることがあるので、接続のたびに確認しなければならないが、ラベルを付けることでこの手間を省く
    e2label デバイス名 [ラベル]
    ラベルを省略して実行すると、現在のラベル表示
    ラベルを書いて実行すると、デバイスのラベルが変更できる

マウント


ハードディスクはパーティション分割してファイルシステム作って、存在するディレクトリにマウントして初めて読み書きできる
マウントに使用するディレクトリをマウントポイントと呼ぶ
/として利用されるファイルシステムは、/にマウントされており、あとから利用するファイルシステムも、必ずどこかのディレクトリにマウントして初めて利用できる

  • マウントとアンマウント

    df
    現在マウントされているファイルシステム(ファイルシステムを作成した時点でパーティションはファイルシステムとして扱われる??)の一覧表示
    オプションiでiノード番号表示

    mount -(t タイプ o オプション) デバイスファイル マウントポイント
    マウントするコマンド

    • t はファイルシステム
    • o はパーミッション(rwやroなど←ReadOnly)
    • a で、/etc/fstabにあるスワップ以外のパーティションをマウント

    umount マウントポイント
    マウントされたハードディスクやリムーバブルメディアを使用しなくなると、アンマウントする
    アンマウントできない場合は、マウスポイントが使用中であったり参照中でないか確認する

スワップ


カーネルは、ハードディスクからプログラムやデータをメモリ領域へ読み込んで実行する
プログラムやデータを新たに読み込むための空きメモリ領域がなくなると、メモリを空けなければならない
なので今使われていないデータやプログラムをメモリ領域から退避するが、この時のこれらのデータを一時的に退避させておく場所が、スワップ領域
スワップパーティションとは、Linuxのカーネルシステムがメモリの代わりとして一時駅に使うハードディスクのパーティション領域
この領域を使うには、メモリサイズに対応したパーティションを確保し、スワップファイルシステムをパーティションに作成する必要がある

  • スワップファイルシステムの作成

    • mkswap デバイスファイル
      スワップファイルシステムを作るコマンド
      オプションは、-cで、不要な部分を探して利用しないというオプション
      fdiskで見られるデバイス情報の、IDとシステムがスワップようになっているファイルでないとダメ
      スワップファイルシステムを作る前にスワップ用に変更するべし
  • スワップ領域を使用可能にする
    スワップ領域は作成した後に、swaponコマンドを実行することで実行可能になる

    • swapon デバイスファイル
      スワップ領域を有効化するコマンド
      オプションは、sで、これをつけると、現在利用しているスワップ領域を表示する

    • swapoff デバイスファイル
      こっちは無効にするコマンド
      オプションは、-v(指定したスワップを無効化),-a(全てのスワップを無効か)する

自動マウント


インストール時に作られたパーティションは、コンピュータの起動時に自動マウントされる
起動時に自動マウントされる設定を記述するファイルは、/etc/fstabというパスにあるファイル
このファイルをいじることで、自動マウントの設定をすることができる

/etc/fstabファイルに記述されているのは以下の項目

  • ブロックスペシャルデバイス
  • マウントポイント
  • ファイルシステムのタイプ
  • オプション
  • dumpコマンドがダンプ(バックアップ)するか否か(0→不要、1→ダンプする)
  • ブート時にチェックする順番(0だとチェックを行わない、ルートファイルシステムでチェックを行う時は1、それ以外なら2)

**mount -a**コマンドで、/etc/fstabファイルに指定されたswap以外のパーティションをマウント

詳しくは、このギストへ

iノード


ext3(ext2)ファイルシステムは、ファイルやディレクトリに対して、iノード番号というユニークな番号を割り振って管理している
ファイルシステムを作成したときにiノード領域という場所が確保される
iノード領域には、ファイルがディスク上にある位置やアクセス制限情報などが記録されている
ファイルシステムに作れるファイル数は、iノード領域の大きさに左右されることになる
もしファイルが多く作られてiノード領域が足りなくなると、そのファイルシステムにデータを書き込める領域があっても、新規のファイルが作成できなくなる

  • iノード情報の確認
    • df -i
      dfにオプションiをつけると、システムのiノード情報が表示される

    • ls -i
      lsにオプションiをつけると、ファイルに割り当てられて理いるiノード番号を表示
      同じiノード番号になっているものは、ハードリンクを示している

ハードリンクとシンボリックリンク


リンク機能は、ファイルをコピーしたり移動せずに、別のディレクトリにあるように扱うことができる機能
たとえば、コマンドの引数としてファイルやディレクトリを指定する場合、パス指定が長くてめんどくさいけど、この機能を使えば楽になる

  • ハードリンク
    ハードリンクは、ファイルの実態を直接指示して共有する
    ハードリンクを削除しても、元ファイルは削除されない
    ハードリンクは、iノード番号を共有することで実現しているので、別パーティション(別ファイルシステム)には作成できない

  • シンボリックリンク
    シンボリックリンクは、元ファイルが保管されている位置を示す擬似的なファイルを作る
    シンボリックリンクを消しても元ファイルに影響はない
    元ファイルを消すとシンボリックリンクからのアクセスがエラーとなる
    こちらは別ファイルシステムにも作れる
    Windowsで言うところのショートカット

  • リンクの作成

    • ln 元ファイル名 リンク名
      リンクを作成するコマンド
      オプションは、-sで、これをつけるとシンボリックリンクを作成する

ファイルは必ずiノード情報にリンクしていて、ファイルを作るとハードリンクが1つできる
ファイルのハードリンクを作るとiノード領域にあるリンク数が1つ増え、ハードリンクを削除するとリンク数が1つ減る
ファイルを消してリンク数が0になると、ファイルのデータがファイルシステムから完全に削除される
ちなみに、シンボリックリンクは、lsコマンドで見てみると、パーミッション情報の先頭がlになる

ディスク管理


コンピュータが異常終了するなど正常にシャットダウンが行われないと、ファイルシステムの管理情報とハードディスクに書き込まれたデータとの間で辻褄が合わなくなることがある
ファイルシステムが不整合になった時、チェックと修復を行う必要がある

  • ファイルシステムをチェックして修復する

    • fsck デバイス名
      ファイルシステムのチェックと修復を行う
      このコマンドは、異常終了した後のシステム起動時に自動的に実行される
      ext2ファイルシステムは、ジャーナル機能が無いので修復にとても時間がかかる
      修復中にファイルシステムが書き換えられると面倒なので、修復するときは対象がアンマウントされている状態でやるべし
  • ディレクトリ使用量の確認

    • df ディレクトリ又はファイル ディレクトリの使用量を調べる、またはファイルのサイズを調べる
      オプションは-sで、指定ファイルや指定ディレクトリのファイルサイズの総計を表示する
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment