私は現在Raspberry Piに似たコンピュータ(Debianベース)用のディスクイメージを構築しています。
私の現在のワークフローは次のとおりです。
- ディスクイメージ生成(非圧縮時最大16GB、圧縮時3GB)
- ターゲットシステムの電源を切る
- ターゲットシステムからSDカードを取り出す
- ビルドコンピュータにSDカードを挿入します。
dd
SDカードに画像を保存- ビルドマシンからSDカードを取り出す
- SD カードをターゲットシステムに挿入します。
- ターゲットシステムを新しいオペレーティングシステムのバージョンで起動します。
それは退屈。
サイクルを短くしたいです。
- ディスクイメージ生成(非圧縮時最大16GB、圧縮時3GB)
scp
ターゲットシステムのディスクイメージ- 新しい画像でターゲットシステムのSDカードを上書きします。
dd
- ターゲットシステムを新しいオペレーティングシステムのバージョンに再起動します。
今は明らかに問題があります。以下を含むマウントされたパーティションを上書きしようとします。ルートファイルシステム(ディスクイメージにはルートパーティションと起動パーティションのみが含まれています)。結局のところ、dd
(画像をSDカードにコピーするために使用した)セグフォルトが発生し、その後ファイルシステムを回復できず、機能しなくなります。
だから私の質問は:現在rootfsで低レベルのデータ「回復」を実行する方法はありますか?次のようになります。関連するバイナリ(dd
、、reboot
)の「静的にリンクされた」バージョンを一部の安全なスペース(RAMディスク)にコピーし、そこで実行します。
理想的には、ターゲットシステムに物理的にアクセスせずにこれを実行したいと思います(ディスクイメージが破損していない場合)。
答え1
Brianの答えは私が提案したものです。ウェブ上で画像を自由に受け取ります。上書きしたいストレージデバイスに画像を挿入できないため、他の方法はありません。
しかし、Brianのアプローチにはこの問題もあります。現在ブートされた Debian 全体からイメージを受け取ったと仮定すると、ファイルシステムの現在のソフトウェアが上書きされ始めます。ええと、生のディスクにダウンロードして取り出し中にハードウェアの中断、いくつかのタイマー/クローン操作、またはいくつかのファイルシステムメンテナンスツールが発生した場合はどうなりますか?システム全体がクラッシュする可能性があります。
競合が発生すると、アクセスできない場所から起動しない内蔵デバイスが残ります。これは努力をさらに悪化させる。
したがって、あなたがしなければならないことは、現在実行中のソフトウェアを上書きせずにソフトウェアを受け取って解凍することです。 2つの方法:
- AとBという2つのルートボリュームがあります。現在、Debian は A で実行されており、B のすべてを安全に上書きできます。完了したら、起動プロセスにBから起動し、システムを正しく再起動するように指示できます。 (通常、ブートローダが実行され、RPiブートハードウェア用のブート構成ファイルを含む別の「ブート」パーティションがあります。これは珍しい現象です。)
システムストレージスペースの2倍のサイズが必要です。
私は完全にRPiでこれを行う方法のバージョンのドラフトを作成しました。この最近の回答 - 上書きするルートボリューム(A)がありますが、そのボリュームで実行している間はこれを行わないでください。代わりに、ブートローダにエントリを追加してから初期RAMファイルシステムファイルを起動ドライブに追加すると、メガバイトのイメージから起動し、イメージがRAMにロードされ、そこからAに解凍されます。あるいは、ネットワーク設定、SSH、および圧縮解除器に加えて、ほとんど必要ない最小バージョンのオペレーティングシステムを含む別の(C)小さなボリュームがあります。
ラズベリーファイの最も深刻なハードウェア障害モードが書き込み疲労によるSDカードの停止であることとSDカードの価格がどれほど安いかを考えると、おそらく最初の方法(A / Bブート、別の「メンテナンス」なし)を選択することです。 OS))、新しいシステムが完全に機能している場合は、blkdiscard
SDカードウェアのレベリングに使用するスペースがあるように、現在使用していないボリュームを使用します。
要約すると、方法1を使用すると仮定します。
- システムに32GBより少し少ないスペースが必要な場合は、64GBカードを購入してください。
- このシステムにDebianをインストールしますが、デフォルトのパーティション構成を少し変更してください。
- ディスクをパーティション化するように求められたら、「ブート - フルディスクの使用とLVMの設定」を使用し、「パーティションスキーム」ダイアログボックスの目的の項目に応じて、「1パーティション内のすべてのファイル」または「/ homeパーティションの分割」を使用します。アップグレード後も生き残るためにパイにファイルを保存するホームディレクトリです(後で変更することもできます。大きな問題ではありません)。
- 作成するボリュームの概要のサイズの合計が、SDカードのサイズ(30GB)の半分よりわずかに小さいことを確認してください。必要に応じて/(および/home(存在する場合))のサイズをそれに合わせて縮小します。
- 変更をディスクに書き込んでインストールを完了し、RPiを起動すると機能します。
- (もちろん、既存のインストールのパーティションサイズを減らすことでこれを行うこともできますが、いくつかの注意事項と後で面倒な問題があります。クリーンなLVMのインストールから始めることをお勧めします。後悔しません。正直なところ、私はそうではありません。 Debianが2023年にデフォルトでLVMを使用しない理由はわかりませんが、8ビットCPU @ 5MHzおよび16kB RAM(文字通り1983年から)を持つ特定のブランドのパーソナルコンピュータに特定のパーティションスキームを使用することを好みます(文字通り1983年から)。
そこで、新しいシステムを実行した後(そして追加設定をする前に)アップデートプロセスについて説明します。
- パイから:
- 論理ボリュームがあることを確認する
oldsystem
(照会/dev/mapper
)- その場合は削除してください。
sudo lvremove your-volume-group-name/oldsystem
- その場合は削除してください。
- Piで:圧縮されていない画像サイズの新しいボリュームを作成します(ここでは30 GBと仮定)。
sudo lvcreate -L 30G --name image_prep your-volume-group-name
- 論理ボリュームがあることを確認する
- 最後に送信したい画像を追加してください。
- 画像を圧縮するには、次のようなものを使用します
zstd -12 -T0 < /what/you/want/to/compress > /path/to/images/filesystem.image.zst
(-12
すでに圧縮率がかなり高いのでそれほど高速ではありませんが、Web上で時間を節約するので、そのようなものがあります。1から18の値が有効です...) - 圧縮画像のチェックサムを取得します。
sha256sum /path/to/images/filesystem.image.zst >> checksums
- ホストから受信システムにイメージをインポートしています。私は怠惰で通常の小さなPython Webサーバーを設定します(SSH経由でコピーすると、貧しいRPiのCPUが少し熱くなるため)。 (
cd /path/to/images; python -m http.server -p HTTP/1.1 8765
必要に応じてポート8765を開きます。;このコンピュータのIPアドレスをメモしてください。
- 画像を圧縮するには、次のようなものを使用します
- パイから:
- 画像を取得し、新しいボリュームに抽出し、チェックサムを計算します。
mkfifo checksumpipe; sha256sum > checksum < checksumpipe &
curl http://ip.address.as.noted:8765/filesystem.image.zst | tee checksumpipe | zstd -d > /dev/your-volume-group-name/image_prep
- 検証のチェックサムがトランスポートホストに保存されて
checksum
いるものと同じであることを確認してください。checksums
- 現在のルートボリュームの名前を見つけ(疑わしい場合は
cat /proc/cmdline
検索root=/dev/mapper/your--volume--group--name-???
)、名前を次に変更しますoldsystem
。sudo lvrename your-volume-group-name ??? oldsystem
- 新しくミラー化されたボリュームの名前を古い名前に変更します。
sudo lvrename your-volume-group-name image_prep ???
- ボリュームマウント、バインディングマウント
/dev/
、ボリューム/proc
/sys
エントリ/boot
、chroot
マウント、およびブートローダアップデートの実行 - 再起動
- 画像を取得し、新しいボリュームに抽出し、チェックサムを計算します。
mender
あまり「Debian」ではない方法は、実際にはより効率的な方法を使用することです。RPi公式ガイド;「ホストされた性別」の登録に関する部分を無視し、「スタンドアロン」モードを探しています。
答え2
同じシステムに対してこれを頻繁に実行する場合。次に、ネットワークブートの使用を検討してください。ターゲットシステムにブートローダを一度インストールします。その後、ターゲットは再起動するたびにネットワークサーバー上で現在のオペレーティングシステムを実行します。
または
ルートパーティションに書き込むのは悪い考えです。ただし、新しい最小ルートを作成し、ルートを新しいルートに回転させることはできます。
答え3
ネットワーク経由でイメージングを実行できます。
ソースでは、dd if=/dev/hda bs=16065b | netcat < targethost-IP > 1234
私はそれを正確に推定します。netcat -l -p 1234 | dd of=/dev/hdc bs=16065b
まず、ターゲットでEnterを押してから、ソースでEnterを押します。 ddは、ジョブが完了するまでメモリーで実行されます。プログラムはストレージドライブで実行されません。必要な合理的なパーティションとブロックサイズ(bs)に交換してください。 /boot および / をイメージする場合は、/boot を最初に実行します。