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 8.0.21 のインストール手順と問題解決

公式サイトをダウンロードまず公式ウェブサイトにアクセスしてMySQLをダウンロードしてくださいリンク...

Dockerコンテナ内の設定ファイルの変更の実装

1. コンテナに入るdocker run [オプション] イメージ名 [起動コンテナに渡されるコマン...

実行中の時計を実装するための純粋な CSS3 コード

操作効果コードの実装html <div id="ウォッチ"> <...

WIN10 システムと Docker 内部コンテナ IP 間の通信方法

1. Windows 版の Docker をインストールしたら、Docker クイックスタート ター...

Nodeイベントループの包括的な理解

目次ノードイベントループイベントループ図メインスレッドイベントループタイマーキューの仕組み投票キュー...

Vue ユニットテストに関する予備調査

目次序文なぜユニットテストを導入するのですか?ユニットテストの概要テスト開発パターン1. テスト駆動...

10分でCSS3グリッドレイアウトを理解する

基本的な紹介前回の記事では、CSS3 のフレックスボックスを紹介しました。今日は、CSS3 のもう ...

fullpage.js フルスクリーンスクロールの具体的な使い方

1.fullpage.js ダウンロードアドレスhttps://github.com/alvarot...

MySQL5.7 シングルインスタンス自動起動サービスの設定プロセス

1.MySQLのバージョン [root@clq システム]# mysql -v MySQL モニター...

vue3を使用してAppleシステムのサイドメッセージプロンプト効果を模倣する

目次アニメーションプレビューその他のUIライブラリ始めるコンポーネントディレクトリ構造トーストおおよ...

MySQL ロックブロッキングの詳細な分析

日常のメンテナンスでは、スレッドがブロックされることが多く、データベースの応答が非常に遅くなります。...

CSS フォントの新しい使い方: カラーフォントの実装

デザイナーが特別なイベントのタイトルフォントとして以下のフォントを使用したい場合はどうすればよいでし...

mysql maxとwhere間の実行問題の概要

mysql maxとwhereの間の実行の問題SQLを実行します: テーブル「grades」を作成し...

JS配列インデックス検出におけるデータ型の問題の詳細な説明

WeChat アプレット プロジェクトを書いていたとき、その中に「都市選択」機能がありました。作者は...

Xtrabackup を使用した MySQL バックアップ プロセスの詳細な説明

目次01 背景02 はじめに03 ワークフロー04 いくつかの質問05 ファイルをバックアップする0...