完全にtmpfs上にあるLinuxファイルシステム-妥協のない速度

背景



5年間、Windowsオペレーティングシステムに関するntfsセクションがramdiskに置かれていました。 これはハードウェアではなく、十分なRAMを持つ任意のPCでアクセス可能な純粋なソフトウェア手段によって決定されました。ramdiskはgrub4dosブートローダーを使用して作成され、Windowsはfiradiskドライバーを使用してそれを認識します。



しかし、最近まで、これをLinuxに実装する方法を知りませんでした。 いいえ、もちろん、toram、copy2ramなどのカーネルオプションを使用してメモリにロードされるLinux LiveCDは膨大ですが、これはまったく正しくありません。 第一に、これらは圧縮ファイルシステムであり、通常はsquashfsであるため、それらからの読み取りにはアンパックのオーバーヘッドが伴い、これはパフォーマンスに悪影響を及ぼします。 第二に、それはかなり複雑なカスケードマウントシステムです(squashfsは読み取り専用システムであり、OSが機能するにはレコードが必要であるため)が、可能な限り簡単な方法を望んでいました。完全にRAMでブート可能なLinux。



以下に、正常にテストされたメソッドについて説明します。 実験のために、最もふさわしいLinuxディストリビューションであるDebianが採用されました。



最小限のセットからネットワークインストールを使用しました。

http://ftp.nl.debian.org/debian/dists/unstable/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux

http://ftp.nl.debian.org/debian/dists/unstable/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz



しかし、Debianのインストールはこの記事の主題ではないので、詳しく説明しません。



通常、この選択は、RAMの容量が大きくなることはなく、KDEのような巨大なものを保持することは想定されていなかったという事実によって決まります。 ハードディスクで動作するために必要なプログラムをインストールした後、1.5ギガバイトが消費されました。 インストールは、スワップパーティションなしで1つのパーティションで実行されました。 16ギガバイトをインストールしたコンピューターのRAM。



実際に、方法



1.ファイル/ usr / share / initramfs-tools / scripts / localで、次の行をコメントアウトします。

checkfs $ {ROOT}ルート

および行:

マウント$ {roflag} -t $ {FSTYPE} $ {ROOTFLAGS} $ {ROOT} $ {rootmnt}

そしてその直後に次のテキストを挿入します:



mkdir / ramboottmp

マウント$ {roflag} -t $ {FSTYPE} $ {ROOTFLAGS} $ {ROOT} / ramboottmp

マウント-t tmpfs -oサイズ= 100%なし$ {rootmnt}

cd $ {rootmnt}

tar -zxf /ramboottmp/ram.tar.gz

umount / ramboottmp



2.コマンドmkinitramfs -o /initrd-ram.imgを実行します

そして、動作した後、ファイル/ usr / share / initramfs-tools / scripts / localを元の状態に戻します。



3.ファイル/ etc / fstabで、ルートパーティション/のマウントを説明する行をコメント化し、次の行を挿入します。

なし/ tmpfsデフォルト0 0



4. LiveCDから他のLinuxをダウンロードして、テスト済みのオペレーティングシステムを完全に削除します。

セクション全体をそのファイルシステムでアーカイブします。

cd / mnt / first && busybox tar -czf /mnt/work/ram.tar.gz *

終了後、ファイル/ etc / fstabを元の状態に戻します。



5.その結果、3つのファイルのみで構成されるLinuxが得られました。

カーネル、initrd-ram.imgおよびram.tar.gz。 ram.tar.gzの場所は、grubブートローダーメニューのroot = kernelパラメーターで指定されます。

タイトルRAM in RAM

カーネル/ vmlinuz root = / dev / sdb1

initrd /initrd-ram.img



これが全体の指示です。 必要なコメント:

-tmpfsをチェックするためのfsckがないため、checkfsコメント。

-initrdには単純なtarがなく、busyboxはアーカイブをアンパックし、アンパックできないバグがあるため、busybox tarは単純なtarの代わりにアーカイブを作成するために使用されます。

-通常、ルートに隠しファイルやフォルダーはなく、ディレクトリにアーカイブされているため、コマンドラインのアスタリスクは怖くありません。

-/ mnt / firstは、テスト対象のOSでマウントされたパーティションです。/mnt / work /は、アーカイブを配置するためのパーティションです。



どのように機能しますか?



ブート時にtmpfsなどのルートファイルシステムを作成する特別なinitrdを作成し(RAMにあるためこれはすべてソルトです)、オプションで指定されたroot =セクションを調べ、名前がハードコーディングされたアーカイブファイル(ram)を取得しますtar.gz)、FSツリー全体をこのtmpfsに展開します。



したがって、FSはメモリ内にあります。



さらに、tmpfsはRAMディスク(Windowsで使用するものを含む)とは有利な違いがあります-これはブロックデバイスではなく、ファイルシステムであり、ファイルが使用するのと同じくらいのメモリスペースを占有します。新しいファイル、およびソフトウェアをアンインストールするとファイルが削除されます。 残りのメモリは、オペレーティングシステムとプログラムで使用できます。 また、Linuxはすでにメモリであり、キャッシュする必要がないことを理解しています。 素晴らしいこと!



メリット



はい、もちろん、最新のオペレーティングシステムでのキャッシュは、ディスクデバイスのパフォーマンスの低下の問題を部分的に解決しますが、ディスクからファイルを最初に読み取るのにはまだ時間がかかり、いつでもキャッシュからアンロードすることもできます。 OS全体をメモリに配置することは、ファイルの読み取りと書き込みの可能な限り最高の速度を保証する妥協のないソリューションです。 ddを使用した最も簡単なテストでは、シーケンシャル読み取りでは1秒あたり3ギガバイト、シーケンシャル書き込みでは1秒あたり2ギガバイトが示されています。



dd if = / dev / zero of = / test bs = 1M count = 500

524288000バイト(524 MB)コピー、0.268589秒、2.0 GB /秒



dd if = / test of = / dev / null bs = 1M count = 500

524288000バイト(524 MB)コピー、0.167294秒、3.1 GB /秒



これは、HDDの約30倍、SSDの8倍です。



fioを使用した高度なテストでは、ランダムな読み取りと0.29マイクロ秒の完全なレイテンシ(レイテンシはSSDの2〜3(10進数)未満)のiops 349059が示されています。



randread 4K fio



仕事中



典型的な作業状況でのfreeコマンドの出力:



キャッシュされた使用済み共有バッファの合計

Mem:16469572 3236968 13232604 2075372 65552 2687436



ロード直後には、約2ギガバイトのメモリが使用されます。そのうち1.5がファイルシステムです。 16ギガバイトのRAMを備えているため、LibreOfficeやBlenderのような大規模なアプリケーションをインストールすることもできます。 ram.tar.gzのファイルサイズは約半分のギグです。これにより、小さなフラッシュドライブまたはCDにカーネル、initrdを保存できます。 ハードドライブがまったくない場合があります。 このようなシステムは破壊できません。 しかし、主なことはもちろん、仕事のスピードです。



結論として、このようなシステムでアプリケーションを起動する実際の速度に関する30秒間のスクリーンキャストです。 いいえ、これはトレイからアプリケーションを開くのではなく、メディア(この場合はtmpfs)からプログラムを起動しています:






All Articles