2019年度の新人研修課題の概要は以下のページに記載している.
- Language: Englishを選択
- Country, territory or area: other -> Asia -> Japan を選択
- Country to base default locale settings on: United States - en_US.UTF-8 を選択
- Keymap to use: Japanese
- USBの挿入(対応するNicドライバがインストーラにない場合表示される.この場合,USBからドライバをインストールする.本研修課題では,ドライバのインストールされたUSBを先輩から借りるものとする.)
- Load missing firmware from removable media? <Yes>
- Hostname: sugi(ノード1用ならsugi1,ノード2用ならsugi2)
- Domain name: なし
- Root password: パスワード(いつもの)
- Re-enter password to verify:
- Full name for the new user: フルネーム(例: Keisuke Sugi)
- Username for your account: アカウント名(例: sugi)
- Choose a password for the new user: パスワード(いつもの)
- Re-enter password to verify:
- Manual を選択
- Create new empty partition table on this deice? <Yes>
- pri/log 320.1GB FREE SPACE
- Create a new partition -> 512 MB -> Primary -> Beginning -> Mount point:
-> /boot - static files of the boot loader -> Done setting up the partition
- Create a new partition -> 75.5 GB(残りの領域から4GB(メモリの2倍)のサイズを差し引いた大きさ) -> Primary -> Beginning
-> Mount point:-> / - the root file system -> Done setting up the partition
- Create a new partition -> 4 GB -> Primary -> Beginning -> Use as:
-> Use as: swap area -> Done setting up the partition
- Finish patitioning and write changes to disk を選択
- Write the changes to disks? <Yes>
- Scan another CD or DVD? <No>
- Use a network mirror? <Yes>
- Debian archive mirror country: Japan
- Debian archive mirror: ftp.riken.jp
- HTTP proxy information (blank for none):なし
- Cannot access repository <Continue>
- Participate in the package usage survey? <No>
- Choose software to install:スペースキーを用いて「SSH server」以外のすべてのチェックを外す
- Install the GRUB boot loader to the master boot record? <Yes>
- Device for boot loader installation: /dev/sda (sdaのとき)
- Is the system clock set to UTC? <Yes>
- パッケージのダウンロード元設定ファイルであるsources.listを編集し,ダウンロード元としてcdromを削除する.
$ su # vi /etc/apt/sources.list (エディタが起動するので,"cdromから始まる行を削除またはコメントアウトする.)
- sudoをインストールし,ユーザにsudo権限を与える.以下のコマンドを実行する.
$ su # apt-get update # apt-get install sudo # visudo (エディタが起動するので,"root ALL=(ALL) ALL"の直後に"takaie ALL=(ALL) ALL"を追加する)
- git,gcc,およびmakeをインストールする.以下のコマンドを実行する.
$ sudo apt-get update $ sudo apt-get install git gcc make
- カーネル再構築で使用するライブラリとコマンドをインストールする.以下のコマンドを実行する.
$ sudo apt-get install libncurses5-dev (make menuconfigやデバイス分割で用いる) $ sudo apt-get install bc (カーネルの再構築で実行するコマンドで用いる)
- Linuxのソースコードを取得する.LinuxのソースコードはGitで管理されている.Gitとはオープンソースの分散型バージョン管理システムである.下記のGitリポジトリからクローンし,Linuxのソースコードを取得する.
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
- リポジトリとはディレクトリを保存する場所のことであり,クローンとはリポジトリの内容を任意のディレクトリに複製することである.本手順書では/home/takaie/git以下でソースコードを管理する./home/takaieで以下のコマンドを実行する.
$ mkdir git $ cd git $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
- 実行後,mkdirコマンドにより/home/takaie以下にgitディレクトリが作成される.そして,cdコマンドにより,gitディレクトリに移動する.git cloneコマンドにより,/home/takaie/git以下にlinux-stableディレクトリが作成される.linux-stable以下にLinuxのソースコードが格納されている.
- Linuxのソースコードのバージョンを切り替えるため,ブランチの作成と切り替えを行う.ブランチとは開発の履歴を管理するための分岐である./home/takaie/git/linux-stableで以下のコマンドを実行する.
$ git checkout -b 3.16 v3.16
- 実行後,v3.16というタグが示すコミットからブランチ3.16が作成され,ブランチ3.16に切り替わる.コミットとはある時点における開発の状態を記録したものである.タグとはコミットを識別するためにつける印である.
- 以下の手順でカーネルの再構築を行う.コマンドは/home/takaie/git/linux-stable以下で実行する.
- .configファイルを作成する..configファイルとはカーネルの設定を記述したコンフィギュレーションファイルである.以下のコマンドを実行し,インストールしたDebianのコンフィギュレーションファイルをコピーする.
$ cp /boot/config-3.16.0-6-amd64 .config
- 実行後,/home/takaie/git/linux-stable以下に.configファイルが作成される.
- Linuxカーネルをコンパイルする.以下のコマンドを実行する.
$ make bzImage -j8
上記コマンドの「-j」オプションは,同時に実行できるジョブ数を指定する.ジョブ数を不用意に増やすとメモリ不足により,実行速度が低下する場合がある.ジョブ数はCPUのコア数*2が効果的である.コマンド実行後,/home/takaie/git/linux-stable/arch/x86/boot以下にbzImageという名前の圧縮カーネルイメージが作成される.カーネルイメージとは実行可能形式のカーネルを含むファイルである.同時に,/home/takaie/git/linux-stable以下にすべてのカーネルシンボルのアドレスを記述したSystem.mapが作成される.カーネルシンボルとはカーネルのプログラムが格納されたメモリアドレスと対応付けられた文字列のことである.
- コンパイルしたカーネルをインストールする.以下のコマンドを実行する.
$ sudo cp /home/takaie/git/linux-stable/arch/x86/boot/bzImage /boot/vmlinuz-3.16.0-linux $ sudo cp /home/takaie/git/linux-stable/System.map /boot/System.map-3.16.0-linux
- 実行後,bzImageとSystem.mapがboot以下にそれぞれvmlinuz-3.16.0-linuxとSystem.map-3.16.0-linuxという名前でコピーされる.
- カーネルモジュールをコンパイルする.カーネルモジュールとは機能を拡張するためのバイナリファイルである.以下のコマンドを実行する.
$ make modules
- コンパイルしたカーネルモジュールをインストールする.以下のコマンドを実行する.
$ sudo make modules_install
- 実効結果の最後の行は以下のように表示される.これはカーネルモジュールをインストールしたディレクトリ名を表している.
DEPMOD 3.16.0
- 上記の例では,/lib/modules/3.16.0 ディレクトリにカーネルモジュールがインストールされている.このディレクトリ名は手順(6) で必要となるため,控えておく.
- 初期RAMディスクを作成する.初期RAMディスクとは初期ルートファイルシステムのことである.これは実際のルートファイルシステムが使用できるようになる前にマウントされる.以下のコマンドを実行する.
$ sudo update-initramfs -c -k 3.16.0
- 手順(5) で控えておいたディレクトリ名をコマンドの引数として与える.実行後,/boot 以下に初期RAM ディスクinitrd.img-3.16.0 が作成される.
- システムコールを実装したカーネルをブートローダから起動可能にするために,ブートローダを設定する.ブートローダの設定ファイルは/boot/grub/grub.cfg である.エントリを追加するためにはこのファイルを編集する必要がある.Debian8.11 で使用されているブートローダはGRUB2 である.GRUB2 でカーネルのエントリを追加する際,設定ファイルを直接編集しない./etc/grub.d 以下にエントリ追加用のスクリプトを作成し,そのスクリプトを実行することでエントリを追加する.ブートローダを設定する手順を以下に示す.
- カーネルのエントリを追加するため,エントリ追加用のスクリプトを作成する.本手順書では,既存のファイル名に倣い作成するスクリプトのファイル名は11_linux-3.16.0 とする.スクリプトの記述例を以下に示す.
1 #!/bin/sh -e 2 echo "Adding my custom Linux to GRUB2" 3 cat << EOF 4 menuentry "My custom Linux" { 5 set root=(hd0,1) 6 linux /vmlinuz-3.16.0-linux ro root=/dev/sda2 quiet 7 initrd /initrd.img-3.16.0 8 } 9 EOF
- スクリプトに記述された各項目について以下に示す.
- < 表示名>: カーネル選択画面に表示される名前
- <HDD 番号>: カーネルが保存されているHDD の番号
- < パーティション番号>: HDD の/boot が割り当てられたパーティション番号
- < カーネルイメージのファイル名>: 起動するカーネルのカーネルイメージ
- <root デバイス>: 起動時に読み込み専用でマウントするデバイス.
- < ルートファイルシステム>: /root を割り当てたパーティション
- < その他のブートオプション>: quiet はカーネルの起動時に出力するメッセージを省略する.
- < 初期RAM ディスク名>: 起動時にマウントする初期RAM ディスク名
- /etc/grub.d で以下のコマンドを実行し,作成したスクリプトに実行権限を付与する.
$ sudo chmod +x 11_linux-3.16.0
- 以下のコマンドを実行し,作成したスクリプトを実行する.
$ sudo update-grub
- 実行後,/boot/grub/grub.cfg にシステムコールを実装したカーネルのエントリが追加される.
- 任意のディレクトリで以下のコマンドを実行し,計算機を再起動させる.
$ sudo reboot
- GRUB2 のカーネル選択画面にエントリが追加されている.手順(7) のスクリプトを用いた場合,カーネル選択画面でMy custom Linux を選択し,起動する.
再構築したLinuxカーネルに新たにシステムコールを実装する.
追加するシステムコールの機能は以下の通りである.
- カーネルのメッセージバッファに任意の文字列を出力するシステムコール
また,発展課題として,以下の機能を持つシステムコールを追加してもよい.
- 任意のメモリ領域に文字列を書き込むシステムコール
- IPIを送信するシステムコール
なお,作成したシステムコールに対して glibc への登録は必須としない.必要に応じて各自で行う.
システムコールの追加手法に関しては,記載しないため,各自で調査すること.
システムコール追加の手順書には,以下の内容を記載すること.
- 追加環境
- 追加したシステムコールの概要
- 形式
- 引数
- 戻り値
- 機能
- システムコール追加の手順
- テスト
以下の2つの機能をもつSlackBotプログラムを作成する.
- 任意の文字列を発言するプログラムの作成
- SlackBotプログラムへの機能追加
環境構築の詳細については,本ディレクトリ下のSlackBotディレクトリのREADME.orgに示す.
SlackBotプログラムの作成には,Rubyを用いる. 使用する Ruby のバージョンは2.5.1である. また,以下の2つの機能を持つSlackBotクラスを用いる.
- SlackのIncoming Webhooksを利用し,発言する機能
- SlackのOutgoing Webhooksによって発言を取得した場合,反応する機能
上記2つの機能を持つSlackBotクラスを継承したクラスを新たに作成し, 以下の機能を実装する.動作を確認した時点でM1もしくはM2に確認してもらう.
- 受信した発言の中に“「○○○」と言って”という文字列があった場合は,“○○○”と発言する.
SlackBotプログラムへ機能を追加する. Slack以外のWebサービスのAPIやWebhookを利用した機能を追加する. 追加する機能の例を以下に示す.
- 検討打合せの3日前ならば予定を発言
- 今日の天気を発言
- 商品の検索結果を発言
- ニュースサイトのIT関連のニュースを発言
SlackBotプログラムの仕様書には,以下の6つの項目があること.
- 概要
- 機能
- 動作環境
- 動作確認済み環境
- 使用方法
- エラー処理と保証しない動作
SlackBotプログラムの報告書には,以下の3つの項目があること.
- 理解できなかった部分
- 作成できなかった機能
- 自主的に作成した機能