TL; DR initramfsをルートファイルシステムとともにカーネルにコンパイルすると、本格的なLinux Liveディストリビューションを単一のファイルに収めることができます。 UEFIを搭載したコンピューターは、GRUBなどのブートローダーの助けを借りずに、このようなファイルを直接読み込むことができます。 aircrack-ng、reaver 、Wi-Fiカード用のドライバーのプログラムを12メガバイトのサイズのファイルに収めることができました(確かにさらに小さくすることもできます)。
主な利点
- UEFIを搭載したどのコンピューターでも動作します-同じファイルがPCとMacで動作します。
- インストールは不要です 。1つのファイルをディスクのEFIパーティションにコピーし、NVRAM変数でこのファイルへのパスを指定するだけです。
- GRUBブートローダー、rEFIndをインストールする必要はありません-EFI Stubサポートで構築されたLinuxカーネルは、中間のブートローダーなしで直接ロードできます。
- USBフラッシュドライブは必要ありません -EFIパーティションにコピーされた配布パッケージは永久に存在し、いつでもダウンロードできます。 EFIパーティションはOSで使用されないため、メインシステムパーティションのスペースを占有しません。
- ブートプロセスは変更されません -UEFI設定でブート順序を変更せずに、システムを1回ブートできます。 コンピューターの次の再起動により、通常のオペレーティングシステムが読み込まれます。 ブート順序にLinuxのトレースはありません。
- FileVaultディスク暗号化などと互換性があります。 -ファイルは、特別な予約済みディスクパーティションであるEFIシステムパーティションにコピーされます。 Macコンピューターでは、そのサイズは約200メガバイトです。 Boot Camp専用であり、通常は使用されません。
なぜこれが必要なのですか?
仮想マシンなしのネイティブLinuxが必要なすべての場合。
Linuxで仮想マシンに転送できないときにPCIeデバイスを使用するため。 たとえば、パケットインジェクション用の組み込みWi-Fiカード。 仮想マシンをインストールして配布キット付きの大きなISOファイルをダウンロードするのが面倒な場合。 USBフラッシュドライブを台無しにしたくない場合。
コピーしたファイルを使用すると、常にLinuxディストリビューションを手元に置くことができ、システムを再インストールしても存続します。
Macのインストール手順
すべてのコマンドはmacOSから実行する必要があります。
ブート構成は重要ではありません。この方法は、BootCamp、rEFInd、およびその他の非標準構成の動作に干渉しません。 2009年以前のMacコンピューターがサポートされています(パフォーマンスは古いコンピューターではテストされていませんが、動作する可能性があります)。
- ファイルOneFileLinux.efiのダウンロード(20メガバイト)
- EFIパーティションをシステムにマウントします。
diskutil mount disk__
diskutil listコマンドでEFIパーティション番号を見つけることができます。
私の場合、コマンドは次のようになります。
diskutil mount disk0s1
- OneFileLinux.efiをEFIセクションにコピーします
cp ~/Downloads/OneFileLinux.efi /Volumes/EFI/
- NVRAMにブートオプションを追加する
bless --mount /Volumes/EFI --setBoot --nextonly --file /Volumes/EFI/OneFileLinux.efi
nextonlyオプションは、このダウンロードオプションが1回実行されることを意味します。 次回の再起動により、以前の設定が復元されます。 したがって、LinuxからmacOSに戻るには、再起動するだけです。
El Capitan以降のmacOSの最近のバージョンでは、 System Integrity Protection(SIP)テクノロジー、いわゆる「ルートモードなし」を使用しています。 このテクノロジーは、スーパーユーザーに対してもシステムファイルと変数の変更を禁止しています。 SIPはデフォルトで有効になっているため、最後のblessコマンドはエラーを返します。 リカバリモードから実行できます。 これを行うには、コンピューターの電源を入れてコンソールを開くときにcmd + Rを押し続けます
ユーティリティ->ターミナル 。 コンソールで、手順2と4を実行します。Recoverコンソールのコマンドは、 sudoなしで入力する必要があります。
これで、OneFileLinux.efiをダウンロードする必要があるたびに、回復コンソールの手順2と4、またはSIPがオフの場合はメインシステムから手順を実行するだけで十分です。
おそらくパーティションをマウントせずに祝福を行うことができますが、私はこれを行う方法を見つけていません。 その後、1つのチームで十分です。
PC命令
PCには多くのダウンロードオプションがあります。 マザーボードにUEFIシェルが組み込まれている場合は、OneFileLinux.efiファイルへのパスを指定するだけで、Linuxを1回起動できます。 Thinkpad X220のセットアッププロセスについて説明します。
- OneFileLinux.efiをダウンロードして、EFIセクションに配置します
- NVRAMにブートオプションを追加する
efibootmgr --disk /dev/sda --part 2 --create --label "One File Linux" --loader /OneFileLinux.efi
- 起動中にF12を押して、必要なオプションを選択します。
ソースからの組立説明書
github.com/zhovner/OneFileLinuxプロジェクトのソース
ディストリビューションは、kernel.orgおよびAlpine Linux Mini Root filesystemからのクリーンな4.16-rc1カーネルでコンパイルされます 。
自分で簡単に組み立てることができます。
initramfsの準備
Initramfsは、カーネルの起動時にメモリにマウントされるディスクイメージです。 通常の配布では、ロードの初期段階で必要なドライバーがそこに配置されます。 そこに本格的なルートファイルシステムを配置できます。
Alpine Linuxのルートファイルシステムを使用しました。 これは、組み込みシステムおよびコンテナ用の最小限のディストリビューションです。 彼には、カーネルとプリインストールされたプログラムなしで、busyboxベースのルートファイルシステムとapkパッケージマネージャーのみの配信オプションがあります。
alpine linuxのchroot:
chroot ./alpine-minirootfs /bin/ash
環境内にいると、必要な変更を加えることができます。 apk addでパッケージを追加し、openrcを使用してサービスを変更します。
必要な情報はすべてwikiにあります 。
組立
ビルドスクリプトを実行します。 カーネルモジュールをコンパイルし、initramfsに配置して、カーネルをコンパイルします。
./build.sh
ヘルプ!! 111
現時点では、ディストリビューションはかなり曲がっています。 Linuxを知っているなら、どんな助けでも本当に感謝します。 このプロジェクトを受け入れ可能なレベルまで仕上げることができればクールです。
既知の問題:
-
カーネルモジュールのロードを無効にします -すべてのドライバーはカーネルにコンパイルされます。
それらを別々のモジュールにしてinitramfsに入れるのはおそらく正しいでしょう
✓修正済み -
HiDPIディスプレイのフォント -HiDPI画面の解像度が非常に高いため、
標準の8x16フォントは非常に小さく見えます。16x32フォントをコンパイルしました。このフォントはピクセル密度が高くても普通に見えますが、通常の画面には大きすぎます。良い方法では、画面の解像度に応じてフォントを選択する必要があります。
✓修正済み。 これで、HiDPI画面用に大きなフォントが自動的に選択されます。 fontsizeコマンドを使用して、いつでもフォントサイズを変更することもできます。 -
WiFiカードドライバーは1つだけです 。MacBookに統合されたBroadcom 43602アダプター用の1つのドライバーがコンパイルされます。良い方法では、カーネルモジュールの形ですべての一般的なドライバーとそれらのファームウェアを収集する必要があります。
✓修正済み。 多くの一般的なWiFiアダプターのサポートが追加されました。 -
udev / mdevは壊れていますか?「どのように機能するかわかりません。」ハードウェア構成に応じてモジュールをロードする方法は?
✓修正済み - ガベージ -現在、多数の古いドライバーがカーネルと共にインストールされています。 非圧縮形式では、カーネルモジュールの重量は100メガバイトを超えます。 それらのほとんどは除外できます。
github.com/zhovner/OneFileLinuxの問題についてコミットし、問題を作成するよう皆に招待します。