Linuxファイルシステム操作の実装

Linuxファイルシステム操作の実装

この読書ノートでは、主にファイルシステムに関連する操作を記録します。

ディスクとディレクトリの容量

ディスク全体のデータはスーパーブロックにありますが、個々のファイルの容量は inode に記録されます。ディスク使用量を表示するには、通常、次の 2 つのコマンドが使用されます。

df: ファイルシステム全体のディスク使用量を一覧表示する

du: ファイルシステムのディスク使用量を評価します (ディレクトリが占有する容量を評価するためによく使用されます)

$ df [-ahikHTm] [ディレクトリまたはファイル名]
パラメータ:
-a: システム固有の /proc (/proc はメモリにマウントされ、ディスク領域を占有しません) およびその他のファイル システムを含むすべてのファイル システムを一覧表示します。
-k: 各ファイルシステムの容量を KB 単位で表示します -m: 各ファイルシステムの容量を MB 単位で表示します -h: GB、MB、KB などの読みやすい形式で表示します -H: M=1024K を M=1000K に置き換えます -T: パーティションのファイルシステム名を一覧表示します (ext3 など)
-i: ディスク容量ではなくiノードで表示します

df が主に読み取るデータはファイルシステム全体のほぼすべてであり、読み取り範囲はスーパーブロック内の情報のみであるため、このコマンドは結果を非常に速く表示します。

$ du [-ahskm] ファイル名またはディレクトリ名 パラメータ:
-a はすべてのファイルとディレクトリの容量をリストします。デフォルトではディレクトリのファイル容量のみがカウントされるためです。-h は容量を人間が読める形式で表示します。-s は各ディレクトリが占める容量をリストせずに合計量をリストします。-S はサブディレクトリの合計を含みません。-k は KB 単位で容量をリストします。-m は MB 単位で容量をリストします。

duはファイルシステム内のすべてのファイルデータを直接検索します

リンクファイル: ln

Linux には 2 種類の接続ファイルがあります。1 つは Windows のショートカットに似ており、対象のファイルまたはディレクトリにすばやく接続できます。もう 1 つは、新しいファイルを生成するのではなく、ファイル システムの inode 接続を通じて新しいファイル名を生成する方法です。これはハード リンクと呼ばれます。

ハードリンク(ハードリンクと実際のリンク)

  • 各ファイルは inode を占有し、ファイルの内容は inode レコードによって示されます。
  • ファイルを読み取る場合は、ディレクトリに記録されているファイル名を使用して、正しい inode 番号を指定してから読み取る必要があります。
  • ファイル名はディレクトリに関連し、ファイルの内容は inode に関連します。ハード リンクは、ディレクトリ内に新しいファイル名を作成し、特定の inode 番号に接続する関連付けレコードです。
vagrant@vagrant-ubuntu-trusty-64:~$ cd /tmp
vagrant@vagrant-ubuntu-trusty-64:/tmp$ タッチテス
vagrant@vagrant-ubuntu-trusty-64:/tmp$ ln テスト test1
vagrant@vagrant-ubuntu-trusty-64:/tmp$ ll -i テスト test1
62273 -rw-rw-r-- 2 放浪者 放浪者 0 12月17日 12:39 テスト
62273 -rw-rw-r-- 2 放浪者 放浪者 0 12月17日 12:39 test1

2 つのファイルの inode 番号は同じであり、ファイルのアクセス許可属性もまったく同じであり、接続数が 2 になっていることがわかります。

ハードリンクの最大の利点はセキュリティです。ファイル名を削除しても、inode とブロックはそのまま残ります。このとき、別のファイル名を通じて正しいファイルデータを読み取ることができます。どのファイル名を使用して編集しても、最終結果は同じ inode とブロックに書き込まれるため、データを変更することができます。

一般的に、ハード リンクを使用してファイルを接続する場合、ディスク領域と inode の数は変わりません。ハード リンクは、ディレクトリの下のブロックに、関連するデータを 1 つ追加するだけです。inode は増加せず、ブロックの数も消費しません (ただし、関連するデータを 1 つ追加したときにディスクがいっぱいになった場合は、ファイル名の関連付けを記録するためにブロックを 1 つ追加する必要があり、ディスク領域が変わります)。

ハードリンクの制限:

  • ファイルシステムをまたぐことはできません
  • ハードリンクを使用してディレクトリに接続すると、接続されたデータは接続されたディレクトリの下にあるすべてのデータと接続される必要があり、環境がかなり複雑になるため、ディレクトリに接続することはできません。そのため、ディレクトリは現時点ではサポートされていません。

シンボリック リンク (シンボリック リンク、ショートカットとも呼ばれる)

シンボリック リンクは独立したファイルを作成し、このファイルは、リンク先のファイルのファイル名にデータ読み取りをポイントします。ファイルはポイント操作としてのみ使用されるため、ソース ファイルが削除されると、シンボリック リンク ファイルはソース ファイルを見つけられなくなり、開くことができなくなります。

vagrant@vagrant-ubuntu-trusty-64:/tmp$ ln -s テスト test2
vagrant@vagrant-ubuntu-trusty-64:/tmp$ ll -i テスト test2
62273 -rw-rw-r-- 2 放浪者 放浪者 0 12月17日 12:39 テスト
62275 lrwxrwxrwx 1 vagrant vagrant 4 12月17日 13:07 test2 -> test

2 つのファイルは異なる inode 番号を指しています。接続されたファイルで重要なのは、ターゲット ファイルのファイル名を書き込むことです。矢印の右側のファイルは 4 バイトなので、接続されたファイルのサイズは 4 バイトです。

シンボリックリンクによって作成されたファイルは独立した新しいファイルなので、inode とブロックを占有します。

シンボリックリンクファイルを変更すると、ソースファイルも変更されます。

$ ln [-sf] ソースファイル ターゲットファイル パラメータ:
-s: パラメータなしで接続するとハードリンクになり、-s はシンボリックリンクになります。
-f: 対象ファイルが存在する場合は削除して再構築します。

ディレクトリへのリンクの数

ファイルがハードリンクで接続されると、ファイル接続の数は 1 つ増加します。空のディレクトリを作成すると、. と .. の 2 つのディレクトリがあるため、空のディレクトリ /tmp/testing を作成すると、基本的に次の 3 つが存在します。
/tmp/テスト
/tmp/テスト/。
/tmp/テスト/..
/tmp/testing と /tmp/testing/. はどちらもディレクトリを表し、/tmp/testing/.. はディレクトリ /tmp を表します。したがって、新しいディレクトリを作成すると、新しいディレクトリへのリンクの数は 2 になり、親ディレクトリへのリンクの数は 1 つ増加します。

ディスクのパーティション分割、フォーマット、チェック、マウント

システムに新しいハードディスクを追加する場合は、次の手順を実行する必要があります。

  1. ディスクをパーティション分割して新しい利用可能なパーティションを作成する
  2. パーティションをフォーマットして、システムで使用できるファイル システムを作成します。
  3. さらに慎重にしたい場合は、新しく作成されたファイルシステムを確認できます。
  4. Linux システムでは、マウント ポイント (つまり、ディレクトリ) を作成してマウントする必要があります。

ディスクパーティション: fdisk

$ fdisk [-l] デバイス名パラメータ:
-l: 後続のデバイスのすべてのパーティションの内容を出力します。 fdisk -f のみを使用すると、システム全体で検出できるデバイスのすべてのパーティションが一覧表示されます。

# 例えば:
# まずディスクファイル名を見つける vagrant@vagrant-ubuntu-trusty-64:/tmp$ df /
ファイルシステム 1Kブロック 使用済み 使用可能 使用率 マウント済み
/dev/hdc1 41251136 3631948 35883276 10% /
# 数字なしで fdisk と入力 vagrant@vagrant-ubuntu-trusty-64:/tmp$ fdisk /dev/hdc
コマンドプロンプトが表示されます(ヘルプはm):mを入力すると、関連するパラメータプロンプトが表示されます。dはパーティションを削除すること、nはパーティションを追加すること、pはパーティションテーブルを画面に表示すること、qは保存せずにfdiskプログラムを終了すること、wは前回の操作をパーティションテーブルに書き込むことを表します。

q と w には特に注意してください。fdisk を終了するときに q を押すと、すべての操作が有効になりません。逆に、w を押すと、操作が有効になります。

ディスクパーティションの削除

パーティションを削除するには (たとえば、/dev/hdc のすべてのパーティションを削除するには)、次の手順を実行する必要があります。

  1. fdisk /dev/hdc: まずfdiskインターフェースに入る
  2. p: まずパーティション情報を確認します。/dev/hdc1を削除すると仮定します。
  3. d: このとき、パーティションを選択する必要があるので、1を選択します。
  4. w または q: w はディスク データ テーブルに保存して fdisk を終了します。後悔する場合は、q を押して削除操作をキャンセルします。

新しいディスクパーティションを追加する

以下のアクションを実行する必要があります。

  1. fdisk /dev/hdc: まずfdiskインターフェースに入る
  2. n: 新しいパーティションを追加
  3. p または e または l: 異なるパーティション タイプを選択します。p はプライマリ パーティション、e は拡張パーティション、l は論理パーティションを表します。
  4. 1 - 4: パーティション番号。1~4を選択できます。論理パーティションの場合は、パーティション番号を入力する必要はありません。
  5. 終了シリンダ番号を入力します。シリンダ/パーティション サイズを自分で計算するのが面倒な場合は、「+512M」のような形式を使用して、システムが 512M に最も近いシリンダ番号を割り当てるようにすることができます。
  6. p: パーティション情報を表示
  7. w または q: w はディスク データ テーブルに保存して fdisk を終了します。後悔する場合は、q を押して削除操作をキャンセルします。

パーティションの作成形式(プライマリ パーティション/拡張パーティション/論理パーティション)とパーティションのサイズに関しては、一般的に、新しいパーティションを作成する形式はいくつかあります。

  1. まだ1~4が残っており、システムに拡張パーティションがありません。この時点で、プライマリ/拡張を選択するオプションが表示され、1~4の数字を指定できます。
  2. まだ 1 ~ 4 個のパーティションが残っており、システムには拡張パーティションがあります。プライマリ/論理を選択するように求められます。p を選択した場合は、1 ~ 4 の番号を指定する必要があります。l を選択した場合は、システムによって論理パーティション ファイル名番号が自動的に割り当てられるため、番号を設定する必要はありません。
  3. 1-4が残っておらず、システムに拡張パーティションがある場合:この時点ではパーティションの種類を選択するように求められず、直接論理パーティションモードに入ります。

通常、パーティション分割後は、カーネルのパーティション テーブル情報を更新するために再起動する必要があります。「partprobe」を使用すると、カーネルにパーティション テーブルを再度見つけさせるように強制できます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Linux ファイルシステムのサイズを変更する方法 (Linux パーティションのサイズ変更)
  • Linux でマウントされたファイルシステムの種類を表示する方法
  • Linux ファイルシステムのブロックサイズを確認する方法
  • Linux環境でのGFSファイルシステムの使用
  • Linuxファイルシステムの詳細な分析
  • Linux パーティション ファイル システム タイプの概要
  • 「fsck」を使用して Linux のファイルシステムエラーを修正する方法
  • 新しい Linux オブジェクト ストレージ ファイル システム
  • Linux ジャーナリング ファイル システムの概要
  • Linux環境でExt3ファイルシステムを使用する

<<:  MySQL 8.0.16 圧縮版のダウンロードと Win10 システムへのインストール チュートリアル

>>:  Vueはダイアログのカプセル化を実装します

推薦する

画像のフェードインとフェードアウト効果を実現する js

この記事では、画像のフェードインとフェードアウトを実現するためのjsの具体的なコードを参考までに紹介...

mysql バックアップ スクリプト mysqldump の使い方の詳細な説明

この記事では、参考までにMySQLバックアップスクリプトを紹介します。具体的な内容は次のとおりです。...

JavaScript で Webpack を使用するチュートリアル

目次0. Webpackとは1. Webpackの使用2. Webpackのコアコンセプト2.1 エ...

MySQL 8.0 の統計が不正確である理由

序文Oracle であれ MySQL であれ、新バージョンで導入された新機能は、一方では製品の機能性...

CSS3 境界効果

CSSとは# CSS (Cascading Style Sheets の略) は、「カスケーディング...

カルーセル例の JS 実装

この記事では、カルーセルチャートの小さなケースを実装するためのJSの具体的なコードを参考までに共有し...

vue WatchとComputedの使用の概要

目次01. リスナーウォッチ(1)機能(2)特性と方法(3)監視対象(4)リスニングアレイ02. 計...

Nginx は gzip 圧縮に基づいてアクセス速度を向上します

1. nginx はなぜ gzip を使用するのですか? 1. 圧縮の役割:ページがgzipで圧縮さ...

rem をモバイル デバイスに適応させる方法の例

序文モバイル端末のREM適応ソリューションのレビューと概要remの使い方rem 単位の計算は、HTM...

MySQLがクエリキャッシュをキャンセルした理由

MySQL には以前、クエリ キャッシュ (Query Cache) がありました。8.0 以降では...

MySQL データベースのエンコーディングを utf8mb4 に変更する方法

utf8mb4 エンコーディングは utf8 エンコーディングのスーパーセットであり、utf8 と互...

MySQL接続がハングする理由の詳細な説明

目次1. 背景建築問題現象2. 分析プロセス接続プール不安に陥る雲を晴らして光を見よう3. 解決策I...

Xiaomi公式サイトの登録・ログイン機能を模倣するJavaScript

目次まずページレイアウトを構築する必要がありますJS関数1 JS関数2 JS関数3 JS関数4効果図...

LinuxスレッドのPID(TID、LWP)を取得するいくつかの方法の詳細な説明

Linux C/C++ では、スレッド レベルの操作は通常、pthread ライブラリを通じて実行さ...

VMware Workstationはデバイス/資格情報ガードと互換性がありません

仮想マシンをインストールするときに、「VMware ワークステーションはデバイス/資格情報ガードと互...