12ステップで作る組込みOS自作入門　M2 Macでの環境構築

# 前提

M2 Macで12ステップ本の環境構築をしようとしたところ、M2MacではVirtualBoxが使えないため著者から配布されているVMイメージが使えない、、と思ったが、UTMという別の仮想環境ツールを使うことで上手くいった。

各項目で参考にさせていただいたサイトを挙げています。この場を借りてお礼を申し上げます。ありがとうございます！
参照される際は、CentOSのバージョンの違いに注意してください。12ステップ本のVMイメージはCentOS6です。

# 仮想化手順

## 著者ページから入手したovaファイルをqcow2形式に変換する
```:(Mac側)
tar -xvf makeos-CentOS-20150504.ova
qemu-img convert -O qcow2 makeos-CentOS-20150504-disk1.vmdk makeos-CentOS-20150504.qcow2
```
[ovaをqcow2に変換し、UTMで起動するまで](https://zenn.dev/simo/articles/53c53473d38efd)

## 生成されたovfファイルから、仮想マシンのスペックを確認する。

ディスク容量：16GB
RAM容量：512MB
CPU数：1

該当箇所は下記の通り。
```
  <DiskSection>
    <Info>List of the virtual disks used in the package</Info>
    <Disk ovf:capacity="17179869184" ovf:diskId="vmdisk2" ovf:fileRef="file1" ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" vbox:uuid="79cdd9cf-b8a7-4e97-ac22-020853dc3d26"/>
  </DiskSection>

```
```
      <Item>
        <rasd:AllocationUnits>MegaBytes</rasd:AllocationUnits>
        <rasd:Caption>512 MB of memory</rasd:Caption>
        <rasd:Description>Memory Size</rasd:Description>
        <rasd:ElementName>512 MB of memory</rasd:ElementName>
        <rasd:InstanceID>2</rasd:InstanceID>
        <rasd:ResourceType>4</rasd:ResourceType>
        <rasd:VirtualQuantity>512</rasd:VirtualQuantity>
      </Item>
```
```
        <CPU count="1" hotplug="false">
          <HardwareVirtEx enabled="true"/>
          <HardwareVirtExNestedPaging enabled="true"/>
          <HardwareVirtExVPID enabled="true"/>
          <HardwareVirtExUX enabled="true"/>
          <PAE enabled="true"/>
          <HardwareVirtExLargePages enabled="false"/>
          <HardwareVirtForce enabled="false"/>
        </CPU>
```

## UTMで上記スペックの仮想マシンを作成する

このとき、CPUアーキテクチャはi386にする。いろいろ試してみたが、アーキテクチャによらず起動時のメッセージを見るとi686から変わらずだった。詳細は未調査。

[ovaをqcow2に変換し、UTMで起動するまで](https://zenn.dev/simo/articles/53c53473d38efd)

これで仮想マシンは作成できたので、開発に使えるようにセットアップしていく。

# Linuxのセットアップ

## sudoを使えるようにする

sudoersの設定コマンド
```
sudo visudo
```

wheelグループにパスワードなしでのsudoを許可する設定のコメントアウトを外す
```:visudo
%wheel     ALL=(ALL)    NOPASSWD: ALL
```

userをwheelグループに入れる
```
usermod -aG wheel user
```

## キーボードレイアウトを変更
※日本語配列のMacを使用している場合は不要。
```
vim /etc/sysconfig/keyboard
```

```:/etc/sysconfig/keyboard
KEYTABLE="us"
MODEL="PC105+inet"
LAYOUT="us"
KEYBOARDTYPE="pc"
```

再起動すれば反映される。

## yumを使えるようにする
CentOS6のサポートが終了しており、既存のリポジトリURLが無効になっている。

下記ページを参考に、ミラーサイトのURLに書き換えることで上手くいった。
追加で1点変更として、```/etc/yum.repos.d/CentOS-Base.repo```の```$basearch```を```i386```に置換した。仮想マシンのアーキテクチャはi686だが、i686だとURLが存在せず失敗したため。

[サポート終了したCentOS6でyumがエラーになる場合の簡単な対処法([errno 14] problem making ssl connection)](https://ateliee.com/archives/3946#google_vignette)

なお、URLをi386にしたはずだけど、試しにyum install cifs-utilsをすると、*.i686がインストールされた。ChatGPTに聞くとi686とi386には互換性があるからOK的な回答をもらったけど、真偽は確かめてない。

## 共有フォルダを設定

### CentOS側にMacの共有フォルダをマウント(あきらめた)

下記ページ(環境はCentOS7)を参考にやってみたが、smbclientでMacに接続できなかった。

(Apple/UTM)[https://web.chaperone.jp/w/index.php?Apple/UTM]

### CentOS側で共有フォルダ作成し、Macから接続(成功)

参考:
[VMware上のCentOSにSambaを用いてMacとの共有フォルダを作る](https://qiita.com/tewi_r/items/611fe6d088aa20961b40)
[CentOS 6 sambaのインストール方法](https://chiritsumo-blog.com/centos-6-samba/#toc2)


#### CentOS側でsambaをインストール
```
sudo yum install samba
```

#### 共有フォルダを作成
```
mkdir /home/samba
sudo chmod -R 0777 /home/samba/
sudo chown -R user:user /home/samba
```

#### セキュリティ設定(SELinux)
```
sudo chcon -t samba_share_t /home/samba/
```

#### sambaの設定
```
sudo cp -ap /etc/samba/smb.conf /etc/samba/smb.conf.bk
sudo vim /etc/samba/smb.conf
```

```:smb.conf
[samba]
        comment = samba directory
        path = /home/samba
        public = yes
        browseable = yes
        writable = yes
        hosts allow = 127. 192.168.
        guest ok = no
```

sambaの設定ミスをチェック
```
testparm
```

Sambaのパスワードデータベースにユーザーを追加。

```
sudo pdbedit -a user
```

#### ファイアウォールの設定
```/etc/sysconfig/iptables```を編集。最後のCOMMITよりも前にポート開放の設定を追加
```
sudo cp -ap /etc/sysconfig/iptables /etc/sysconfig/iptables.bk
sudo vim /etc/sysconfig/iptables
```
```:/etc/sysconfig/iptables
-A INPUT -p tcp --dport 139 -j ACCEPT
-A INPUT -p udp --dport 137 -j ACCEPT
-A INPUT -p udp --dport 138 -j ACCEPT
-A INPUT -p tcp --dport 445 -j ACCEPT
```

#### ここまでの設定変更を反映させる
```
/etc/rc.d/init.d/iptables restart
/etc/rc.d/init.d/smb restart
```

#### Macからアクセスする
Finderで、移動→サーバへ接続(⌘K)し、```smb://<ip address>```を入力する。
<ip address>は事前に仮想マシン上で書きコマンドを打ち、eth4のIPアドレスを確認しておく。

```
ip -4 addr
```

## MacからCentOS6にSSH接続

CentOS6はRSAでの接続を求めてくるが、Mac側ではセキュリティ上の理由でRSA/SHA1 暗号方式の鍵 (ssh-rsa) がデフォルトで無効のため、設定変更して接続できるようにする。

```:(Mac側) ~/.ssh/config
Host makeos
   HostKeyAlgorithms ssh-dss,ssh-rsa
   PubkeyAcceptedAlgorithms +ssh-rsa
   HostName 192.168.64.7
   User user
```

これで、下記コマンドによりSSH接続できるようになった。

```
ssh makeos
```

参考:
[sshで急に接続できなくなった場合の対処方法 (no matching host key type found. Their offer: ssh-rsa,ssh-dss)](https://pyopyopyo.hatenablog.com/entry/2022/11/02/180000])

一度パスワード認証で接続できたら、公開鍵で入れるようにしておくと以降はパスワード設定がいらなくなるので便利。

下記コマンドで、```ssh-keygen```でキーを秘密鍵（id_rsa）と公開鍵（id_rsa.pub）を生成して、```ssh-copy-id```でCentOS側に生成した公開鍵を登録する。

```
ssh-keygen
ssh-copy-id -i ~/.ssh/id_rsa.pub makeos
```

## FlashROMへの書き込み

### USBを認識させる

MacにUSBシリアル変換ケーブルを接続し、UTMでUSBデバイスの使用を許可する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132673/3e214376-31bb-88a5-389e-434eec89b906.png)


```lsusb```で認識されているか確認する

```
[user@localhost bootload]$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 0627:0001 Adomax Technology Co., Ltd 
Bus 001 Device 003: ID 0627:0001 Adomax Technology Co., Ltd 
Bus 001 Device 004: ID 0627:0001 Adomax Technology Co., Ltd 
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 002: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
```

FlashROMに書き込む

```
sudo h8write -3069 -f20 kzload.mot /dev/ttyUSB0
```

## シリアル通信

インストール済みのminicomを利用した。
テキスト通りの手順でOKのため省略。