投稿

CentOS 7でkernelモジュールを作成してロードした

Follow @venividivici830 Linuxカーネルは、ローダブルモジュールのサポートを有効にした場合、カーネルの機能の一部をモジュールとして、カーネルの動作中に動的に追加することができる。 デバイスドライバーは、カーネルモジュールとして作られることが多い。 デバイスドライバーを勉強するための前提知識として、カーネルモジュールを作成してロードしてみた。 OSは、CentOS Linux release 7.6.1810 (Core)。 作業時のOSの状態としては、CentOS-7-x86_64-Minimal-1810.isoから、デフォルトのパラメーターでインストールした直後。 モジュールのコンパイル〜挿入・削除 必要なパッケージのインストール。 sudo yum -y install kernel-devel-$(uname -r) sudo yum -y install gcc 任意のディレクトリーに、module_test.cとMakefileの2つのファイルを、同じディレクトリー下に作成。 module_test.c #include <linux/module.h> int test_init(void) { printk("module init\n"); return 0; } void test_exit(void) { printk("module exit\n"); } module_init(test_init); module_exit(test_exit); Makefile obj-m := module_test.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KDIR) M=$(PWD) modules コンパイル。 make make -C /lib/modules/3.10.0-957.el7.x86_64/build M=/home/myuser modules make[1]: ディレクトリ `/usr/src/kernels/3.10.0-957

LinuxインストールDVDの内部動作 - initrd, isolinux, vmlinuz, Anacondaなど-

イメージ
普段何気なく使っているインストールDVDだが、裏では initrd、isolinux、vmlinuz、Anaconda など、様々なファイルやソフトウェアーが協調して動作している。 本稿では、LinuxインストールDVDの内部動作を追い、initrd、isolinux、vmlinuz、Anaconda などについて理解を深めることを目的とした。 コンテンツは下記のとおり。 インストールDVDの中身 基本的なブートの仕組み initrdについて インストールDVDのディレクトリー構造 インストーラーが起動するまでの流れ インストールされるシステムはどこにあるのか インストールDVDの中身 インストールDVD = インストーラーではない。 インストーラーは、インストールDVDに含まれる一部のファイルであり、 インストールプログラム(installation program) などと呼ばれる。 インストールプログラムは、インストールDVDに含まれるリソースを使いながら、実際のインストール作業を行うプログラムである。 例えば、FedoraやRed Hat系ディストリビューションでは、 Anaconda という名前のインストールプログラムが使われている。 インストールプログラムは、インストールという特別な作業を行うことを除けば、普通のプログラムと変わらない。 例えば、Anacondaは、PythonとCで書かれたプログラムである。 よって、実行するにはOSが必要である。 つまり、新しくOSをインストールするために、(既存の)OSを起動(ブート)することになる。 インストールプログラムを実行するためにブートするOSは、起動に必要なリソースとともに、インストールDVDの中に入っている。 まとめると、インストールDVDは下記を含むメディアと言える。 インストールプログラム、及びインストールに必要なリソース インストールプログラムを実行するために起動するOS、及び起動に必要なリソース 基本的なブートの仕組み 上に書いたように、インストールプログラムを実行するためには、インストールDVDの中に入っているOSを起動(ブート)することになる。 よって、インストールDVDの動作を理解するためには、ブートを理解する必要

KickstartによるBondingの設定(CentOS 7)

イメージ
Follow @venividivici830 ボンディング(Network bonding)は、複数のネットワークインターフェイスを、1つの仮想的なNICとして扱う機能。 ネットワークの冗長性やスループット向上に寄与する。 第4章 ネットワークボンディングの設定 5.4 ネットワーク・ボンディング ボンディングにより作成された仮想的なデバイスはマスター(master)、統合される物理デバイスはスレーブ(slave)と呼ばれる。 CentOS7で作るネットワークサーバ構築ガイド1804対応第2版 本投稿では、 Kickstartにより、自動的にBondingを設定して、CentOS 7をインストール した。 PXEサーバー、PXEクライアントは、ともにVirtualBox Version 5.2.20 r125813 (Qt5.6.3)の仮想マシンで、OSはCentOS Linux release 7.6.1810 (Core)とした。 ネットワーク構成は下記のとおり。 PXEサーバーは、既に構築されていることを前提とする。 PXEにより、VirtualBoxでCentOS 7のインストーラーを起動した(図で解説あり) また、 キックスタートファイルの配置場所は、PXEサーバーの/var/share/kickstart_filesで、NFSでexportされていることを前提とする。 VirtualBoxにおけるPXEとKickstartによるCentOS 7の自動インストール PXEクライアントの作成  VirtualBoxの仮想マシンとして、CentOS Client1、CentOS Client2の2つを作成した。 それぞれの仮想マシンの設定で、下記を実施。 システム > マザーボードから、起動順序の「ネットワーク」にチェック(PXEブートを行うため) ネットワークから、アダプター1とアダプター2を、割り当て「内部ネットワーク」として作成(PXEサーバーとの通信、及びBondingのスレーブとするため) 後の作業で必要になるため、それぞれの仮想マシンのアダプター1のMACアドレスを控えた。 CentOS Client1 - 08:00:27:A3:01:03 C

VirtualBoxにおけるPXEとKickstartによるCentOS 7の自動インストール

イメージ
Follow @venividivici830 前の投稿 では、PXEによるインストーラーの起動を行った。 本投稿では、Kickstartによるインストール作業の自動化を行った。 Kickstartによるインストールの自動化と言うが、より正確には「PXEとKickstartによる」インストールの自動化である。 PXEとKickstart 2つは別の技術。 PXE(Preboot eXecution Environment)     - ネットワークブートを実現する仕組み Kickstart     - OSのサイレントインストールを実現する仕組み ネットワーク上のインストーラーを起動するのがPXEの仕事で、インストーラーの操作を自動化するのがKickstartの仕事。 2つを組み合わせることで、下記のようにインストールを自動化できる。 普通のインストール DVDを挿入してインストーラーを起動→GUIを操作してインストールを進める PXEとKickstartによるインストール マシンの電源を入れる → PXEがネットワーク上のインストーラーを起動 → Kickstartがインストールを自動的に進める Kickstartの設定 Red Hatの公式ドキュメント を参考。 以下、下記のサイトの通りPXEサーバーが構築されていることを前提とする。 PXEにより、VirtualBoxでCentOS 7のインストーラーを起動した(図で解説あり) PXEサーバーが設定されていれば、Kickstartの設定は比較的簡単。 下記を行えば良い。 キックスタートファイルの作成 キックスタートファイルの配置 PXE設定にキックスタートファイルの場所を記載 キックスタートファイルの作成 キックスタートファイルの構文は、下記の公式ドキュメントに詳しい。 キックスタートファイルの作成26.3. キックスタート構文の参考資料  26.2. キックスタートを使ったインストールの実行方法  ここでは、1からキックスタートファイルを作成せず、手動でインストールしたマシンに自動的に保存されるキックスタートファイルを用いた。 手動でインストールしたマシンでは、インストール中に選択された選択肢がすべて下

PXEにより、VirtualBoxでCentOS 7のインストーラーを起動した(図で解説あり)

イメージ
Follow @venividivici830 VirtualBox Version 5.2.20 r125813 (Qt5.6.3)、CentOS Linux release 7.6.1810 (Core)を用いて、PXEによるインストーラーの起動までを試した。 PXEサーバー、PXEクライアントともに、VirtualBoxの仮想マシン。 作業開始時点のPXEサーバーの状態は、Minimal ISOをインストールした直後とする。 SELinuxはEnforcing、firewalldはstopしないで必要なだけ開放した。 基本的に、 Redhatの公式ドキュメント のやり方を踏襲した。 PXEについて PXEは、ネットワークブートを実現する仕組み。 OSやインストーラーを、ネットワーク経由で起動できる。 Kickstartと組み合わせることで、Linux OSのインストールを自動化できる。 PXEに必要なサーバーは、下記の3つ。 DHCPサーバー - IPアドレス付与、TFTPサーバーとブートローダーの場所を教える  TFTPサーバー - ブートローダーを提供、インストールソースの場所を教える  ファイルサーバー(HTTP、FTP、NFSなど) - インストールソースを提供  PXEクライアントは、これら3つのサーバーとやり取りし、ネットワーク経由でのOSやインストーラーの起動に必要な情報を順次取得していく。 下図はイメージ。 青はサーバー、緑は設定ファイルまたはブートに必要なリソースで、PXEサーバーを構築するために編集や配置を行うもの。 ネットワーク設定 ネットワーク構成は下図のようにした。 VirtualBoxのゲストOSとして2台のサーバーを作り、それぞれPXEサーバー、PXEクライアントとした。 PXEサーバーには、Minimal ISOでCentOS Linux release 7.6.1810 (Core)をインストールした。 PXEサーバーは、NICを2つ設定し、1つはブリッジアダプター、もう1つは内部ネットワークとして設定した。 ブリッジアダプターはホストOSと同じネットワークに所属し、家庭のルーターからDHCPでIPアドレスが動的に割り当てられる。 ホストからs

CentOS 7にGuest Additionsをインストールし、VirtualBoxの共有フォルダーを設定した

イメージ
Follow @venividivici830 VirtualBoxで、ゲストOSのCentOS 7と、ホストOSのMac間で、共有フォルダーを設定した。 VirtualBoxのバージョンは、Version 5.2.20 r125813 (Qt5.6.3)。 CentOS 7のバージョンは、CentOS Linux release 7.6.1810 (Core)で、Minimal ISOからインストールしたもの。 Guest Additionsのインストール 共有フォルダーの設定には、Guest Additionsのインストールが必要 なので、 Install VirtualBox Guest Additions in CentOS, RHEL & Fedora を参考に、Guest Additionsをインストールした。 最初に、Guest Additionsのインストールに必要なパッケージの取得や、環境変数の設定を実施。 # EPELリポジトリーを追加 yum -y install epel-release # yumパッケージを最新にする yum -y update # いったん再起動 reboot # Guest Additionsのインストールに必要なパッケージをインストール yum -y install make gcc kernel-headers kernel-devel perl dkms bzip2 # KERN_DIR環境変数の設定、export export KERN_DIR=/usr/src/kernels/$(uname -r) 次に、VBoxGuestAdditions.isoをmountした。 Guest Additionsは、このISOからインストールする。 Virtualboxのメニューバーの下記のボタンから、仮想的なCDを挿入。 Devices > Insert Guest Additions CD image... 設定が変更された〜旨のダイヤログが表示されたので、「設定を再読み込み」を選択した。 下記のコマンドで仮想的なCDをmountし、Guest Additionsをインストールした。 # Guest Additions CD imageの

Cにおける文字列の配列 - charの二次元配列と、charのポインターのポインターの違い -

Follow @venividivici830 charの二次元配列と、charのポインターのポインターは、どちらも文字列の配列として利用できる。 しかし、両者は同じではない。 違いがわからなかったため、以下に整理した。 charの配列と、charのポインター 先に、より簡単な、charの配列と、charのポインターについて整理した。 charの配列も、charのポインターも、文字列として扱える。 #include <stdio.h> int main() { // charの配列 char name_a[] = "john lennon"; printf("%s\n", name_a); // charのポインター char *name_p = "paul mccartney"; printf("%s\n", name_p); return 0; } 実行結果 john lennon paul mccartney (下記コードのname_p = name_aのように)配列をindex指定なしで使うと、配列の先頭要素のアドレスとして扱われる。  このため、アドレスを格納するための型であるcharのポインターに代入できる。 しかし、配列の先頭要素のアドレスは変更できない仕様のため、charのポインターを配列に(先頭要素のアドレスとして)代入することはできない。 #include <stdio.h> int main() { char name_a[] = "john lennon"; char *name_p = "paul mccartney"; /* * index指定なしだと、配列は、配列の先頭要素のアドレスとして扱われる * よって、下記の2つは同じ値を出力する */ printf("%p\n", &name_a[0]); /* &は、変数のアドレスを取得する演算子 */ printf("%p\n", name_a); /* * 配列の先頭要素の「アドレス」なので、c