Raspberry pi zero 2 wでKaliLinuxを動かそうとしたらいろいろ躓いた話

# まえがき
## はじめに
新米エンジニアの私は知らなかったのですが…
Raspberry pi zero 2 wでKaliLinuxを動かせるみたいです。
本記事ではRaspberry pi zero 2 wでKaliLinuxを動かすためのセットアップの方法を、躓いた部分の回避方法も含めてまとめました。
よろしければご覧ください。
同じように困っている方の助けになれば幸いです。
また、別の回避方法や記事のn番煎じ、その他指摘事項などがあればコメントいただけますとありがたいです。
ご指導ご鞭撻のほどよろしくお願いいたします。

## 本記事はこんな人向け
・ラズパイ(主にRaspberry pi zero 2 w)でKaliLinuxを動かしたい
・ラズパイに何かしらOSを導入して遊びたい
・LinuxにおけるSwap領域の作成方法をかじっておきたい

## 前提として…
ここを訪れた皆さんはおそらく以下の熟練の方々だと思います。
・VirtualBoxなどで一度はKaliLinuxを動かしたことがある
・Raspberrypiを触ったことがある
・LinuxやCUIを扱うのは朝飯前 etc…

そのため、以下の情報は割愛します。
・KaliLinuxの詳細
・Raspberrypiの詳細

いないとは思いますが、
・初めてRaspberrypiというものに触れる
・KaliLinuxというOSがあるらしいから載せてみよう
といった稀有な存在の方は、それぞれの詳細についてご自身で調べていただけますと助かります。

## 今回使用したもの
・Raspberry pi zero 2 w
・SDカード(128GB)
一応KaliLinuxの公式では「少なくとも 16 GB の容量を持つ高速 microSD カードを入手してください」とありますが、とある理由により容量が大きいものを推奨いたします。

# 本編
## ０．事前準備
### SDカードにOSをインストール
下記よりOSをダウンロードし、KaliLinuxをSDカードにインストールしてください。

https://www.raspberrypi.com/software/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4011534/9e7856ba-a1b4-4896-a9bf-f5a2d75ddce5.png)
Raspberry Piデバイス：「Raspberry pi zero 2 w」
OS：「Other specific-purpose OS」 → 「KaliLinux」 → 「Raspberry pi zero 2 w」
ストレージ：インストールしたいSDカード
以上を選択し、インストールしてください。
なお、次の画面でホスト名やWi-Fiの設定などができます。
本記事では、ここでWi-Fi設定が完了している前提で進めていきます。

## １．初期セットアップ
### Raspberry pi zero 2 wを起動
OSをインストールしたSDカードをRaspberry pi zero 2 wに挿入します。
その後、電源を入れると初期セットアップが始まります。
ログイン画面が出てきますので、以下IDとPWでログインしてください。
ID：Kali
PW：Kali
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4011534/2edb4398-8b75-4922-b9d9-f2ae3aa1e461.png)


## ２．深刻なRAM不足
### Swap設定
linuxを触ったことがある方なら、次の作業はターミナルを開いて各ソフトウェアのアップデートを行うのでは？と思われたかと思います。

:::note warn
**１つ目の躓きポイント**
:::

Raspberry pi zero 2 wは以下の特徴があります。
・RAMが512MBしかない
・Swap領域の設定がされていない
そのためメモリ不足が発生し、アップデートどころかOSが動作不能になります。
回避するためにSwap領域を設定する必要があります。
Swap領域とは、ハードディスク内にRAMの内容を一時的に保存しておく領域です。
メモリ不足となってもそこにデータを保存し、処理を続行することができます。
この項ではSwap領域の設定をしていきましょう。

#### Swap設定その１「現在のSwap設定を確認しよう」
ターミナルを起動し、以下コマンドを入力します。
```
free -h
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4011534/d40248f7-01e5-4b60-b8ad-6ee4a7342a03.png)
Mem：搭載されているRAMの状態
Swap：Swap領域の状態
ご覧の通り０バイトのため、設定を行います。

#### Swap設定その２「Swap設定をしよう」
以下コマンドを入力します。
```
sudo dd if=/dev/zero of=/swapfile bs=1MB count=8192
```
上記はSwap領域を8GBに設定した例です。
countの部分を必要に応じて変更してください。
設定に少し時間がかかります。
以下の画面が出れば設定完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4011534/3afddd7c-ef70-405c-99a0-728a71da1a37.png)

#### Swap設定その３「Swapファイルの権限を設定しよう」
以下コマンドを入力します。
```
sudo chmod 600 /swapfile
```
これでroot以外のユーザが誤って設定を上書きすることがなくなります。
このコマンドを実行後には何も反応がないため、次のステップで確認をしましょう。

#### Swap設定その４「Swapファイルの権限を確認しよう」
以下コマンドを入力します。
```
ls -l / | grep swapfile
```
以下の権限になっていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4011534/37f089da-bd8e-4925-ad9f-3e180d84b7e8.png)

#### Swap設定その５「Swap領域をフォーマットしよう」
以下コマンドを入力します。
```
sudo mkswap /swapfile
```
以下の画面になればフォーマットできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4011534/2c225b9a-6d12-482d-abe2-a3696cc143d6.png)

#### Swap設定その６「Swap領域を使用できるようにしよう」
以下コマンドを入力します。
```
sudo swapon /swapfile
```
これで設定したSwap領域が使えるようになりました。
このコマンドを実行後には何も反応がないため、次のステップで確認をしましょう。

#### Swap設定その７「現在のSwap設定をrootでのみいじれるようにしよう」
以下コマンドを入力します。
```
swapon --show
```
以下の画面のように設定したスワップ領域が表示されていたらOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4011534/936f61b8-d2f8-40cd-9f29-b90aa544cc40.png)
ここからはSwap領域設定の仕上げに入ります。

#### Swap設定その８「Swap設定を保持できるようにしよう」
以下コマンドを入力します。
```
sudo nano /etc/fstab
```
fstabファイルが開いたかと思います。
以下をファイルの一番下に追記します。
```
/swapfile swap swap defaults 0 0
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4011534/b02e844d-6845-42ca-85e5-b0f2bfccc083.png)
上記の状態で保存します。


#### Swap設定その９「現在のSwap設定を確認しよう」
以下コマンドを入力します。
```
free -h
```
設定その１でも行った確認コマンドを実行すると、Swap設定ができているかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4011534/cea87d19-ee36-4bd3-83eb-d49d2ba88868.png)
上記でSwap設定は終了となります。
参考として、Swapをする頻度を設定するSwappinessというものがあるようです。
今回はSwapをしてほしいためいじりませんでしたが、頻度を低く設定するとパフォーマンスが上がるようです。

## ３．ようやくアップデートへ
### ソフトウェアをアップデート
お待たせいたしました。
次は各ソフトウェアのアップデートを行います。
細かいエラー回避の方法などは割愛しますが、以下のコマンドを上から順に行っていただければアップデートがされます。
```
sudo apt update
sudo apt upgrade -y
sudo apt autoremove -y
sudo apt autoclean
```

これでRaspberry pi zero 2 wでKaliLinuxを動かす準備ができました。

:::note info
次項からは私が使いやすいようにいろいろ設定を行った備忘録となります。
興味のない方や、以降は自分で設定されるという方、これで満足という方は
こちらで設定完了となります。
お疲れ様でした。
:::

## ４．せっかくなら日本語がいいなあ パート１
### GUIの言語設定
この項ではGUIが日本語になるように変更する設定を行います。
普通であれば、以下のコマンドを入力し設定を行います。
```
sudo dpkg-reconfigure locales
sudo update-locale LANG=ja_JP.UTF-8
reboot
```
しかし、再起動しても変更されることはありませんでした。

:::note warn
**２つ目の躓きポイント**
:::

コマンドを実行しても変更されないのであれば、設定ファイルをあえて書き換えちゃおうという方針に変更しました。
以下のコマンドを入力します。
```
sudo nano /etc/default/locale
```
開いたファイルでグローバルロケール設定ができます。
以下に書き換えましょう。
```
LANG=ja_JP.UTF-8
LC_ALL=ja_JP.UTF-8
```
再起動して日本語に設定されたか確認しましょう。
なお、再起動後にログインすると以下の画面が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4011534/a3cd272c-a22f-4b06-ae66-0a1d0dde7e24.png)
好みによりますが、そのままでいいと思います。

## ５．RAMが足りないならCUIにしてしまえ
### OS起動時にCUIを使用するよう変更
せっかくSwap領域の設定をしていただいたのに、本末転倒な見出しで大変申し訳ありません。
この項ではOS起動時にCUIを使用するように変更する設定を行います。
以下のコマンドを入力します。
```
systemctl set-default multi-user.target
systemctl get-default
reboot
```
再起動がかかった後に、CUI起動となります。
なお、やっぱりGUIに戻したいという方は、以下のコマンドを入力して実行してください。
```
systemctl set-default graphical.target
systemctl get-default
reboot
```

## ６．せっかくなら日本語がいいなあ パート２
### CUIの言語設定
この項ではCUIが日本語になるように変更する設定を行います。
まず、キーボード設定を行います。
以下のコマンドを入力します。
```
sudo nano /etc/default/keyboard
```
開いたファイルでキーボード設定ができます。
以下に書き換えましょう。
```
XKBMODEL="jp106"
XKBLAYOUT="jp"
XKBVARIANT=""
XKBOPTIONS=""
XKBKEYMAP="jp106"

BACKSPACE="guess"
```
保存して再起動後、日本語配列になったか確認しましょう。

続いて、CUIの日本語が文字化けしている問題を解決しましょう。
以下のコマンドを入力します。
```
sudo apt update
sudo apt install fbterm
```
上記コマンドによりfbtermをインストールします。
再起動して、以下のコマンドを入力し、fbtermを起動します。
```
fbterm
```
これで日本語の表示ができたかと思います。

# あとがき
## 参考にさせていただいたサイト様
https://www.kali.org/docs/arm/raspberry-pi-zero-2-w/

https://phoenixnap.com/kb/linux-swap-file

https://zenn.dev/hi_ka_ru/articles/589d79ac2fad06

https://ja.linux-console.net/?p=146

https://zenn.dev/kusaremkn/articles/428c4cd34e4ff9

https://tex2e.github.io/blog/keyboard/keyboard-layout-jp

Kali ヘッドレス化
https://gist.github.com/xErik/8cce03429ffe58809662

## 通常の環境との違い
Raspberry pi用のOSだったためなのか、
通常使用するKaliLinuxと設定方法が所々異なっておりました。
特に躓きポイントとして解説させていただいておりますが、
やらなくていいことをやらなければいけなかったり、
やるべきところをやらなくてよかったりなど
いろいろ検証のし甲斐があるなと思いました。

## やり残したことなど
まだまだ勉強が足りず、以下の点については検証中となります。
・ssh設定
・ipアドレスの固定化
・ターミナルで日本語入力を可能に
この記事に追記、または別記事で備忘録として残させていただきます。
ここまでご覧いただきありがとうございました。