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データベースアップグレードデータ移行の詳細な例

推薦する

Tomcat 例外の解決方法 (リクエスト ターゲットに無効な文字が見つかりました。有効な文字は RFC 7230 および RFC 3986 で定義されています)

1. シナリオ表示Tomcat ログに次の例外情報が時々報告されます。何が起こっているのでしょうか...

Linux (Ubuntu 18.04) に vim エディタをインストールする方法

デスクトップ システムをダウンロードするには、Ubuntu の公式 Web サイト (https:/...

jQueryとCSSを組み合わせてトップに戻る機能を実現

CSS操作 CS $("").css(名前|プロ|[,値|関数]) 位置$(&q...

モバイルプラットフォーム開発におけるメタタグの適用の詳細な説明

デスクトップ プラットフォームの Web レイアウトのメタ タグは誰もがよく知っています。これは常に...

LDAP ユーザー認証を使用するように Linux を構成する方法

私は CentOS に実装された LDAP ユーザー管理を使用しています。これはインターネット上のほ...

Docker rocketmq デプロイメントの実装例

目次準備展開プロセスRocketMQ の初体験関連する質問ヘルプドキュメント私は最近 RocketM...

シンプルなドラッグ効果を実現するJavaScript

この記事では、ドラッグ効果を実現するためのJavaScriptの具体的なコードを参考までに紹介します...

MySQL複合インデックスの詳細な研究

複合インデックス (結合インデックスとも呼ばれます) は、複数の列に対して作成されるインデックスです...

JavaScript でよく使われる 3 つの Web エフェクトの詳細な説明

目次1要素オフセットシリーズ1.1 オフセットの概要1.2 オフセットとスタイルの違い視覚領域クライ...

xHTML タグと HTML タグの違いは何ですか?

すべてのタグは小文字でなければなりませんXHTML では、すべてのタグは小文字でなければなりません。...

MySQL 8.0.17 インストール グラフィック チュートリアル

この記事では、参考までにMySQL 8.0.17のインストールグラフィックチュートリアルを紹介します...

LinuxにPython 3.6をインストールして落とし穴を避ける

Python 3のインストール1. 依存環境をインストールするPython3 はインストール プロセ...

React antdはフォームの動的な増減を実現します

以前、動的フォームを記述しているときに落とし穴に遭遇しました。インデックスの添え字をキーとして使用す...

Vue で Google サードパーティ ログインを実装するためのサンプル コード

目次1. 開発者プラットフォームの構成問題を解決する1. 開発者プラットフォームの構成1. 開発者プ...

React.Childrenの詳しい使い方

目次1. React.Children.map 2. React.Children.forEach ...