Linux周辺ファイルシステムのカスタマイズ方法

Linux周辺ファイルシステムのカスタマイズ方法

序文

一般的に、Linux システムについて話すときは、Linux カーネルと GNU プロジェクトに基づくさまざまなオペレーティング システム ディストリビューションを指します。 Linux オペレーティング システムの使い方を習得し、Linux オペレーティング システムの操作プロセスを理解し、カーネルと周辺サポート システムの関係を理解し​​、オープン ソース オペレーティング システムに対する理解を深めるために、車輪の再発明、つまり Linux ファイル システムを自分でカスタマイズすることにしました。

これを行うには 2 つの方法があります。

initを直接自分で実装する**\*(M1)***

BIOS のハードウェア情報をロード -> MBR を読み取り -> Grub を実行 -> カーネルをロード -> ドライバーをロード -> init -> bash を実行

system/sbin/init**\*(M2)*** を利用する

BIOS のハードウェア情報をロード -> MBR を読み取り -> Grub を実行 -> カーネルをロード -> ドライバーをロード -> init -> /sbin/init -> 実行レベル情報を取得 -> /etc/rc.d/rc.sysinit -> services -> /etc/rc.d/rc.local -> mingetty -> ログイン

まずは*M1*を選択しましょう。

アイデア

  • 元のシステムを使用して、必要なコンポーネントを新しいストレージにコピーします。
  • initrd.img メカニズムを使用した RAM ディスクでのテスト
  • 元のファイルカーネルとモジュールから始める

ステップ1: initrd.imgのシェルバージョンを取得する

まず、ファイルシステムを起動した後にカーネルが直接 Bash を取得できるように、スクリプト init を作成します。


スクリプトinitを作成する

そのうち、/bin ディレクトリにはよく使用されるコマンドが含まれ、init は自分で作成したスクリプトであり、/lib64 ディレクトリにはアプリケーションが依存する動的ライブラリが含まれます。

初期化コンテンツ

ここで、コマンドラインを使用して、bin および sbin ディレクトリを作成し、bash、ls、rm、cp、mv、echo、cat、less などの基本コマンドを追加する必要があります。これらのコマンドは、/lib64 などのディレクトリ内の動的にリンクされた共有ライブラリに依存する必要があるため、依存ライブラリをミニシステムに対応するディレクトリにコピーし、ldd コマンドを使用してアプリケーションとその依存動的ライブラリを照会する必要があります。完了したら、次を実行します。

見つけてください。 | cpio -H newc -o | gzip > /boot/initrd.img

ルート ファイル システムを initrd.img にパッケージ化し、/boot ディレクトリに配置します。システムは起動時に initrd.img 内の init を自動的に実行します。

initrd.img を生成するために多大な労力を費やした後、新しく作成された initrd.img をどのようにテストしますか? テスト用に、grub スタートアップ構成ファイルにエントリを追加する必要があります。

タイトル CentOS 6 Mini
ルート (hd0,0)
カーネル/vmlinuz-2.6.32-642.el6.x86_64
initrd /initrd.img

再起動後、起動オプションが表示されます。

ステップ2: 元のシステムをマウントする機能を完了する

元のシステムをマウントするには、ext4ファイルシステムのドライバやscsiデバイスの関連ドライバなど、元のシステムを実行するために必要なドライバモジュールをinitrd.imgにロードする必要があります。/sbin/modinfoは/sbin/insmodと連携し、ドライバは/moduleに配置されます。

ステップ3: デバイスを管理する機能を完成させる (udev)

ホスト デバイスを管理および監視するサービス プログラムである udevd を使用して、必要なドライバー モジュールを自動的にロードする方が、自分で実装するよりも信頼性が高くなります。 udevd ルール ファイルは /lib/udev/ ディレクトリにあり、設定ファイルは /etc/udev/ ディレクトリにあります。同時に、/etc/nsswitch.conf で設定されたネーム サービス スイッチも必要です。依存ライブラリは、/lib ディレクトリの libnss で始まるファイルです。上記のファイルをディレクトリにコピーし、/sbin/start\_udev コマンドを使用して udevd サービスを開始します。 (udevd は、/sbin/modprobe などの他のシステム コマンドを呼び出す必要がありますが、これは strace を使用して追跡および取得できます)。


ミニシステムディレクトリファイル

/dev ディレクトリはシステムが使用可能なデバイスを保存する場所であり、/log は strace コマンドによって生成されるログ ファイルです。

ステップ4: ログイン機能を完了する

ログインメカニズムはプロセス管理メカニズム、プロセスグループ、コンソールなど多くの側面を含む比較的複雑なため、*M2*を使用して/sbin/initコマンドを小さなシステムディレクトリにコピーし、initスクリプトを次のように変更します。

#!/bin/bash
/sbin/init を実行します

/sbin/init に制御を渡した後、システムが起動すると、ユーザーは一連の呼び出しが完了してログイン インターフェイスに入るまで待機してから、制御を取り戻す必要があります。

/sbin/init のプロセスは、大きく分けて 3 つの部分に分かれています。最初の部分は、udevd によるドライバー モジュールのロード、ファイル システムのチェック、ルートの切り替えで、関連する設定は /etc/rc.sysinit にあります。2 番目の部分は、さまざまなサービスの起動で、関連する設定は /etc/rc.d/ ディレクトリにあります。3 番目の部分はログイン部分で、/sbin/mingetty や /bin/login などのコマンドを呼び出す必要があります。上記のコマンドとファイルを小規模システムに対応するディレクトリにコピーし、設定を変更します。

ミニシステムの起動後、initrd.img は一時的なルート ファイル システムとしてメモリ内で直接実行され、ミニシステムではルート切り替えを実行する必要がないため、/etc/rc.sysinit の remount_needed() 関数本体はコメント アウトされ、ルート切り替えは行われません。

システムは新しい Upstart 起動方法を使用するため (/sbin/init プログラムは upstart ソフトウェア パッケージによって提供されるように変更されています)、Upstart 起動に関連する構成ファイルをミニシステム ディレクトリにコピーします。

/etc/inittabはデフォルトの実行レベルを設定します
/etc/init/rcS.conf は rc.sysinit スクリプトをロードしてシステム初期化タスクを完了します。
/etc/init/rc.conf 互換のスクリプト。各実行レベルの呼び出し処理を担当します。
/etc/init/rcS-sulogin.confはシングルユーザーモードの/sbin/sushell環境を起動します。
/etc/init/control-alt-delete.conf 制御端末 Ctrl+Alt+Del ホットキー操作
/etc/init/start-ttys.confは、開かれるtty端末の数とデバイスファイルを設定します。
/etc/sysconfig/initは開いているtty端末の数と端末のカラースキームを制御します。
/etc/init/tty.confはtty端末のオープンを制御します

bootmini/etc/inittab の実行優先度を 2 に変更します。その後、システムの起動時に、/sbin/init は bootmini/etc/rc.d/rc2.d/ ディレクトリ内の S で始まるファイルを実行します。有効にする必要のない一部のサービス ファイルの名前を K で始まるように変更します。

bootmini/etc/rc.d/rc.local ファイルでは、システムの起動後にユーザーが自動的に実行する必要がある操作を追加できます。

ログイン プログラムは、認証システム PAM に基づいています。設定ファイルは /etc/pam.d/ ディレクトリにあります。関連するライブラリ ファイルは /lib64/security/ とその従属ライブラリ ファイルです。ログインには、ユーザー グループ管理 /bin/chgrp、/bin/chown、/bin/chmod なども含まれています。ユーザー名を保存するファイルは /etc/passwd と /etc/group、ユーザー パスワード ファイルは /etc/shadow です。関連する他のファイルも strace の助けを借りて分析できます。

実機で実行できる完全なミニシステム

いくつかのディレクトリ ファイル:

/等


/bin

/sbin

ディレクトリ


バイナリ

この時点で、ファイル システムは実行中であるとみなすことができます。次の記事では、車輪の再発明を行い、Linux カーネルをカスタマイズします。実機効果については次の記事でも紹介します。

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • Linux シェル配列と連想配列の使用例
  • Linuxターミナルでシェルスクリプトを実行して現在実行中のアプリのログを直接出力するAndroidの実装方法
  • pyqt を使用して Linux コマンド プログラムをリモートでバッチ実行する方法
  • Linux シェル環境での Zabbix API の使用
  • Linux で誤って削除したメッセージ ファイルを復元する方法
  • 一般的な Linux の問題に対する解決策の概要
  • Linuxカーネルマクロcontainer_ofの詳細な分析
  • Linux のロード vmlinux デバッグ
  • Linux アカウントのパスワードを変更する詳細な例
  • DOSBox を起動後に自動的にコマンドを実行する方法

<<:  vuexの強制リフレッシュによるデータ損失問題の分析

>>:  IOSデータベースアップグレードデータ移行の詳細な例

推薦する

MySQLデッドロック問題の詳細な分析

序文私たちのビジネスがまだ初期段階にあり、同時実行の度合いが比較的低い場合、数年間はデッドロックの問...

Dockerでk8sをデプロイする方法

K8s k8s はクラスターです。クラスターには複数の名前空間があります。名前空間の下には複数のポッ...

MySQL 5.7.17 インストール グラフィック チュートリアル (Windows)

最近データベースを学び始めたのですが、とても興味深いコースだと感じていますが、含まれる内容の多くは私...

MySQLデータストレージプロセスパラメータの詳細な例

MySQL ストアド プロシージャ パラメータには、in、out、inout の 3 種類があります...

MySQL query_cache_type パラメータと使用方法の詳細

MySQL クエリ キャッシュを設定する目的は次のとおりです。クエリ結果をキャッシュしておくと、次回...

Linux での MySQL 5.1 および 5.7 のインストール チュートリアル

以下のコンテンツのオペレーティング システムは次のとおりです: Centos 6.7 yum で M...

Nginx に React プロジェクトをデプロイする方法の例

テストプロジェクト: react-demo react-demo プロジェクトをサーバーにクローンし...

Vueはキャンバスの手書き入力を使用して中国語を認識します

効果画像: 序文:最近、屋外の大画面プロジェクトに取り組んでいました。システムの入力方法は使いにくか...

Alibaba Cloud Centos 7.5 に MySQL をインストールするチュートリアル

CentOS 7 の yum ソースには、MySQL を正常にインストールするための mysql-s...

HTML における iFrame タグの 2 つの使用法

最近、私は「ぶどうコレクション」というプロジェクトに取り組んでいます。簡単に言うと、Budou ペー...

nginx で HSTS を有効にしてブラウザを HTTPS アクセスにリダイレクトする方法の詳細な説明

前回の記事では、https を使用したローカルノードサービスアクセスを実装しました。前回の記事の効果...

表の境界線の CSS 構文

<br />表の境界線の CSS 構文具体的な内容には、上境界線の幅、右境界線の幅、下境...

jsはユーザーのページ操作を記憶するためにクッキーを使用します

序文開発プロセスでは、ブラウザレベルでユーザーが実行した操作を記憶するなど、同様の要件に遭遇すること...

MySQL の自動増分 ID (主キー) が不足した場合の解決策

MySQL で使用される自動インクリメント ID には多くの種類があり、各自動インクリメント ID ...

Nginxリバースプロキシ設定でプレフィックスが削除される

nginx をリバース プロキシとして使用する場合、リクエストをそのまま次のサービスに転送するだけで...