Upgrade to Pro — share decks privately, control downloads, hide ads and more …

パーティションとファイルシステムと

0n1shi
August 24, 2019

 パーティションとファイルシステムと

0n1shi

August 24, 2019
Tweet

More Decks by 0n1shi

Other Decks in Technology

Transcript

  1. 自己紹介 大西 和貴 出身: 京都 Twitter: _k_onishi_ Linux / Kernel

    / CPU / File System / Container / Virtualization C / Assembly / Nim SAKURA internet Inc. アプリケーショングループ / レンタルサーバーチーム
  2. 環境 $ uname -a Linux test 4.15.0-44-generic #47-Ubuntu SMP Mon

    Jan 14 11:26:59 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux $ cat /etc/os-release NAME="Ubuntu" VERSION="18.04.1 LTS (Bionic Beaver)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 18.04.1 LTS" VERSION_ID="18.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=bionic UBUNTU_CODENAME=bionic
  3. 使用ディスク $ sudo fdisk -l Disk /dev/vdb: 20 GiB, 21474836480

    bytes, 41943040 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes
  4. パーティション作成 $ sudo fdisk /dev/vdb # パーティションの作成 Command (m for

    help): n # パーティションタイプ Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p # プライマリ # パーティション番号 Partition number (1-4, default 1): # 1 # パーティションサイズ First sector (2048-41943039, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +2G # 2GB Created a new partition 1 of type 'Linux' and of size 2 GiB. # 保存 Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.
  5. パーティション作成 # ext2~4への後方互換性を守るためにinodeのサイズがデフォルトで256バイトになるので # ext2で必要最低限のサイズである128バイトを指定する。 $ sudo mke2fs -I 128

    /dev/vdb1 mke2fs 1.44.1 (24-Mar-2018) Creating filesystem with 524288 4k blocks and 131072 inodes Filesystem UUID: 0382c937-89bb-497c-b768-504c72bef867 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912 Allocating group tables: done Writing inode tables: done Writing superblocks and filesystem accounting information: done
  6. MBR(Master Boot Record) ディスクの先頭セクタ(512byte)にはマスターブートレコードというどのパーティションにも属さない領 域が存在する。 名前 サイズ 説明 ブートローダ 446

    byte OS起動用プログラム パーティションテーブル 1 16 byte パーティション情報 パーティションテーブル 2 16 byte パーティション情報 パーティションテーブル 3 16 byte パーティション情報 パーティションテーブル 4 16 byte パーティション情報 シグネチャ 2 byte 0xAA55
  7. パーティションテーブル パーティション情報を保持するテーブル。 CHSは使用されておらず現在はLBAが主流。 名前 サイズ 説明 ブートフラグ 1 byte 起動の能否(0x00:

    ブート不可, 0x80: ブート可能) パーティション開始位置 (CHS) 3 byte CHS: Cylinder Head Sector パーティションタイプ 1 byte パーティション終了位置 (CHS) 3 byte CHS: Cylinder Head Sector パーティション開始位置 (LBA) 4 byte LBA: Logical Block Addressing セクタ数 4 byte セクタ数
  8. ブロックグループ 名前 サイズ 説明 Super Block* 1 block ブロックのサイズや総ブロック数、グループ毎の inode数など

    Block Group Descriptor Table* n block 各ブロックグループの inode総数や空きinode数、 空きブロック数などを Reserved GDT Blocks* n block GDTのために予約されたブロック Block Bitmap 1 block ブロックの使用状況 Inode Bitmap 1 block inodeの使用状況 Inode Table n block このブロックグループが保持する inode情報 Data Blocks n block 実際のデータを含むブロック
  9. ブロックグループ Super Block及びBlock Group Descriptor、Reserved GDT Blocksはこのパーティション全体の情 報で、ブロックグループの0, 1及び3, 5,

    7の累乗番目にのみ存在する。ブロックグループの 0番目が プライマリ、残りはバックアップとなる。 (Ext2の初期バージョンでは全てのブロックグループがそれら を保持していた) Reserved GDT Blocksはグループディスクリプタテーブルのための拡張領域、すなわち予約スペー スとして確保されている。
  10. Super Block スーパーブロックはそのパーティション全体の情報を保持しており、主なものとしては以下が挙げられ る(ブロックの構造体はある程度大きいため全ては列挙しない )。 • 総inode数 • 総ブロック数 •

    空きブロック数 • 空きinode数 • ブロックサイズ • グループ毎のブロック数 • グループ毎のinode数 • マウント時間 • 書き込み時間 • Etc...
  11. Inode Table ファイルやディレクトリなどの情報を保持する inodeというデータ構造のテーブル。当該構造体は主に 以下のような情報を保持する。 • ファイル種別 • UID •

    アクセス時刻 • 作成時刻 • 変更時刻 • 削除時刻 • リンクカウント • ファイルフラグ • データブロック番号 • Etc...
  12. ルートディレクトリを読んでみる。 inodeテーブルはブロック番号235から始まることがわかる。次にそのテーブルの 2番目のエントリを 読む。 # (自作プログラムの出力を一部抜粋) inode table (8160) inode

    no.1 file mode: uid : 0 access time : 1566179823 creation time : 1566179823 link count : 0 first data block : 0 inode no.2 file mode: socket / block device / directory / user read / user write / user execute / group read / group execute / others read uid : 0 access time : 1566219174 creation time : 1566219086 link count : 4 first data block : 490 :
  13. # (自作プログラムの出力を一部抜粋) inodeNumber: 2 entryLength: 12 nameLength: 1 fileType: directory

    fileName: . inodeNumber: 2 entryLength: 12 nameLength: 2 fileType: directory fileName: .. inodeNumber: 11 entryLength: 20 nameLength: 10 fileType: directory fileName: lost+found ルートディレクトリを読んでみる。
  14. # (自作プログラムの出力を一部抜粋)(続き) inodeNumber: 16321 entryLength: 20 nameLength: 10 fileType: directory

    fileName: sample_dir inodeNumber: 12 entryLength: 4032 nameLength: 10 fileType: regular fileName: sample.txt ルートディレクトリを読んでみる。
  15. ルートディレクトリを読んでみる。 lsコマンドの結果と比較しても正しいことがわかる。 こうしてinodeの情報を追っていくことで特定のディレクトリやファイルのデータを抽出することができ る。 $ sudo ls -la /mnt/sde1/ total

    28 drwxr-xr-x 4 root root 4096 Aug 19 21:51 . drwxr-xr-x 5 root root 4096 Aug 21 00:04 .. drwx------ 2 root root 16384 Aug 19 10:57 lost+found drwxr-xr-x 2 root root 4096 Aug 19 22:11 sample_dir -rw-r--r-- 1 root root 0 Aug 19 21:51 sample.txt