のぴぴのメモ

自分用のLinuxとかの技術メモ

Linuxのテスト用に、ハングアップやパニック状態にするカーネルモジュールを作ってみた

テストのために、AWSAmazon Linuxインスタンスカーネルレベルでハングアップさせたかったので、テスト用のカーネルモジュールを作ってみました。

できること

  • カーネルのハングアップ(ping応答もできないレベル。プリエンプションをdisableにして実現)
  • 中途半端なハングアップ(ping応答は帰るレベル。リエンプションはenable)
  • カーネルパニック(echo c > /proc/sysrq-triggerと同じ)

使い方

カーネルモジュールのビルド

コードはGitHubにあります。
github.com
(1) 必要なパッケージのインストール
カーネルモジュールのビルドに、gccとkernel-develが必要になります。(Amazon Linuxの場合)

sudo yum -y install git gcc kernel-devel

(2) ソースコードをローカルに持ってきます

git clone https://github.com/Noppy/HangAndPanicKernelModule.git
cd HangAndPanicKernelModule/

(3)ビルドします

make
ls *.ko
hang_panic.ko

使い方

(1)モジュールのインストール

sudo insmod hang_panic.ko
lsmod |grep hang_panic

(2)使い方の確認方法(要root権限)

cat /proc/hang_panic 
<<Hang&Panic module>>
'echo c > /proc/hang_panic' >>> panic
'echo h > /proc/hang_panic' >>> hang(disable local irq and preempt)
'echo H > /proc/hang_panic' >>> hang(disable only local irq)

(3)ハングアップさせる(要root権限)
(a) Local IRQ と preemptionをdisableにしてハング(おそらく、ping応答もできない)

echo h > /proc/hang_panic

(b) Local IRQのみdisable(ping応答はできるレベル)

echo H > /proc/hang_panic

(4)パニック(要root権限)

# echo c > /proc/hang_panic

#蛇足
10年前のkernel2.6時代は、ジャイアントロック(BKL:Big Kernel Lockともいう)があったので、もっと綺麗にハングさせることができたのですが、ソースコードの中を探したのですが、今はシステムワイドなロックのコードがないんですね・・。RHEL3時代に、お客さん先のシステムでBKLに苦しめられたのも、今は昔ということなんですね。

AWS CLIのセットアップ(RHEL/Mac)

1.Amazon LinuxAWS CLIをインストール

Amazon Linuxはデフォルトで、awsコマンドがインストールされています。公式ドキュメントはこちらです。

2.RHEL&Mac AWS CLIをインストール

インストール手順の 公式ドキュメントは以下になります。

2.1 システムワイドで使う(/usr/binにインストールする)

公式ドキュメントと違う点は、sudoでroot権限で、"--user"オプションを付けずに実行するところです。実行すると、awsコマンドと前提のpipとも、"/usr/bin"にインストールされます。
(1)pipをインストールする

 curl -O https://bootstrap.pypa.io/get-pip.py
 sudo python get-pip.py

(2)AWS CLIをインストールする

 sudo pip install awscli --upgrade

2.2ユーザ個別に使う(~/.local/binにインストールする)

公式ドキュメントの通りに実行すると、ユーザのホームディレクトリ配架にインストールされます。
(1)pipをインストールする

$ curl -O https://bootstrap.pypa.io/get-pip.py
$ python get-pip.py --user

(2)AWS CLIをインストールする

$ pip install awscli --upgrade --user

2.3 セットアップ時の補足事項

公式ドキュメント記載以外で私がハマった内容をメモっておきます。
(1)MacでpipによるAWS CLIインストールでpipがエラーとなった時の対処
私の環境では下記コマンド実行時にエラーが出て止まりました。

$ pip3 install awscli --upgrade --user
Traceback (most recent call last):
  File "/usr/local/bin/pip3", line 7, in <module>
    from pip import main
ImportError: cannot import name 'main'

stack overflow*1の記事を参考に、下記のようにpipを再インストールして対処しました。
(というか、最初からaptコマンドで、python3-pipを入れろということかもしれないです。)

$ sudo python3 -m pip uninstall pip && sudo apt install python3-pip --reinstall

(2)"~/"配下にawsコマンドをインストールした時のPATH追加
AWS CLIのインストール先"~/Library/Python/3.6/bin/"は手動でパス登録する必要があります。

  • ファイル:~/.bash_profile ※デフォルトでは無いです。
  • 設定後、ターミナルを再起動して確認
PATH=${PATH}:~/Library/Python/3.6/bin/
export PAHT

3.AWS CLIの設定

3.1 管理用のPCからAWS CLIを利用する場合(アクセスキーによる認証)

設定手順は、こちらの公式ページを参照して下さい。
アクセスキーの漏洩によるアカウント乗っ取りの可能があるので、EC2インスタンス上でAWS CLIを利用する場合は、次のIAMロールをEC2に割り当てる方法の利用を検討します。*2
(1)IAMユーザのアクセスキー ID とシークレットアクセスキーの生成と取得
以下は公式ドキュメントからの抜粋です。

  • IAM コンソールを開きます。
  • コンソールのナビゲーションペインで、[Users] を選択します。
  • IAM のユーザー名 (チェックボックスではありません) を選択します。
  • [Security credentials] タブを選択し、次に [Create access key] を選択します。
  • 新しいアクセスキーを表示するには、[Show] を選択します。認証情報は以下のようになります。

(2)AWS CLI設定
aws cliに、取得したアクセスキーとシークレットアクセスキー、デフォルトリージョンを設定します。

$ aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXX      <==アクセスキーを設定
AWS Secret Access Key [None]: YYYYYYYYYYYY  <==シークレットアクセスキーを設定
Default region name [None]: ap-northeast-1  <==デフォルトリージョン設定( ap-northeast-1は東京リージョン)
Default output format [None]:

3.2 EC2からAWS CLIを利用する場合(EC2にIAMロール割り当て)

ユーザガイドは私にはわかりずらかったです。こちらの公式ブログの記事の方がわかりやすかったです。
(1)IAM ロールの作成

  • IAM コンソールを開きます。
  • コンソールのナビゲーションペインで、[Roles] を選択します。
  • [Create role]を選択します。
  • [AWS Service]を選び、許可したいサービスを選び[Next Permission]で進む。
  • 適切なpolicyを選び[next:Review]で進む。
  • Roleの名前と詳細説明を入力し、[Create Role]でロールを作成する

(2)EC2へのRole割り当て

  • EC2コンソールを開きます。
  • コンソールのナビゲーションペインで、[Instances] を選択します。
  • [Create Instance]インスタンス作成中に、作成したRoleを割り当てるか、
  • 割り当てたいインスタン(起動中も可)を選択し、[Attach/Replace IAM Role]で作成したロールをEC2に適用

(3)AWS CLI設定
ロールを割り当てる場合は、アクセスキーとシークレットキーは設定しないようにします。

$ aws configure
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: ap-northeast-1  <==デフォルトリージョン設定( ap-northeast-1は東京リージョン)
Default output format [None]:

4.その他

4.1 コマンド保管

awsコマンドを[TAB]キーで保管してくれるAWSコンプリータという機能があります。これをシェルに組み込めばコマンドを保管してくれます(pythonだからかわかりませんが、保管までに微妙な間があり使いづらいですが)。公式ドキュメントはこちらです。
(1)AWSコンプリータの場所を確認する

$ which aws_completer
/usr/bin/aws_completer

(2)プロファイルに組み込む
環境に依存しますが、例えば "~/.bash_profile"の末尾に下記行を追加します。

#Enable aws command autocompletion
complete -C '/usr/bin/aws_completer' aws

(3)反映
プロファイルを読み込み設定を反映させます。

source .bash_profile

4.2 AWS CLIの設定ファイル

コマンドの設定ファイルは、ホームディレクトリの.awsというディレクトリ(~/.aws)に格納されます。

  • ~/.awsディレクト
    • config    デフォルトリージョンなどの設定
    • credentials アクセスキーとシークレットアクセスキー

MacでVisual Studio CodeをインストールしGit連携するまでの手順

1.はじめに

職場の人にコード何で書いてるか聞いたら、Visual Studio Code(以下、VS Code)を使っているという話しだったので、Macにセットアップしました。かつgit連携もしたのでメモっておきます。

2.VS Codeのセットアップ

2.1 VS Codeのインストール

MicrosoftのページのMacセットアップ手順に従ってセットアップします。→こちらのページ

  • Download Visual Studio CodeからMac用のイメージをダウンロードします
  • ダウンロードしたファイルをアプリケーションフォルダに移動します

f:id:nopipi:20180421160818p:plain:w500

  • 「アプリケーション」からVC Codeを起動します
  • 必要に応じ、Dockに固定します
    • 起動時のアイコンを2本指でクリック(副ボタン)して
    • 「オプション」→「Dock追加」
  • VC Codeを起動します

2.2 コマンドラインからのVS Code設定

コマンドラインから、”code”でVS Codeが起動するように設定を追加します。

  • VC Code上で「Command Palette (⇧⌘P) 」を実行する
  • "shell command: "と入れて絞られた中から、"shell command: Install 'code' command in PATH"を選択して実行(下図参照)

f:id:nopipi:20180421162931p:plain
ちなみに、これを実行すると、"/usr/local/bin/"にcodeという名前で、”/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code”へのシンボリックリンクができます。実行タイトルや公式サイトのセットアップ手順には以下のように$PATH環境変数VS Codeディレクトリが追加されるような記載がありますが、私はこの方法ではできませんでした。*1

Restart the terminal for the new $PATH value to take effect. You'll be able to type 'code .' in any folder to start editing files in that folder.

3.git連携

3.1 gitのセットアップ

VS Codeとgit連携の前に、gitが入っていない場合はまずgitをセットアップします。

  • gitのインストール手順は、googleで探してください。
  • gitの初期設定は、こちらの記事を参照して下さい。

3.2 git連携設定

  • ターミナルを起動し、gitコマンドのpathを控える
$ which git
/usr/local/bin/git
  • VC Codeで「設定」を開き"git.path"に、gitコマンドのパスを設定する

f:id:nopipi:20180421165608p:plain

{
    "git.path" : "/usr/local/bin/git"
}

4.gitを使ってみる

4.1 gitリポジトリをcloneする

ターミナルから普通に操作しても構わないですが、VC Code内で実行したい場合は「統合ターミナル」を起動し操作します。

  • メニューから開く: 「表示」→「統合ターミナル」
  • ショートカット: 「⌃⇧@」(Control + Shift + @)

クローンの方法は、各自調べて下さい。

4.2 VC Codeでgitリポジトリを開いて操作する

VC Code上でのgit利用方法の詳細は、Visual Studio Code で Git を 使う | 験なきものを思はずは を参考にして下さい。
ちなみに私は、VC CodeからAWS CodeCommit上のリポジトリをcloneして利用しています。AWS CodeCommitの使い方については、下記記事を参照して下さい。
nopipi.hatenablog.com

*1:VS Codeのどこかのバージョンで仕様が変わったのかもしれないですね