スキップしてメイン コンテンツに移動

debootstrap を使い amd64 機から arm64 機用に Debian13 を新規インストール

ようやく Debian13/trixie がリリースされましたね。そこで古い arm64 機(OrangePi PC 2)があるので腕試しにamd64機を作業PCにして Debian13 for arm64を sd カードにインストールしてみました。なお対象機に加え、SDカードリーダとUSBシリアルコンバーターが必要です。
以下作業内容です。まず初めに必要なパッケージを作業用PCにインストールしておきます。
sudo apt-get install git bison flex gcc-aarch64-linux-gnu python3-setuptools \
	swig python3-dev libssl-dev build-essential device-tree-compiler \
    gcc-or1k-elf u-boot-tools qemu-utils qemu-user-static
gcc-or1k-elfはOpen RISC 1000用のコンパイラで今回の OrangePi PC 2 にのみ必要なパッケージです。 つづいて OrangePi PC 2 用のu-bootをクロスコンパイルしますが、trusted-firmware-a と crust が必要になるので、こちらもクロスコンパイルしておきます。
# trusted-firmware-a のビルド
cd /usr/src
sudo mkdir TF-A
sudo chown YourUID:YourGID TF-A
cd /usr/src/TF-A
git clone https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git
cd trusted-firmware-a
make CROSS_COMPILE=aarch64-linux-gnu- PLAT=sun50i_a64 DEBUG=0 bl31
# 成果物
/usr/src/TF-A/trusted-firmware-a/build/sun50i_a64/release/bl31.bin

# crust のビルド
cd /usr/src
sudo mkdir crust
sudo chown YourUID:YourGID crust
cd crust 
git clone https://github.com/crust-firmware/crust
cd crust 
export CROSS_COMPILE=or1k-elf-
make orangepi_pc2_defconfig
make scp
# 成果物
/usr/src/crust/crust/build/scp/scp.bin

# u-boot のビルド
cd /usr/src
sudo mkdir -p /usr/src/u-boot/cross-arm64
sudo chown YourUID:YourGID u-boot
cd u-boot/cross-arm64
git clone https://source.denx.de/u-boot/u-boot.git
cd u-boot
git checkout v2025.07

export BL31=/usr/src/TF-A/trusted-firmware-a/build/sun50i_a64/release/bl31.bin
export SCP=/usr/src/crust/crust/build/scp/scp.bin

mkdir ../u-boot-build
make CROSS_COMPILE=aarch64-linux-gnu- \
    O=../u-boot-build/ \
    orangepi_pc2_defconfig
    
cd ../u-boot-build
make CROSS_COMPILE=aarch64-linux-gnu- -j20
# 成果物
/usr/src/u-boot/cross-arm64/u-boot-build/u-boot-sunxi-with-spl.bin
つづいてDebootstrap させるSDカードを作成していきます。
# 作業用PCでSDカードのパーティションをテーブルを消去(カードリーダ要)
TARGET=sdb
sudo dd if=/dev/zero of=/dev/${TARGET} bs=1024k count=64
sync

# on 作業用PCにてMicroSD card に dos パーテションを作成
sudo fdisk /dev/${TARGET}
#以下コマンドで 先頭1Gに linux partition を作成
o
n
# enter
# enter
# enter
+1G
#残りをパーティション タイプ linux にしておく
n
# enter
# enter
# enter
# enter

# 書き込み
w

# パーティションをフォーマット
sudo mkfs -t ext4 /dev/${TARGET}1
sudo mkfs -t ext4 /dev/${TARGET}2
# ブートローダ(u-boot)をSDカードに書き込み
sudo dd if=/usr/src/u-boot/cross-arm64/u-boot-build/u-boot-sunxi-with-spl.bin of=/dev/${TARGET} bs=1024 seek=8
ここまでで u-bootでブート可能なsdカードはできていますので、debootstrapでDebian13をインストールしていきます。
# 作業対象カードをマウント
sudo mount /dev/${TARGET}2 /mnt
sudo mkdir /mnt/boot
sudo mount /dev/${TARGET}1 /mnt/boot

# debootstrap
cd /mnt
sudo debootstrap --arch arm64 --foreign trixie . https://ftp.riken.jp/Linux/debian/debian

sudo mount --bind /dev dev/
sudo mount --bind /proc proc/
sudo mount --bind /sys sys/
	
sudo chroot . debootstrap/debootstrap --second-stage
debootstrap で基本パッケージのインストールが済んだので、他に必要なモノをインストールし、そのほか設定を書き込んでいきます。
sudo chroot .
apt-get install locales sudo

dpkg-reconfigure locales
# add below:
# en_US.UTF-8 UTF-8
# ja_JP.UTF-8 UTF-8ree

apt-get install linux-image-arm64 flash-kernel dbus
# エラーが出ますがあとでinitrdを更新するので無視してください。

# インストール対象機種のdtbを探す
find /usr/lib/linux-image* | grep -i orangepi

# 見つかったらコピーして環境変数にセットしておく
cd ~
cp /usr/lib/linux-image-6.12.38+deb13-arm64/allwinner/sun50i-h5-orangepi-pc2.dtb .
dtname=sun50i-h5-orangepi-pc2

# dtb から dtsを取り出す
dtc -I dtb -O dts -o ${dtname}.dts ${dtname}.dtb

# dts から Machine 名を取得し環境変数にセットしておく
machine=`cat ${dtname}.dts | grep model | awk -F'"' '{print $2}'`
 
# flash-kernel db に対象機を追加
cat >> /etc/flash-kernel/db <<EOF

Machine: ${machine}
Kernel-Flavors: arm64
Boot-Script-Path: /boot/boot.scr
DTB-Id: allwinner/${dtname}.dtb
U-Boot-Script-Name: bootscr.uboot-generic
Required-Packages: u-boot-tools
EOF

echo ${machine} >> /etc/flash-kernel/machine

flash-kernel
update-initramfs -u
ここで一旦 chroot から抜け fstabを作成し、ホスト名の設定などを行います。
export rootdev=`sudo blkid | grep ${TARGET}2 | awk -F'"' '{print $2}'`
export bootdev=`sudo blkid | grep ${TARGET}1 | awk -F'"' '{print $2}'`

sudo tee /mnt/etc/fstab </dev/null
UUID=${rootdev} /       ext4 defaults 0 0
UUID=${bootdev} /boot   ext4 defaults 0 0
EOF

# ホスト名を設定
sudo tee /mnt/etc/hostname </dev/null
opipc2
EOF
# /etc/hostsにエントリーを追加
sudo tee -a /mnt/etc/hosts </dev/null
127.0.1.1   opipc2
EOF
ホスト名の設定などがすんだら、再びchrootしてパスワードの設定や追加のパッケージのインストールなどを行います。
sudo chroot /mnt

# chang root password
passwd
# create an user
adduser --uid 1000 user1000

apt-get install dbus ntpsec-ntpdate
dpkg-reconfigure tzdata

cat > /etc/network/interfaces <<EOF
# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback

auto end0
iface end0 inet dhcp
EOF
これで作業PCでの作業はすんだので、chrootを抜け umountします。
exit
sync
cd /mnt
sudo umount dev/
sudo umount sys/
sudo umount proc/
cdb
sudo umount /mnt/boot
sudo umount /mnt
出来上がったカードを実機に挿して起動し以下の作業を行ってください。
# 初回のみ シリアルコンソールにて起動時になにかキーをおしてプロンプトに入り、
# 以下のコマンドで起動
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2
boot

# 手動で時刻を合わせる場合(aptは時刻があっていないとupdate/install できないため)
date -s "08/10 12:34 2025"

# 自動で時刻を合わせる場合 
ntpdate ntp.nict.jp

# ルートデバイスを実機に合わせるため initrd を更新
update-initramfs -u
作業はこれで完了です。次回以降は単に再起動させるだけでブートできるはずです。
armhfと同じくメインラインカーネルでのCPUサポートとdtbさえあれば、ほかのarm64機でもDebian13をインストールできるかもしれませんね。今回は以上です。それでは。

コメント

このブログの人気の投稿

wsdd を使ってSamba サーバをネットワークに表示

Windows 10のアップデートで、セキュリティー対応のため、smbv1がデフォルトではインストールされなくなり、Samba serverがエクスプローラーのネットワークに表示されなくなってしまいました。そこで、いくつか方法を調べたのですが、linuxでwsdの実装がないか探したところ、 https://github.com/christgau/wsdd が、見つかりましたので、さっそくインストールしてみました。まだパッケージにはないようですが、インストール自身は簡単です。wsdd自体は以下のように取得し、linkを張っておきます。 cd /usr/local/bin/ sudo wget https://raw.githubusercontent.com/christgau/wsdd/master/src/wsdd.py sudo chmod 755 wsdd.py sudo ln -sf wsdd.py wsdd こちらのsambaサーバはDebianなので、/etc/systemd/system/wsdd.serviceは以下のようにしました。 [Unit] Description=Web Services Dynamic Discovery host daemon Requires=network-online.target After=network.target network-online.target multi-user.target [Service] Type=simple ExecStart=/usr/local/bin/wsdd -d MYDOMAIN [Install] WantedBy=multi-user.target wsdd -d MYDOMAINのところを、環境にあわせて書き換えてください。 次に、systemdに登録・起動テストを行います。 systemctl enable wsdd systemctl start wsdd 起動に成功すると、エクスプローラーのネットワークに表示されます。  なおこのwsddはpython3が必要です。一度試してみてください。SMBv1/CIFSを停止していても、大丈夫です。 cで書かれたほかのwsddの実装もあるようなので、いずれパッケージになるかも...

Windows デバイス暗号化 のサポートで "許可されていない dma 対応バス/デバイスが検出されました"の対処

Windows でセキュリティー関係を見ているのですが、とあるPCでmsinfo32で確認すると"デバイス暗号化のサポート"で"許可されていない dma 対応バス/デバイスが検出されました"と出ていました。このPCの場合、それ以外はOK(なにも表示されない)だったのですが、ネットでしらべるとMSのドキュメントではハードウェアベンダーに問い合わせるなどと敷居が高く具体的にどこが引っかかっているかわかりません。そこでほかに方法はないかとしらべやってみたところ、"前提条件をみたしています"まで持って行けたので、本稿を挙げた次第です。 具体的には、以下のようにします。 1-a. 許可するDMA対応バス・デバイスを指定するレジストリの所有権と書き込み設定をおこなう。 以下のレジストリキーの所有者を自分自身(管理ユーザ)のものにし、フルコントロール権を付与する。 HKLM\SYSTEM\CurrentControlSet\Control\DmaSecurity\AllowedBuses もしくは 1-b. MicrosoftよりPsExecをダウンロードし、System権限でRegeditを立ち上げ編集する。 Microsoftより、https://docs.microsoft.com/en-us/sysinternals/downloads/psexec にある こちら をダウンロードし、解凍する。解凍すると、x64の場合、PsExec64.exeがあるので、管理者権限で以下を実行し、システム権限でregeditを立ち上げることが出来るようになる。 cd Downloads\PSTools .\PsExec64.exe -sid C:\Windows\regedit.exe 2-a. パワーシェルスクリプトを実行し、PnPデバイスのうちインスタンスがPCIで始まるものを"AllowedBuses"に追加する。 以下のパワーシェルスクリプトを作成する。たとえばDocuments\allow-dma-bus-device.ps1として作成する。( こちらの記事のものを使用させていただきました: Thank you! ) $tmpfile = "$($env:T...

フレッツ光クロス:MAP-E ROUTER by Debian Box (iptables)

フレッツ光クロスがようやく開通したので、Debianにてrouterを構成し接続してみました。なお、プロバイダーを選ぶにあたっては、IPoE方式がそれぞれ異なるため検討したところ、IPoEでは、MAP-Eでもv6plusとocnバーチャルコネクトがあり、前者がポート数240なのに対し、後者は約4倍のポート数が使えるようなネットの情報をみて、OCNバーチャルコネクトを選択しました。(プロバイダーとしてはぷららです。なおDS-LiteはCE側でのNATではないので今回は見送りました。)そこで、OCN バーチャルコネクトをDebian(iptables)で実現するとどうなるかと思い、ネットの情報を頼りにしつつ、設定した次第です。 実際に試した結果、とりあえず通信できていますが、MAP-Eは本来マッピングルールをマップサーバから取得するはずなので、今回のやり方が正解とはいえませんし、仕様変更されると通信できなくなる可能性があります。あくまでも参考程度ですが、本稿をUPしてみました。 2023/03/16追記: こちら にゲームコンソールNAT越え(Nintendo Switch ナットタイプ A判定)対応版を投稿しました。 2023/03/28追記:※1の記述および3行無効化によりNAT越え(Nintendo Switch ナットタイプ B判定)できるようになりました。 構成は以下の通りです。 ルーターがDebianで回線がOCNバーチャルコネクトであること以外はなにも特別なところはない構成です。 さて、いきなり設定ですが、まず、割り当てられたプレフィックスを確認します。 確認は、 dhclient -6 -d -P enp2s0 とします。出力の中に 前略 RCV: | | X-- IAPREFIX 2400:4050:5c71:af00::/56 後略 このようにプレフィックスが表示されるので、その確認したプレフィックスを書き留めておきます。これを こちらで 入力します。すると、 CE: 2400:4050:5c71:af00:99:f171:c600:2f00 IPv4 アドレス: 153.241.113.198 ポート番号:(1776-1791 2800-2815 3824-3839) 4848-4863 5872-5887 6896-...