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フロントエンドモジュール化のいくつかの仕様についての簡単な説明

目次序文フロントエンドモジュール開発の価値厄介な名前の競合面倒なファイル依存関係モジュール化の利点C...

MySQL 最適化のヒント: 重複削除の実装方法の分析 [数百万のデータ]

この記事では、MySQL 最適化のヒントで重複したエントリを削除する方法を例を使って説明します。ご参...

Reactはtodolistの追加、削除、変更、クエリを実装します

目次ToDoリストを例に挙げましょうディレクトリは次のとおりですアプリ入力.jsリスト.jsアイテム...

Deepin Linuxでカーネルを手動でアップグレードする方法

deepinとUbuntuどちらもdebianをベースにしたディストリビューションであり、ここではU...

echarts と vue.js を統合する際に発生するいくつかの問題の概要

序文現在、私は Beetlex のデータ分析プラットフォームに取り組んでいます。この製品の開発では、...

MySQL 8.0の新機能、隠しフィールドの詳細な説明

序文MySQL バージョン 8.0.23 では、新しい機能「Invisible Column (In...

aタグのname属性とid属性を使用してページ内を移動する方法

以前はaタグのname属性を使ってジャンプする方法しか知らなかったのですが、idも使えることを今日知...

vue-routerフック関数はルーティングガードを実装します

目次概要グローバルフック関数ルーティング固有のフック関数コンポーネント内のフック関数概要ルートガード...

Vue カプセル化コンポーネント アップロード画像コンポーネント

この記事の例では、参考のためにvueアップロード画像コンポーネントの具体的なコードを共有しています。...

DockerがMySQL構成実装プロセスを開始

目次実際の戦闘プロセスまずは主なコマンドと詳細を一つずつ説明しましょう起動が成功したかどうかを確認す...

Docker のホスト間コンテナ通信オーバーレイ実装プロセスの詳細な説明

サーバーも 2 つあります。準備:コンテナのホスト名を設定する consul: kv タイプのストレ...

Linux で so または実行可能プログラムの依存ライブラリを表示します

Linux で実行可能プログラムまたは so の依存ライブラリを表示します。 Linux の実行可能...

Linuxシステムのログの詳細な紹介

目次1. ログ関連サービス2. システム内の共通ログファイル1. ログ関連サービスCentOS 6....

JS での new の手書き実装

目次1 新しいオペレータの紹介2 新しいものは何をしましたか? 3 新しい演算子の実装をシミュレート...

CocosCreatorオブジェクトプールの使い方

目次序文:特定の操作ステップ1: プレハブを準備するステップ2: オブジェクトプールを初期化するステ...