Windows7を10にして、Ubuntuも入れて外からsshできるようにした話

## はじめに

10年くらい前のモデルのVAIO(Windows7)が家にあったので、遊びがてらWindows10にアップグレードして、Ubuntuも入れてデュアルブートにしたという記事です。家の外から公開鍵を使ったSSHでアクセスできるようにもしました。備忘録も兼ねています。

#### 環境

- Windows7 Home
- メモリ 4GB
- 1TBのHDD

## そもそもデュアルブート？

Windows10にLinux系を入れるときは、複数の方法が考えられます。

1. Windows10で、[VirtualBox](https://www.virtualbox.org)等を使って仮想環境にUbuntu等を入れる
1. デュアルブートにして、別々にOSを入れる
1. WSL(Windows Subsystem for Linux)というマイクロソフトが公式で出しているソフトを使う

1の仮想環境を使うという案は、古くてやや低スペックなパソコンには向かないと思い断念。正直3が一番簡単だし安全っぽいけど、なんとなく勉強を兼ねて2でやりました。3でやりたい人は、他の記事を参考にしてください。関連リンクは以下です。

他の方の記事
https://qiita.com/rubytomato@github/items/fdfc0a76e848442f374e

本家の公式ドキュメント
https://docs.microsoft.com/ja-jp/windows/wsl/about

## Windows7のアップグレード

まずWindows7をWindows10にします。このやり方は前に記事にしたので、参考にしてください。一応[リンク](https://qiita.com/minnsou/items/0664a047b022b94e59e1#windows10%E3%81%AE%E5%85%A5%E6%89%8B)貼っておきます。

簡単に説明すると、[マイクロソフトの公式サイト](https://www.microsoft.com/ja-jp/software-download/windows10ISO)に行って10のダウンロードをして、指示通りにやっていけば簡単にできます。同じWindowsだし、ここは問題ないと思う。

## 個人的な設定（Windows10）

Windows10が無事入ったら、設定をいろいろいじる。ここはお好みでやってください。

#### ・拡張子を表示させる

「エクスプローラー」->「表示」の右の方にあるのでチェックをつける。

![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/60eb810f-ced9-64c0-c4ec-54df13017141.png)


#### ・コントロールパネルをデスクトップに出す

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/5148fa03-9866-5b46-fde5-1f9c16c81d0b.png)


コントロールパネルは結構使うので、デスクトップから簡単にアクセスできるようにする。「設定」->「個人用設定」->「デスクトップアイコンの設定」といくと、デスクトップに表示されるアイコンが変更できます。デスクトップにコントロールパネルを表示するようにしましょう。

![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/99f1ac47-6bc9-1e85-ebf0-da72545c428c.png)

#### ・CapsLockをCtrlにする

以下のようなregファイルを作って実行する。

```capslock2ctrl.reg
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
“Scancode Map”=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00
```

参考リンク　http://www.shin-tan.com/swapKey


## パーティションの作成

### そもそもパーティションとは

ここでパーティションについて確認する。用語の意味は[引用](http://e-words.jp/w/%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3.html)からどうぞ。

>パーティションとは、区画、分割（する）、区分、分配（する）、衝立、仕切り、隔壁などの意味を持つ英単語。コンピュータのストレージ（外部記憶装置）の内部を複数の独立した区画に分割すること、および分割された区画のことをパーティションという。

要は1つのHDDを仕切って、Windowsで言うドライブを複数作ったり、別のOSを入れたりすることができるものです。ただこのパーティションは複数の種類があり、その中に「**プライマリパーティション**」と「**拡張パーティション**」があります。

「プライマリパーティション」は基本パーティションとも呼ばれて、**システム起動が可能なパーティション**です。ここからWindowsを起動したり、Ubuntuを起動したりするイメージです。
「拡張パーティション」とは、**システム起動ができないパーティション**です。この「拡張パーティション」の中に「論理ドライブ」と呼ばれるドライブをいくらでも作れます（DとかEとかのドライブ文字の個数による上限はあります）。

ここで大事なのは、「プライマリパーティション」と「拡張パーティション」は1つのHDDで**合計で4つしか作れない**、と言うことです。Windows7から10にアップグレードしたパソコンには、すでに4つのパーティションが作られているので、どれかを消す必要が出てきます。もともとWindows10しか入っていないようなPCだったり、複数のHDDが入っているPCならパーティションの削除とかはしなくても**問題ない**です。

参考リンク
https://pctrouble.net/storage/partition_difference.html
https://www.pc-master.jp/words/partition.html

### 実際のパーティションの設定

コントロールパネルから「システムとセキュリティ」->「管理ツール」の下の「ハードディスクパーティションの作成とフォーマット」を選択する。

![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/c73c4e91-6e04-fe5b-f892-1ba514f9d079.png)

ここでHDDのパーティションを確認すると、Windows7からアップグレードした場合は、既に4つのプライマリパーティションができていると思います。
1. Windows7の回復パーティション（1.2GBくらい）
2. Windows10の回復パーティション（450MBくらい）
3. Cドライブ(起動システム)
4. System Reserved

![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/b15439a0-6e34-b3aa-9d0f-9b5e37b1e282.png)

上の画像では、Windows10の回復パーティションがじゃなくてUbuntuが入っていますが、同じように青の「プライマリパーティション」が4つできているはずです。

ちなみに「回復パーティション」とは工場出荷状態に戻したりするためのパーティションです。例えば起動するとこんな感じになります。

![IMG_6365.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/2201a48d-dd52-ab65-e6d6-46577a699bd8.jpeg)

Ubuntuを入れるにはこの4つのうちのどれかを消すしかありません。Windows10はまたネットから入れられるので、今回はWindows10の回復パーティションを消すことにしました。

ただ、この「ディスクの管理」からだと**回復パーティションは消せません**。なので他の方法で消すのですが、やり方は３つあります。

1. DiskPart.exeという元々Windowsに入っている実行ファイルを使う
1. 回復ドライブの作成中に回復パーティションを消す
1. パーティションを管理するソフトを使う

1は「回復パーティション　削除」とかで検索すれば出てきますが、このやり方は私は[エラーが出て消せません](https://www.aomei.jp/articles/delete-recovery-partition-windows-10.html#maodian3)でした。「force protected パラメータを設定しないと、保護されたパーティションは削除できません」という全く同じエラーでしたが、`gpt attributes = 0x8000000000000000`してもダメでした。2は回復ドライブを作るのがめんどくさいので、3しかありません。ただ怪しいソフトを使いたくないということで、Ubuntuにデフォルトで入っている「GParted」というソフトを使うことにしました。

## Ubuntuの入手

UbuntuのBootable USBを作ります。

1. ソフトを使う。[Rufus](https://rufus.ie/)とか[Universal USB Installer](https://universal-usb-installer.softonic.jp/)とか。ちなみにRufusはUbuntuが[公式で推奨している](https://ubuntu.com/tutorials/tutorial-create-a-usb-stick-on-windows#1-overview)やり方のようです。
1. （UNIX系のパソコンがあれば）`dd`コマンドから作成する。この詳細も前に書いたので[こちら](https://qiita.com/minnsou/items/0664a047b022b94e59e1)を見てください。


## Ubuntuの起動(GPartedの起動)

F2かF10かDelを連打しながらVAIOを起動します。このVAIOではF2連打でBIOSが起動しました。自分のPCがどのキーで起動するかは、「自分のPC名 BIOS 起動」とかでググりましょう。

ここで起動の優先順位を変更します。普段はHDDから起動するようになっていますが、今回はUSBのUBuntuから起動して欲しいので、External Device BootをEnable、Boot Priorityの1番目をExternal Deviceにします。

![IMG_6339.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/26e35761-ebe0-8d98-84ef-e7a5bd55ffea.jpeg)

これで設定を保存（Save Changes）してから、BIOSを抜けます（Exit Setup)。するとUbuntuが起動するので、Try UbuntuでUbuntuを起動します。もしWindowsが立ち上がるときは、USBにうまく書き込めてない可能性があるので、やり直しましょう。Windowsが起動してしまったときは、「更新とセキュリティ」->「回復」->「PCの起動をカスタマイズの「今すぐ再起動」を使うという方法もあります。

![tempsnip2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/1c8c11f7-3eff-fb05-42f8-9a1db6f8b2cf.png)

うまくUSBのUbuntuが起動したら、左下のShow ApplicationsからGPartedを起動します。Windowsからは回復パーティションが消せないので、それならUbuntuから消すという方式です。

![IMG_6366.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/f178fea7-c088-aa18-ca88-9d1ac131fe06.jpeg)

LabelがRecoveryとなっているパーティションを削除します。下の写真では既に1つ消してUbuntuが入ってる画像ですので、参考程度にしてください。

![IMG_6342.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/54d37006-c78f-96a1-c15b-b1709f5fdf15.jpeg)

これでInstall Ubuntuを起動して指示通りインストールすれば大丈夫です。下の画面で、「ディスクを削除してUbuntuをインストール」と言う選択肢しかない場合は、パーティションの**フォーマットがちゃんとできていない**可能性があります。GPartedなりWindowsのディスクの管理等でちゃんとフォーマットしましょう。容量も気を付けてください。

![IMG_6343.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/1c03e120-c038-f502-9166-1cc33720015b.jpeg)

この写真は一番上がUbuntuの再インストールになっていますが、Windows10しかないときは、**Windows10は残しつつUbuntuを入れる**という感じの選択肢になるはずです。そうならない人はパーティションの設定を見直しましょう。

## 個人的な設定（Ubuntu）

ここもお好みで。

#### ・日本語入力にする

Region&LanguageからJapanese(Mozc)を追加する。Mozcがない人は、`sudo apt install ibus-mozc`でインストールして、再起動すればあります。なお、ただのJapanesは**消すと設定が変になる**ので残しておきましょう。

![language.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/ce68c197-3879-96cb-7e87-284fa2135676.png)

設定は英語なのに、日本語キーボードのときは配列が変になっているはずなので変更。

`sudo dpkg-reconfigure keyboard-configuration`

Keyboard model: `Generic 105-key (Intl) PC`
Keyboard model: `Japanese`
Keyboard layout: `Japanese`
Keyboard layout: `The default for the keyboard layout`
Compose key: `No compose key`
という流れでOK

#### ・emacsを入れる

`sudo apt update`
`sudo apt upgrade`
`sudo apt install emacs`

もしGUIが起動するときは.bashrcに`alias emacs='emacs -nw'`を追記して、CUIから開くようにする。

#### ・CapsLockをCtrlにする

`sudo emacs /etc/default/keyboard`として、`XKBOPTIONS="ctrl:nocaps"`と書き換える。ただしこれはシステム全体に適用されるので、他の人が使うPCでやるのは注意。

また「GNOME tweaks」というソフトを使って変換するという方法もあります。

参考リンク　https://linux.just4fun.biz/?Ubuntu/Caps-LockキーをCtrlキーにする方法

## sshのための設定

### openssh-serverのインストール

まずはUbuntuで`sudo apt install openssh-server`を実行する。その後に/etc/ssh/ssh_configを変更する。

```
//ルートでのログイン禁止
PermitRootLogin no
//RSA認証の有効化
RSAAuthentication yes
//パスワードによる認証を許可
PasswordAuthentication yes
//空のパスワードは拒否
PermitEmptyPasswords no
```

参考リンク　https://futurismo.biz/archives/6862

`hostname -I`からUbuntuのローカルIPアドレスがわかるので、他の端末から接続してみる。クライアントがWindowsならTeraTerm等のソフトをインストールして繋ぎましょう。クライアントがUNIX系なら、`ssh ユーザー名@ローカルIP`で繋がるはずです。

### ローカルIPの固定

ここからは自宅のルーターの設定も行います。家のルーターは`http://192.168.1.1`で設定画面にアクセス可能だった。ここら辺は個人でかなり異なるはずなので、自分でルーターの型番とかを検索して、やり方を調べるのが一番です。ログインに必要な初期パスワードとかも説明書に書いてあったりします。

まずは自宅のLAN内のIPアドレスを固定するようにします。「このパソコンは常に192.168.1.4」というように固定する感じです。このルーターは「DHCPスタティックIP設定」と言う名前で設定するようです。

<img width="987" alt="スクリーンショット 2020-01-29 0.35.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/a43af997-6b87-6330-a928-4c0a72b9443b.png">

実はルーターを介さずにUbuntuからローカルIPの固定ができたりします。参考記事は以下をどうぞ。

https://jyn.jp/ubuntu-localip-static/


### ポートマッピング設定

外部からのアクセスを、特定のパソコンに繋ぐ設定です。「アプリケーション」に「セキュアシェル(ssh)」を、「内部ホスト」にさっきのローカルIPアドレスを、「プロトコル」はデフォルトのTCPを指定する。内部ポート番号は22にし、外部ポート番号は安全のために10022などの適当な数字にする。

<img width="990" alt="portmapping.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/07ba1d7f-761d-8883-9af2-1e04eb9a5628.png">


### グローバルIPアドレスとホスト名を紐付け

例えば`36.110.113.89`のようなグローバルIPを`myubuntu.mydns.jp`のようにドメイン名に紐付けておくことで、ルーターのグローバルIPアドレスが変わっても大丈夫なようにします。グローバルIPアドレスが変わるときは、DNSサーバーという名前解決をしてくるところに自動でその情報を送ることで、設定を維持し続けてくれるようです（気になる人は「ダイナミックDNS」で検索）。

無料でやってくれるところはいくつもある(例えば[ここ](https://www.mydns.jp/)とか[ここ](https://www.noip.com/)とか)のですが、どこも登録が必要で面倒だったので、省略しました。そんな頻繁に変わる印象がないので、設定しなくても個人でちょいちょい繋ぐ程度なら問題ない気がするのですが、どうなんでしょうか。

グローバルIPアドレスはUNIX系なら`curl inet-ip.info`、Windowsなら[cman](https://www.cman.jp/network/support/go_access.cgi)にアクセスすることで求まります。

ここまでで、`ssh -p 外部ポート番号 ユーザー名@グローバルIPアドレス`とやってアクセスできればOK。どうもヘアピンNATと呼ばれるルーターの仕組みで、内部から外部グローバルIPアドレスにアクセスしようとすると[失敗することもある](https://futurismo.biz/archives/6862)ので、そういう人は設定を直してください。私は大丈夫でした。

### 公開鍵認証の設定

以下では、クライアント側はUNIX環境を想定して認証設定を行う。大体似たようなことはwindowsでもできるようですが、今回はやってないので省略。

`ssh-keygen -t rsa`
`-t`オプションではrsaの他に、dsa、ecdsa、ed25519といった認証方法が選べます。このあとは秘密鍵にアクセスするためのパスワードを聞かれるので、設定しましょう。

これで秘密鍵がデフォルトで`~/.ssh/id_rsa`に、公開鍵が`~/.ssh/id_rsa.pub`に作られます。

毎回`ssh`するたびに、秘密鍵へのパスワードを聞かれるのは面倒なので`ssh-agent`を使う。

`ssh-add -l`で鍵の登録状況を確認
`ssh-add .ssh/id_rsa`で鍵を登録

これで一度鍵を登録することで、パスワードの入力を省略することができます。ただ、これで登録してもクライアントがシステムの再起動をするたびに`ssh-add`し直さなきゃいけない気がするのがネック。何か良い方法あれば教えてください。

一応他に使いそうなオプションも見ておくと
`ssh-add -D`で全ての鍵の登録を削除
`ssh-add -d .ssh/id_rsa`のように`-d`でひとつひとつ削除
`ssh-add -A`で、一括で複数の鍵を登録
詳しいことは`man ssh-add`で見るべし。

次に作成した公開鍵を`scp`コマンドでサーバー側に送る。`scp .ssh/id_rsa.pub ユーザー名@IPアドレス:~`のようにして送る。サーバー側では、それを.ssh/authorized_keyに書き加える（初めての人は作る）。

`cat id_rsa.pub >> .ssh/authorized_keys`

これで鍵の設定は完了。

### エイリアス的なものを作る

毎回IPアドレスを打つのはめんどいので、例えば`ssh ubu`のように短くできるようにする。これには.ssh/configを書き直す。

```
Host ubu
 HostName 外部IPアドレス、もしくはドメイン名
 IdentityFile ~/.ssh/id_rsa（秘密鍵）
 Port ポート番号
 User ユーザー名
```

これで`ssh ubu`ができるようになる。もしローカルからしかアクセスしないっていうのを作りたいなら

```
Host ubuntu
 HostName ローカルIPアドレス(例えば192.168.1.4とか)
 User ユーザー名
```

という風にすればローカルネットワークにつながっているときは`ssh ubuntu`で繋がる。もっと詳細な設定をしたい人は[ドキュメント](https://euske.github.io/openssh-jman/ssh_config.html)を見ましょう。

これで自宅外から繋げられたら設定終了です。

### 参考文献

https://qiita.com/yo_kanyukari/items/2a944a300db22482c696
https://qiita.com/rintarou/items/bef523c7c8f11097e577
https://www.hiroom2.com/2018/04/29/ubuntu-1804-ibus-mozc-ja/

今回はWindowsとUbuntuのデュアルブートですが、ただWindowsにSSH接続したいなら[こういう方法](https://qiita.com/M_Nagata/items/722a9970dcc2a0b71612)もあります。お好みでどうぞ。