画面がないPCにDebianをインストールする方法（Headless Install via SSH）

#モニターもキーボードもないPCにDebianをインストールする。
DebianのHeadless Installに挑戦します。
モニタ出力を持たないWindows Home Server製品に、Debianをインストールしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414368/7eefbde7-61d2-030a-2115-b0b67c71d354.png)

**Acer easyStore H340**
**HP MediaSmart Server EX490**
の２機種で試してみましたが、いずれも無事インストールできました。

##作業の流れ
作業にはdebianがすでにインストールされたPCが必要です。
準備作業として、Headlessインストールに対応させたインストールUSBメモリを用意します。

1. Debian の netinst isoファイルをダウンロード
2. isoファイルを展開
3. Preseed　ファイルを配置
4. isoファイルを固めなおして、USBに書き込み

その後、作成したUSBメモリで対象のPCを起動、SSH接続してインストール作業を続行します。

##準備作業
まずは　Debian の netinst isoファイルをダウンロードして展開します。

```bash:bash
# もととなる netinst　イメージをダウンロード
wget http://ftp.riken.jp/Linux/debian/debian-cd/current/amd64/iso-cd/debian-9.8.0-amd64-netinst.iso

# isoファイルを展開、再作成するためのツールをインストール
sudo apt -y install xorriso

# isofiles ディレクトリに展開する
xorriso -osirrox on -indev debian-9.8.0-amd64-netinst.iso -extract / isofiles
```

まずはブートメニューの編集から
Grub の Time Out をデフォルトのTime Outなしから　1秒に変更して、キーボード入力がなくともインストールに進むようにします。

```bash:bash
sudo vi isofiles/isolinux/isolinux.cfg
```

```bash:isofiles/isolinux/isolinux.cfg
# D-I config version 2.0
# search path for the c32 support libraries (libcom32, libutil etc.)
path
include menu.cfg
default vesamenu.c32
prompt 0
# Grubの入力待ちで停止しないように timeout 1 とする。
timeout 1
```

さらに、ロケールや言語の質問などで入力待ち状態にならないようにいくつかのパラメータを指定します。

```bash:bash
sudo vi isofiles/isolinux/gtk.cfg
```

```bash:isofiles/isolinux/gtk.cfg
isofiles/isolinux/gtk.cfg
default installgui
label installgui
        menu label ^Graphical install
        menu default
        kernel /install.amd/vmlinuz
        append vga=788 auto=true priority=critical file=/cdrom/preseed.cfg initrd=/install.amd/gtk/initrd.gz ---quiet
        #　↑以下の項目を追加しています。
        #　auto=true               ロケールやキーボードの質問を preseed で行えるよう遅らせます。
        #　priority=critical       優先度の低い質問を抑制するようになります。
        #　file=/cdrom/preseed.cfg preseedファイルを指定します。

```

次に、インストーラ起動後にSSH接続できるようpreseed.cfgを作成、配置します。

```bash:bash
wget https://www.debian.org/releases/stable/example-preseed.txt
sudo cp example-preseed.txt isofiles/preseed.cfg
sudo vi isofiles/preseed.cfg
```

```isofiles/preseed.cfg
#### Contents of the preconfiguration file (for stretch)
### Localization
# Preseeding only locale sets language, country and locale.
d-i debian-installer/locale string en_US

# Keyboard selection.
d-i keyboard-configuration/xkb-keymap select us
# d-i keyboard-configuration/toggle select No toggling

# netcfg will choose an interface that has link if possible. This makes it
# skip displaying a list if there is more than one interface.
d-i netcfg/choose_interface select auto

# Any hostname and domain names assigned from dhcp take precedence over
# values set here. However, setting the values still prevents the questions
# from being shown, even if values come from dhcp.
d-i netcfg/get_hostname string unassigned-hostname
d-i netcfg/get_domain string unassigned-domain

### Network console
# Use the following settings if you wish to make use of the network-console
# component for remote installation over SSH. This only makes sense if you
# intend to perform the remainder of the installation manually.
d-i anna/choose_modules string network-console
d-i network-console/password password r00tme
d-i network-console/password-again password r00tme
```

md5を計算しなおします。

```bash:bash
cd isofiles/
chmod 666 md5sum.txt
find -follow -type f -exec md5sum {} \; > md5sum.txt
chmod 444 md5sum.txt
cd ..
```
isoファイルに固めなおします。

```bash:bash
# isohdpfx.bin を導入します。
sudo apt -y install isolinux

# ISOファイルを作成します。
xorriso -as mkisofs -o debian-9.8.0-amd64-netinst-headless.iso \
        -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin \
        -c isolinux/boot.cat -b isolinux/isolinux.bin -no-emul-boot \
        -boot-load-size 4 -boot-info-table isofiles
```

USBに書き込みます。　
ここでは /dev/sdc がUSBメモリということになっていますが、間違えてHDDに書いちゃったりすると大変なので気を付けてください。

```bash:bash
# USBメモリに書き込む前に対応するデバイスファイルを確認、以下のコマンドを発行してからUSBメモリを刺す。
sudo tail -f /var/log/messages
Ctrl + C で抜ける

# USBメモリへ書き込み、 書き込み先のデバイスファイル間違いには要注意！
sudo dd if=debian-9.5.0-amd64-netinst-headless.iso of=/dev/sdc
```

これでインストール用のUSBメモリは完成です。

##インストールする
ここからは簡単です。
1. USBメモリと有線LANをさして　Power ON します
2. しばらくUSBメモリのアクセスLEDが落ち着くまで待ちます。
3. USBメモリへのアクセスが落ち着いたら、有線LANのLEDなどでネットワークが上がっていることを確認します。この時つながっていないモニターには実はこんな感じ↓の画面が表示されており、「インストールを続けるにはSSHで接続してね」という状態で待ち受けてくれています。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414368/0d2f5230-f207-a595-dd9b-16803bbc0e53.png)
4. ただし、モニターを接続していないので上記のメッセージは見れません。そこで、Fing等を利用して、インストーラーがDHCPで取得したアドレスを調べます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414368/1fed62d8-88e4-eecb-e235-5b47fdd2d769.png)

6. お好きなSSHクライアントで 上項でしらべたIPアドレスへSSH接続する。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414368/2601adc4-bb4b-23a3-75f9-a6449509fbeb.png)

ログインの際のID パスワードは
ID: installer
Password : r00tme
となっています。
（Password はPreseed.cfgで指定しています。）

するとこんな感じで、インストーラーに接続されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414368/f4db4a8e-d908-2d56-6756-fd9c0a1b4c90.png)

あとはお好きなオプションでインストールを進めます。
1点だけ、インストールパッケージを指定する際に
　SSH Server
の指定など、インストール直後から外部アクセスできるようにするのを忘れずに。。

以上です。

参考にしたサイト
https://wiki.debian.org/DebianInstaller/Preseed/EditIso
https://www.debian.org/releases/stable/amd64/apbs02.html.ja#preseed-auto
https://sowhatisthesolution.wordpress.com/2016/03/13/headless-debian-install-via-ssh/