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

推薦する

aタグ内のテキストを非表示にして画像を表示するには?360モードレンダリングに対応

多くの場合、画像を表示する<a>タグのスタイルに遭遇しますが、タグ内にテキストがあり、そ...

CentOS7 での PostgreSQL 11 の詳細なインストールと設定のチュートリアル

1. 公式ウェブサイトアドレス公式サイトではインストールの参考手順が紹介されています。公式サイトを見...

Vue で v-for を更新する方法

ヒント:配列変更メソッドによりv-forが更新され、ページが更新されます。配列を変更しないメソッド:...

CSS オーバーフローラップの新しいプロパティ値をどこでも使用

1.まず、overflow-wrap属性を理解する CSS のoverflow-wrapプロパティは...

Vue3+Vue-cli4 プロジェクトで Tencent スライダー検証コードを使用する方法

導入:従来の画像検証コードと比較して、スライダー検証コードには次の利点があります。サーバーは検証コー...

Nginx+Keepalived でデュアルマシン マスターとバックアップを実装する方法

序文まず、高性能サーバーの高可用性またはホットスタンバイソリューションである Keepalived ...

MySQLキーワードDistinctの詳細な紹介

MySQLキーワードDistinctの使い方の紹介DDL SQLを準備します: テーブルテストを作成...

mysql8.0.19 winx64バージョンのインストール問題を解決する

MySQL は、スウェーデンの会社 MySQL AB によって開発されたオープンソースの小規模なリレ...

HTML チュートリアル、HTML デフォルト スタイル

html 、アドレス、引用、本文、 dd 、 div 、 dl 、 dt 、フィールドセット、フォ...

Sysbench の MySQL ベンチマーク プロセスの分析

序文1.ベンチマークは、テスト オブジェクトのクラスの特定のパフォーマンス指標の定量的、再現可能、比...

モバイルデバイスでのフリーズ問題に対する CSS3 ソリューション (アニメーション パフォーマンスの最適化)

1. CSS、jQuery、Canvasを使用してアニメーションを作成する1. キャンバス利点: ...

MySQLは1つのテーブルからデータをクエリし、それを別のテーブルに挿入する実装方法

MySQLは1つのテーブルからデータをクエリし、それを別のテーブルに挿入する実装方法ウェブサイト開発...

ul リスト タグ デザイン ウェブ ページ 複数列レイアウト

数日前、CSS で 3 列レイアウトを書いていたときに、突然この方法を思いつきました。このアイデアは...

MySQL kill コマンドの使用ガイド

KILL [接続 | クエリ] processlist_id MySQL では、各接続は個別のスレ...