1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

速い!安い!うまい! ジャンクNASが10Gbpsイーサ付きDebianサーバに生まれ変わる(I・O DATA HDL4-XA完全ヘッドレスインストール編)

1
Posted at

結論

ヤフオクでジャンク扱いされているI-O DATAの4ベイNAS「HDL4-XA」は、中身がIntel Atom C3000搭載の普通のx86_64サーバでした。一発で間違いなく、debian 13.5 が完璧に入ります。
image.png

画面なし・キーボードなし・シリアルなしで、
USBブート → DHCP → SSH → 遠隔インストールが可能。

そしてこの構成、例によって安い。

品目 価格
HDL4-XA(ジャンク・HDDなし) ヤフオク相場数千円〜
SATA SSD 128GB(手持ち) 0円
USBメモリ(手持ち) 0円
Debian 13.5 無料
合計 ほぼ本体代のみ

ただしヘッドレスインストールには罠がたくさんありました。わかってしまえばどうということはないのですが・・・。
この記事は、筆者と Claude AI とちゃっぴぃ の苦闘の全記録です。

罠の予告編

  1. 電源は入るのにDHCP要求が一度も飛ばない → 見えない言語選択画面で無言停止しています
  2. それでもDHCPが飛ばない → NICが2つあるせいで、見えないインターフェース選択画面で無言停止しています
  3. なぜかGNOMEデスクトップがフルインストールされる → taskselが黙ってデフォルトを採用しています

ヘッドレス機の恐ろしいところは、 全部「無言」 なこと。

画面がないので、止まっているのか進んでいるのか、LEDの点滅を見つめて祈るしかない。
この記事の目的は、祈りの結果を皆さんに共有することです。

環境

項目 内容
機体 I-O DATA HDL4-XA(4ベイNAS、ヤフオクでジャンク入手)
CPU Intel Atom C3338 @ 1.50GHz(2コア/2スレッド)
メモリ 2GB
NIC①(10GbE) Aquantia AQtion AQC107 [1d6a:07b1] / atlanticドライバ
NIC②(1GbE) Realtek RTL8111/8168 [10ec:8168] / r8169ドライバ
インストール先 SATA SSD 128GB
OS Debian 13.5 (trixie) netinst amd64
USB作成 Rufus(ISOモード展開)
作業環境 画面なし・キーボードなし・シリアルなし。LANケーブルと電源と根性とdhcpサーバ

そもそもHDL4-XAは「普通のx86サーバ」です

インストーラのシェルからlspciを確認した結果:

  • UEFIブート可能(普通のUEFIファーム。ARM系LANDISKと違ってU-Bootではない)
  • USBメモリからLinuxインストーラが起動する
  • SATAもNICも標準ドライバで認識

つまりこの作業は「NASのハック」ではなく、
たまたまNASの形をしたヘッドレスx86サーバへのDebian投入」 です。

対象機種(映像出力がなくてヘッドレス強制のシリーズ)

Atom C3000(Denverton)はそもそもiGPUを持たないSoCなので、
このファミリーは物理的に映像出力が存在しません。

シリーズ 形態
HDL2-XA 2ベイBOX
HDL4-XA 4ベイBOX(本記事の実証機)
HDL4-XA-U 4ベイ1Uラックマウント
HDL4-XA/M 4ベイBOX(特定用途版)
HDL2-XAB / HDL4-XAB 5年保証付き後継。ハードは同系
/TM5・/RM等の各バリアント 型番違いの同系機

一方、お隣のシリーズには逃げ道があります:

  • H/HEXシリーズ(HDL4-HEX等):背面にD-sub 15ピンあり。画面が出せるのでヘッドレス強制ではない
  • Xシリーズ(HDL2-X等、XAの先代):Celeron N3010搭載で、DELまたはF2連打でBIOS画面に入れるとの報告あり
  • HAシリーズ:同じDenverton系ですが映像出力の有無は未確認(情報求む)
  • ARM系LANDISK(HDL-A、HDL-T等):ヘッドレスだけどARMなのでUART/u-bootの世界。本記事の手法は適用外

全体の流れ

USB起動
  ↓ (質問画面を出さない魔法の呪文つき)
DHCP取得(1GbE側)
  ↓
network-consoleがSSH待受
  ↓
ssh installer@<IP> でログイン
  ↓
SSH越しにいつものインストーラ画面が出る
  ↓
再起動 → 本番DebianにSSH → 完成

USBメモリの準備

  1. debian-13.5.0-amd64-netinst.iso をRufusのISOモードでUSBに展開(パーティション構成だけGPTに変更。他は既定値。FAT32なのでWindowsからそのまま編集できます)

image.png
image.png

  1. USBのルート直下に preseed.cfg を配置
  2. /boot/grub/grub.cfg を書き換え

注意:どのgrub.cfgが読まれているのか問題

DebianのISOのUEFIブートチェーンはこうなっています:

EFI/boot/bootx64.efi
 → EFI/debian/grub.cfg
    → source $prefix/x86_64-efi/grub.cfg
       → (通常)source /boot/grub/grub.cfg

/boot/grub/x86_64-efi/grub.cfg の末尾が /boot/grub/grub.cfg をsourceしているのを
確認してから編集しましょう。
ここを確認せずに編集すると、**「一度も読まれていない設定ファイルを相手に、起動しない原因を延々と探す」**という虚無の時間が発生します。

grub.cfg

set timeout=3
set default=0

menuentry "Debian 13 Headless Install (1GbE only / network-console)" {
    set gfxpayload=keep
    linux /install.amd/vmlinuz modprobe.blacklist=atlantic auto=true priority=critical language=en country=JP locale=en_US.UTF-8 keymap=jp hostname=hdl4xa domain=local netcfg/choose_interface=auto netcfg/dhcp_timeout=60 netcfg/link_wait_timeout=15 preseed/file=/cdrom/preseed.cfg anna/choose_modules=network-console network-console/password=xxxxxxxx network-console/password-again=xxxxxxxx hw-detect/load_firmware=true --- quiet
    initrd /install.amd/initrd.gz
}

呪文の解説(=罠の回避策そのもの)

auto=true priority=critical(罠①の対策)
これがないと、インストーラは起動直後の言語選択画面で入力を待ち続けます。
画面がないので、外から見ると「電源は入るのにDHCPが一度も飛ばない」ようにしか見えません。
最初の失敗はこれでした。

modprobe.blacklist=atlantic(罠②の対策・本記事の本丸)
本機はNICが2つ(10GbEのAQC107と1GbEのRTL8111)あるため、
netcfg/choose_interface=auto を指定していても、インターフェース選択の質問に落ちて無言停止します。
そこで10GbE側のatlanticドライバをカーネルレベルで無効化し、
インストーラから見えるNICを1GbEの1個だけにしてしまいます。

ポイントは2つ:

  • netcfg/choose_interface=enp3s0 のような名前決め打ちは避けました。d-iと本番カーネルでNIC名がズレた場合、また無言停止して原因が見えなくなるからです。NICを物理的に1つにするほうが確実
  • blacklistは --- より前に置いてあるので、インストール後の本番Debianには引き継がれません。再起動後はatlanticが普通にロードされ、10GbEはちゃんと使えます(実機確認済み)

netcfg/link_wait_timeout=15 — r8169のリンクアップに数秒かかる場合の保険。

hw-detect/load_firmware=true — Debian 12以降のnetinstはnon-freeファームウェア同梱。読み込み確認の質問を潰します。

preseed.cfg

方針は「SSHで入るまでを自動化、パーティション等はSSH上で手動」の最小構成です。

#_preseed_V1
### ロケール・キーボード(カーネル引数と重複=保険)
d-i debian-installer/locale string en_US.UTF-8
d-i keyboard-configuration/xkb-keymap select jp

### ネットワーク
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string hdl4xa
d-i netcfg/get_domain string local
d-i netcfg/dhcp_timeout string 60
d-i netcfg/link_wait_timeout string 15
d-i netcfg/wireless_wep string

### network-console(SSHでインストーラに入る)
d-i anna/choose_modules string network-console
d-i network-console/password password xxxxxxxx
d-i network-console/password-again password xxxxxxxx

### パッケージ選択
# 【重要】これを書かないとGNOMEがフルインストールされます(一敗)
tasksel tasksel/first multiselect standard, ssh-server
popularity-contest popularity-contest/participate boolean false

罠③:GNOMEが勝手に入ってくる

初回インストール時、taskselの2行を書いていませんでした。結果:

  • パッケージ選択画面は一度も表示されず
  • 非力なAtomが黙々と何かをインストールし続けること15分
  • 「あれ?フルパッケージで入った感じだよ?」
  • 気づいたときにはGNOMEデスクトップ完備のNASが誕生していました

誰も画面を見ることのないヘッドレスNASに、フル装備のデスクトップ環境。切ない。

原因は priority=critical の挙動で、質問の種類によって動きが違います:

質問の種類 critical下の挙動
デフォルト値なし ちゃんと表示される パスワード設定、パーティション確認
デフォルト値あり 無言でデフォルト採用 tasksel、ミラー選択

taskselのデフォルトは「デスクトップ環境入り」なので、preseedで明示しない限りGNOMEが入ります。
「手動で答えたい質問」がデフォルト値持ちの場合は、preseedに書くか、
SSH接続後・Start installer前にメニューの「Change debconf priority」で優先度を下げるかの二択。
再現性の観点からpreseed明示をおすすめします。
(なおこの2行を入れた再インストール2周目は、想定通り最小構成で入りました。検証済み)

実行

  1. USBを挿して電源ON。3秒後に自動起動
  2. 2〜3分待つ(ここが最初のドキドキタイム)
  3. ルータのDHCPリース一覧で本機1GbEのMACアドレスを探し、IPを特定
  4. SSH接続:
ssh installer@<IP>

パスワードはgrub.cfg / preseed.cfgに書いた network-console/password の値です。

  1. メニューから Start installer を選択。以降、見慣れたdebianのウィザードがSSH上に表示されます

別セッションでシェルも取れる

もう1本SSHを張ってメニューから Execute a shell を選ぶと、インストーラ環境の生シェルが取れます。
進める前にこれだけ確認しておくと安心:

ip a      # NICが1GbEの1個だけ見えていること
lsblk     # インストール先SSDのデバイス名を目視確認

パーティション画面で消す対象を間違えると泣くので、lsblkの目視は強く推奨します。

再起動後

USBメモリを抜いてから再起動します。

ssh <ユーザー名>@<IP>

確認:

ip a                          # 1GbEにDHCPでIPが付いている
lspci -k | grep -A3 Ethernet  # r8169もatlanticも両方ロード済み
cat /etc/debian_version       # 13.5

blacklistはインストーラ限定なので、本番環境では10GbE(AQC107)もatlanticドライバでちゃんと認識されます
IP未設定で上がってくるだけなので、あとから好きに設定してください。

おまけの罠④:USBの抜き忘れ

再起動後、「IPは振られてSSHも繋がるのに、設定したパスワードで入れない!」という現象に遭遇したら。

……それ、USBからもう一周インストーラが起動しています

インストーラ環境もnetwork-consoleでsshdが上がるため、SSHが「繋がってしまう」せいで
かえって気づきにくいのが意地悪ポイント。設定したユーザーはSSDの中にいるのに、
あなたが今ログインを試みているのはUSBの中の世界です。そんなことってある?(ありました)

再起動前のUSB抜去、チェックリストに入れましょう。

完成後のハードウェア全体像(ドライバ、全部当たってます)

「で、本当に普通のLinux機として完成してるの?」への回答として、本番環境の実機出力を貼ります。

カーネルとCPU

$ uname -a
Linux hdl4xa 6.12.95+deb13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.95-1 x86_64 GNU/Linux

$ lscpu | grep -E "Model name|Core|Thread"
Model name:            Intel(R) Atom(TM) CPU C3338 @ 1.50GHz
Thread(s) per core:    1
Core(s) per socket:    2

$ free -h
               total        used        free      buff/cache   available
Mem:           1.9Gi       215Mi       1.7Gi        88Mi       1.7Gi
Swap:          2.0Gi          0B       2.0Gi

CPUは**Atom C3338(2コア/2スレッド)**と確定。メモリは2GB。
アイドルで215MiBしか使っていないので、NAS用途なら十分に戦えます。

lspci -nnk(本記事のハイライト)

00:12.0 System peripheral: Intel Atom C3000 SMBus Controller - Host
        Kernel driver in use: ismt_smbus
00:14.0 SATA controller: Intel Atom C3000 SATA Controller 1
        Kernel driver in use: ahci
00:15.0 USB controller: Intel Atom C3000 USB 3.0 xHCI Controller
        Kernel driver in use: xhci_hcd
00:1a.0 Serial controller: Intel Atom C3000 HSUART Controller
        Kernel driver in use: 8250_mid
00:1a.1 Serial controller: Intel Atom C3000 HSUART Controller
        Kernel driver in use: 8250_mid
00:1f.4 SMBus: Intel Atom C3000 SMBus controller
        Kernel driver in use: i801_smbus
01:00.0 Ethernet controller: Aquantia Corp. AQtion AQC107 [Atlantic 10G] [1d6a:07b1]
        Kernel driver in use: atlantic
03:00.0 Ethernet controller: Realtek RTL8111/8168/8211/8411 [10ec:8168]
        Kernel driver in use: r8169

(紙面の都合でPCIeルートポート等は省略。ME HECIやSPIコントローラなど
ファームウェア管理系のブロックを除き、実用デバイスは全て Kernel driver in use: 付きです)

注目ポイントは3つ:

① atlanticとr8169が両方当たっている。
インストーラで modprobe.blacklist=atlantic により封印した10GbEも、
本番では何事もなかったかのように目を覚ましています。blacklistがインストーラ限定である証拠。

② HSUARTコントローラが2つ居る。
シリアルコンソールの魂は、SoCの中でちゃんと生きていました。外に端子が出ていないだけ。
基板上のパターンを探せばシリアルコンソールを生やせる可能性があります(未検証。誰かやりませんか)。

③ 標準カーネルのinboxドライバだけで完結。
ベンダー提供の謎ドライバ、カーネルのピン止め、DKMSの類は一切なし。
今後のapt upgradeで壊れる要素が最初から存在しません。

NICとストレージ

$ ip -br a
lo               UNKNOWN        127.0.0.1/8
enp3s0           UP             192.168.0.25/22(+ IPv6)
enp1s0           DOWN

$ lsblk -o NAME,SIZE,MODEL,TRAN
NAME     SIZE MODEL                      TRAN
sda    119.2G SAMSUNG MZ7TE128HMGR       sata
├─sda1   976M
├─sda2 116.3G
└─sda3     2G

enp3s0(1GbE)が現役、enp1s0(10GbE)はケーブル未接続でDOWNなだけで認識済み。

まとめ

症状 原因 対策
DHCPが飛ばない 見えない言語選択で無言停止 auto=true priority=critical
それでもDHCPが飛ばない 2NICでインターフェース選択停止 modprobe.blacklist=atlantic
GNOMEが勝手に入る taskselが無言でデフォルト採用 tasksel tasksel/first multiselect standard, ssh-server
パスワードが通らない USB抜き忘れでインストーラ再演 再起動前にUSBを抜く

ヘッドレスインストールの敵は難しさではなく、**「無言」**でした。
止まる場所さえ分かってしまえば、あとは呪文を4つ唱えるだけ。

ジャンク棚で緑のLEDを点滅させているHDL4-XAは、
10GbE付きAtomサーバとして第二の人生を待っています。

そして気づく。

あ、これもう専用OSに戻れないやつだこれ。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?