GitHubで公開されているEMLinuxをPC-GN234CCD8で動かしてみた

# はじめに
EMLinuxを自宅のPC ([PC-GN234CCD8](https://support.nec-lavie.jp/e-manual/m/nx/ld/201605/html/gn234cc8.html)) でも動かしてみたいなぁ～、ということでやってみました。

該当のPCにはWindows 10がインストールされているため、USBフラッシュメモリからEMLinuxを起動させてみました。

# 手順の概要
Ubuntu Server 22.04でビルドしたEMLinuxのOSのイメージファイルをddコマンドなどでUSBフラッシュメモリに書き込みます。

そのUSBフラッシュメモリをPC-GN234CCD8に挿し、USBフラッシュメモリからEMLinuxを起動させます。

また、IPアドレスはDHCPで割り当てることにしました。
```
+------------------------------------------+
| Ubuntu Server 22.04                      |
|                                          |
| +---------+  Write image with dd command |
| | EMLinux |-------------------+          |
| +----A----+                   |          |
|      | Build EMLinux OS image |          |
| +----|-------------+          |          |
| | +--|------+      |          |          +------------------+ 
| | | bitbake |      |          |          | USB flash memory |
| | +---------+      |          |          | +---------+      |
| | Docker Container |          +----------->| EMLinux |      |
| +------------------+                     | +---------+      |
|                                          +------------------+
+------------------------------------------+   |     
                                               |
                                               | Replace
                                               |
+------------------------------------------+   V
| PC-GN234CCD8                             +------------------+
|                                          | USB flash memory |
|                                          | +---------+      |
|  Boot EMLinux from USB flash memory <------| EMLinux |      |
|                                          | +---------+      |
|                                          +------------------+
+-+-----+----------------------------------+
  | NIC |
  +--+--+                          +---------------+
     | Assign IP address with DHCP | Router        |
     +-----------------------------+  Buffalo      +---> The Internet
                                   |  AirStation   |
                                   |  WSR-3200AX4S |
                                   +---------------+
```

# 事前準備
## EMLinuxをビルドする環境
[こちらの記事](https://qiita.com/fukunagt/items/117bbe20a14584320edc#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6)と同じ環境を使いました。

## DockerおよびDocker Composerのインストール
[こちらの記事](https://qiita.com/fukunagt/items/117bbe20a14584320edc#docker%E3%81%8A%E3%82%88%E3%81%B3docker-comose%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)を参考にしてください。


# レポジトリのクローン
以下、Ubuntu Serverで作業を行います。

Proxyサーバがある環境の場合、以下のコマンドでproxyサーバの設定を行ってください。
```sh
git config --global http.proxy <proxyサーバのFQDNまたはIPアドレス>:<ポート番号>
```
```sh
git config --global https.proxy <proxyサーバのFQDNまたはIPアドレス>:<ポート番号>
```

リポジトリをクローンするためのディレクトリを作成してください。
```sh
mkdir -p /home/emlinux/github/miraclelinux/emlinux/repos
```

以下のディレクトリに移動してください。   
```sh
cd /home/emlinux/github/miraclelinux/emlinux
```   

git cloneコマンドで、EMLinuxのリポジトリをクローンしてください。
```sh
git clone -b bookworm https://github.com/miraclelinux/meta-emlinux.git repos/meta-emlinux
```

git cloneコマンドで、meta-emlinux-flavorsのリポジトリをクローンしてください。
```sh
git clone -b openssh https://github.com/takaaki-fukunaga/meta-emlinux-flavors.git repos/meta-emlinux-flavors
```

# EMLinuxのビルド
以下のディレクトリに移動してください。
```sh
cd /home/emlinux/github/miraclelinux/emlinux/repos/meta-emlinux/docker
```

EMLinuxのビルド用のコンテナを起動してください。
```sh
./run.sh
```

以下のコマンドを実行し、ビルドのために必要な環境変数を設定してください。
```sh
source repos/meta-emlinux/scripts/setup-emlinux build 
```

meta-emlinux-flavorsのレイヤーを追加してください。
```sh
bitbake-layers add-layer ../repos/meta-emlinux-flavors/
```

meta-emlinux-flavorsが追加されていることを確認してください。
```
build@143bd1f2a182:~/work/build$ bitbake-layers show-layers
NOTE: Starting bitbake server...
layer                 path                                                                    priority
========================================================================================================
core                  /home/build/work/build/../repos/isar/meta                               5
emlinux               /home/build/work/build/../repos/meta-emlinux                            12
cip-core              /home/build/work/build/../repos/isar-cip-core                           6
meta-emlinux-flavors  /home/build/work/repos/meta-emlinux-flavors                             50
```

vimコマンドでconf/local.confファイルを開いてください。
```sh
vim conf/local.conf
```

conf/local.confファイルの末尾に以下を追記してください。
```
(snip)
# 
# Add MACHINE parameter
#
MACHINE = "generic-x86-64"

#
# Extra space for rootfs in MB
#
ROOTFS_EXTRA = "100"
```
- 必要最小限のルートファイルシステムでビルドされるため、空き容量が必要な場合にはROOTFS_EXTRAにMB単位でサイズを指定してください。

bitbakeコマンドでEMLinuxをビルドしてください。
```sh
bitbake emlinux-image-openssh
```

上記コマンドではOpenSSHをインストールしています。その他flavorについては以下をご参照ください。

https://github.com/takaaki-fukunaga/meta-emlinux-flavors

ビルド完了後、exitコマンドでコンテナからログアウトしてください。
```sh
exit
```

# USBフラッシュメモリへの書き込み
EMLinuxのOSイメージファイルが保存されているディレクトリに移動してください。
```sh
cd /home/emlinux/github/miraclelinux/emlinux/build/tmp/deploy/images/generic-x86-64
```

ddコマンドでEMLinuxのOSのイメージをUSBフラッシュメモリに書き込んでください。
```sh
dd if=emlinux-image-openssh-emlinux-bookworm-generic-x86-64.wic of=/dev/sdX
```

blkidコマンドでUSBフラッシュメモリのbootパーティションのUUIDを確認してください。
```
sudo blkid
```
```
(snip)
/dev/sdb2: LABEL="platform" UUID="9a72fa4d-4c73-4c7e-bc36-f16c72586e5b" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="platform" PARTUUID="be248d81-44b6-4f74-a4d6-a94bc8429dae"
/dev/sdb1: SEC_TYPE="msdos" LABEL_FATBOOT="efi" LABEL="efi" UUID="13B9-D08D" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="efi" PARTUUID="eb6beaea-0569-4ee2-80ff-517f4020b8f0"
```

USBフラッシュメモリのルートパーティションを任意のディレクトリ (e.g., /mnt) にマウントしてください。
```sh
sudo mount /dev/sdb2 /mnt
```

vimコマンドなどでfstabファイルを開き、以下のように編集してください。
```
sudo vim /mnt/etc/fstab
```
- 編集前
  ```
  (snip)
  /dev/sda1       /boot   vfat    defaults        0       0
  UUID=9a72fa4d-4c73-4c7e-bc36-f16c72586e5b       /       ext4    defaults        0       0
  ```
- 編集後
  ```
  (snip)
  #/dev/sda1       /boot   vfat    defaults        0       0
  UUID=13B9-D08D       /boot   vfat    defaults        0       0
  UUID=9a72fa4d-4c73-4c7e-bc36-f16c72586e5b       /       ext4    defaults        0       0
  ```

USBフラッシュメモリのルートパーティションをアンマウントしてください。
```
sudo umount /mnt
```

# USBフラッシュメモリからのEMLinuxの起動
PC-GN234CCD8にUSBフラッシュメモリを挿してください。

PCを起動し、BIOS設定にて以下を設定してください。

- Securityタブ
  - Secure Boot [Disabled]
- Bootタブ
  - 1st Boot [USB Hard Disk]

BIOSの設定変更後、PCを再起動してください。

無事にEMLinuxが起動しました。以下、dmesgコマンドの抜粋です。
```
[    0.000000] Linux version 6.1.119-cip33 (isar-users@googlegroups.com) (gcc (Debian 12.2.0-14) 12.2.0, GNU ld (GNU Binutils for Debian) 2.40) #1 SMP PREEMPT_DYNAMIC Thu, 01 Jan 1970 01:00:00 +0000
[    0.000000] Command line: BOOT_IMAGE=/vmlinuz-6.1.119-cip33 root=PARTUUID=be248d81-44b6-4f74-a4d6-a94bc8429dae rootwait console=ttyS0,115200 console=tty0
(snip)
```

# さいごに
USBフラッシュメモリからEMLinuxを起動させることができました。

本記事では実施しませんでしたが、USBフラッシュメモリからPCの内蔵ディスクにddコマンドなどでイメージの書き込みを行えば、内蔵ディスクからの起動も可能になります。

# 参考情報
## PC-GN234CCD8のスペック
参考情報として各種コマンドの実行結果を載せておきます。

### CPU
```
root@EMLinux3:~# lscpu 
Architecture:             x86_64
  CPU op-mode(s):         32-bit, 64-bit
  Address sizes:          39 bits physical, 48 bits virtual
  Byte Order:             Little Endian
CPU(s):                   4
  On-line CPU(s) list:    0-3
Vendor ID:                GenuineIntel
  BIOS Vendor ID:         Intel(R) Corporation
  Model name:             Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz
    BIOS Model name:      Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz  CPU @ 2.3GHz
    BIOS CPU family:      205
    CPU family:           6
    Model:                78
    Thread(s) per core:   2
    Core(s) per socket:   2
    Socket(s):            1
    Stepping:             3
    CPU(s) scaling MHz:   23%
    CPU max MHz:          2800.0000
    CPU min MHz:          400.0000
    BogoMIPS:             4800.00
    Flags:                fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtsc
                          p lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2
                           ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpci
                          d_single pti tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt in
                          tel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp
Virtualization features:
  Virtualization:         VT-x
Caches (sum of all):
  L1d:                    64 KiB (2 instances)
  L1i:                    64 KiB (2 instances)
  L2:                     512 KiB (2 instances)
  L3:                     3 MiB (1 instance)
NUMA:
  NUMA node(s):           1
  NUMA node0 CPU(s):      0-3
Vulnerabilities:
  Gather data sampling:   Vulnerable: No microcode
  Itlb multihit:          KVM: Mitigation: VMX disabled
  L1tf:                   Mitigation; PTE Inversion; VMX conditional cache flushes, SMT vulnerable
  Mds:                    Vulnerable: Clear CPU buffers attempted, no microcode; SMT vulnerable
  Meltdown:               Mitigation; PTI
  Mmio stale data:        Vulnerable: Clear CPU buffers attempted, no microcode; SMT vulnerable
  Reg file data sampling: Not affected
  Retbleed:               Vulnerable
  Spec rstack overflow:   Not affected
  Spec store bypass:      Vulnerable
  Spectre v1:             Mitigation; usercopy/swapgs barriers and __user pointer sanitization
  Spectre v2:             Mitigation; Retpolines; STIBP disabled; RSB filling; PBRSB-eIBRS Not affected; BHI Not affected
  Srbds:                  Vulnerable: No microcode
  Tsx async abort:        Not affected
```
### メモリ
```
root@EMLinux3:~# free -h 
               total        used        free      shared  buff/cache   available
Mem:           7.7Gi       522Mi       5.2Gi        43Mi       2.3Gi       7.2Gi
Swap:             0B          0B          0B
```

### ディスク構成
```
root@EMLinux3:~# lsblk 
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda      8:0    0 931.5G  0 disk
├─sda1   8:1    0   260M  0 part
├─sda2   8:2    0    16M  0 part
├─sda3   8:3    0 465.1G  0 part
├─sda4   8:4    0  1000M  0 part
├─sda5   8:5    0   400G  0 part
└─sda6   8:6    0  65.2G  0 part
sdb      8:16   1  58.8G  0 disk
├─sdb1   8:17   1  66.1M  0 part /boot
└─sdb2   8:18   1  58.8G  0 part /
sr0     11:0    1  1024M  0 rom
```
- sda
  - Windows 10が保存されているディスクです。
- sdb
  - EMLinuxが保存されているUSBフラッシュメモリです。このUSBフラッシュメモリからEMLinuxを起動しています。