prjquotaは後から追加されたため、このような構成になっているようです。 Androidでも8.1までは、アプリの暴走予防に使われていました。(参考), ここで、projectとは「ディレクトリ群」のことを指します。 ここではquotaコマンドを使います。, まだなにも設定していないしデータを書いてもいないので、全て0となっています。 | superblockの情報を見るには、dumpe2fsコマンドが便利です。, 次に、inode番号3のusrquotaファイルの中身を取り出します。 dumpe2fs 1.45.5 (07-Jan-2020) 変更 ), Raspbian Strechでネットワークデバイスを正しく設定するための基本知識, PuTTY X11 proxy: Authorisation not recognisedの対処法(Windows). Why not register and get more from Qiita? これはquotactlシステムコールのI/Fから来る制約で、 quotaの制限を超えたら、D-busにメッセージを送ってくれます。 変更 ), Google アカウントを使ってコメントしています。 /dev/loop19 0K 0K 0K 0 0 0, debugfs 1.45.5 (07-Jan-2020) Mingming Cao, Andreas Dilger, Alex Zhuravlev (Tomas), Dave Kleikamp, No-atime, append-only, synchronous-write, no-dump, h-tree (directory), immutable, journal, secure-delete, top (directory), allow-undelete. inodeのデータ構造はstruct ext4_inodeで定義される。このinodeは他のファイルシステムなどと同様にディスク上のinodeとメモリ上のinodeではデータ構造が変わる。ソースの方にもちゃんと書いてあるけど。, inodeの大きさはスーパーブロックのs_inode_sizeで読むことができてext4では256バイト。 昔はコンソールにメッセージが出力されてたらしいのですが、 また、調査したOSSのバージョンは以下のとおりです。, まずはDisk quotaによる書込制限を実験してみます。 ext4のDisk quotaについて調べる機会がありましたので、備忘のためにまとめておきます。 ブロック65ということは0x41(ブロック番号) * 0x1000(ブロックサイズ)して0x41000とわかる。ブロックグループ7はブロック72なので0x49000までがblock bitmapのデータ。, このダンプの中でグループ2とグループ6がないのは多分EXT4_BG_BLOCK_UNINITが立っていたため。, では次はinode bitmapを見てみる。これも先ほどと同じでグループディスクリプタにあるinode bitmapのインデックスからアドレスを出すだけ。, もう見えているけどinode tableの開始位置も見えている。 ここまででブロックグループ0に関してはData Blocks以外は見た形。ビットマップなんかはブロックグループ0にあるので他はみなくても良いや。, ブロックグループ0のダンプを見ているとどこにディレクトリエントリーがあるかはわかるんだけど、なぜ0x49000から32MBの領域なのかは不明。 cで書くとこんな感じで。, 今使っているディスクイメージの場合、s_blocks_count_loとs_blocks_count_hi、s_blocks_per_groupはこのような値。ブロックサイズは4KiB。, このディスクは32バイトのグループディスクリプタを使っている。最初64バイトだと思っていて計算が合わなかったけど、INCOMPAT_64BITのことに気づいて納得した。 fs/quota/Kconfigによるとext2, ext3, ext4, jfs, ocfs2, reiserfs, gfs2, xfsがあります。(5.4.13時点), 本記事はext4を対象にしています。 ext4の場合usrquota、grpquota、prjquotaがそれぞれ普通にinodeを持つファイルとして、存在します。, ただし、ファイルツリーとしては見えない、隠しinodeという扱いです。 次に((ブロックグループ数 * ディスクリプタ-のサイズ) / ブロックサイズ) + 1で完了。 ただこのライブラリ、あまり抽象度は高くないです。 参照の計算量を抑えつつ空間消費量も減らすために結構複雑な構造をしています。, なおquotaファイルの構造は仕様とか見つからなかったので、 struct ext4_super_blockの定義はここ。, スーパーブロックの次はGroup Descriptors。これは1ブロックに収まるとは限らない。これの開始位置は1ブロック目から。 それではsetquotaコマンドを使って、UID 1000に対して容量のquota制限を設定します。 マウントオプションはリストにあがってないやつは省き。, こうしてみてみるとext4ってよさそうな。 extent, dir_nlink, extra_isize, flex_bg, uninit_bgってかんじかなー。 これの数はs_reserved_gdt_blocksを見れば良くて、debugfsでも当然確認可能。このディスクでは63になっている。ダンプはこのように。, 次に来るのは何かというとグループディスクリプタでみたblock bitmap。ブロックグループ0は「block bitmap at 65」とdebugfsでも表示されている。 この場合、最初にブロックグループの数を計算する。これはスーパーブロックのs_blocks_count_loとs_blocks_count_hiを64bit整数にしてs_blocks_per_groupで割ればOK。 そうすると、ブロックグループ7のblock bitmapの終端からブロックグループ1のinode bitmapの開始位置まで空きがあるのがわかり、inode tableも同様なことがわかる。 huge_fileはどっちでも。, 次のHTML タグと属性が使えます:
, Intel Smart Response Technology(ISRT)をOS on SSDで利用する, sistema de seduccion subliminal pdf gratis, ファイルシステムへのデータの配置時、ブロックアロケータが1ブロックずつではなくたくさんのブロックに配置できるように(マルチブロックアロケーション), barriersオプション(RDBMSでbegin transaction, commit transactionとかやるようなもん)がデフォルトに, extent — 4にあたる。でかいファイルへの読み書きが速くなる予定。フラグメンテーションも軽減。, dir_nlink — 3にあたる。企業システムとかだとたまにこれはまるんだよね。, extra_isize — 11にあたる。タイムスタンプがナノ秒まで見られてもありがたみがあまりよくわからないが、inodeが256バイトないとext4の固有の機能が使えないぽい。たぶんextentsとかblock group周りで使いそう。あとまあ、でかいファイルだと間接参照が減るんで、extents使わなくても大容量ファイルの取り扱いは早くなる。んじゃないかな。昔はinodeの枯渇とかありましたね。, flex_bg — ブロックグループのinodeとbitmapの配置位置が自由になる。これにより仮想的な大きなブロックグループを使ってinodeの割り当てをする。速度向上やフラグメンテーション軽減。, uninit_bg — 7にあたる。ブロックグループのデータブロックビットマップとiノードビットマップを初期化しないでアクセスする。使用されていないinodeのリストをそれぞれのブロックのiノードテーブルの最後にチェックサムをつけて保持しておいて、e2fsckのときに読むなよフラグをグループディスクリプタにくっつける。結果inodeの数が多ければ多いほどfsckにかかる時間が相対的に短くなる。, barrier — 13。デフォルト。無効にするならnobarrierまたはbarrier=0。, orlov — 5。デフォルト。マルチブロックアロケータを使う。ext3までのがいいならoldalloc。, delalloc — 6。デフォルト。キャッシュから実際に書き出されるまでアロケーションを遅らせる。flex_bgやextentsが有効だと相乗効果でその間に配置の最適化とかが進んでより速く。キャッシュに入ったらすぐブロック確保したいならnodelalloc。. 該当のファイルのinodeからブロックのアドレスを算出するのは以下の用に。 ext4ではこのような構造体。, グループディスクリプタに限らないけどext3からext4の拡張でext3の頃に使っていたアドレスとかの大きさが増えている。 この辺りのダンプはこのようなもの。, ext4のデータはリトルエンディアンでジャーナル機能のjbd2が使用している部分はビッグエンディアンらしい。何でエンディアンを混ぜるか>< というディレクトリエントリが存在する。"." さて、INCOMPAT_64BITが立っていない場合、ディスクリプタのサイズは32バイトなのでext3_group_descを使っても値は取得できるんだけど、ext4の拡張部分に当たるbg_flagsを扱うにはext4のグループディスクリプタとして見たほうが楽というのもある。bg_flagsはext3のbg_padとbg_reservedを使っているので。, Group Descriptorsは1ブロックとは限らないので何ブロック使っているかは別途計算が必要。 ディレクトリエントリーのレコード長(rec_len)は4バイトアラインになるように作られ、4バイト境界のサイズにならない場合は'\n0'がnameに追加される。その他の注意点としてディレクトリエントリーはブロックを跨がない、また、最後のレコードのrec_lenはブロックの最後までの長さになる。 どういうことかというと、上のダンプでは"."、".. 普通のファイルはmountすることで参照できますが、 ブロックサイズSIZEを指定する(1024/2048/4096)省略時は適切な値に設定される, スーパーユーザーのみが利用できる予約ブロックのパーセンテージRESERVEDを指定する(デフォルトは5%), ファイルシステムの拡張オプション(stride:RAIDアレイのファイルシステムで1ストライプあたりのブロック数、resize:将来リサイズしても対応できる最大ブロック数)を指定する, DEVICEとして指定されたファイルシステムがマウントされていたりブロックデバイスでない場合も強制的に実行する, ジャーナルオプションOPTIONS(size:内部ジャーナルのサイズ、device:外部ジャーナルファイル)を指定する, ファイルシステムオプションを指定する(dir_index:検索の高速化、filetype:ディレクトリエントリにファイルタイプ情報を保存、has_journal:ext3ジャーナルを作成、journal_dev:ext3ジャーナルを指定されたデバイスに作成、sparse_super:スーパーブロックのバックアップコピーを減らす), デフォルトのファイルシステムパラメータを最適化できるようファイルシステムタイプを指定する(small、floppy、news、largefile、largefile4).