Update Debian version to 13 (trixie) in documentation and script

master
Brent, Yang Bohan 4 months ago
parent 1f735da114
commit 804b2e05a1
  1. 100
      CLAUDE.md
  2. 8
      README.ja-JP.md
  3. 8
      README.md
  4. 8
      README.zh-CN.md
  5. 62
      debi.sh

@ -0,0 +1,100 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
Debi is a Debian Network Reinstall Script that allows reinstalling any VPS or physical machine to minimal Debian via network boot. It's a single POSIX-compliant shell script that automates the entire Debian installation process.
## Commands
### Running the Script
```bash
# Basic execution (requires root)
sudo ./debi.sh
# With options
sudo ./debi.sh --user debian --timezone UTC --cloudflare
# Dry run (generate config without installing)
sudo ./debi.sh --dry-run
# With cloud-init configuration
sudo ./debi.sh --cidata ./cidata-example/
```
### Testing Changes
```bash
# Check shell script syntax
sh -n debi.sh
# Run shellcheck for linting (if available)
shellcheck debi.sh
# Test in a VM environment (recommended)
# No automated test suite exists - manual testing required
```
## Architecture
The script operates in distinct phases:
1. **Configuration Phase**: Parses command-line arguments and validates environment
2. **Download Phase**: Fetches Debian installer components to `/boot/debian-$VERSION/`
3. **Preseed Generation**: Creates automated installation configuration
4. **GRUB Modification**: Adds installer entry to bootloader menu
5. **Initramfs Injection**: Embeds preseed and network configuration into installer
6. **Execution**: Updates GRUB and prepares for reboot
Key architectural decisions:
- Single-file design for easy distribution
- POSIX compliance for maximum compatibility
- No external dependencies beyond standard Linux utilities
- Modular function design with clear separation of concerns
- Extensive error handling with rollback capabilities
## Key Functions and Their Purposes
- `download()`: Handles file downloads with proxy support and multiple backend options (wget/curl/busybox)
- `set_debian_version()` / `set_suite()`: Manages Debian version selection and mirror URLs
- `configure_sshd()`: Sets up SSH access during installation for remote monitoring
- `in_target()`: Executes commands within the target installation environment
- `prompt_password()`: Securely handles password input with validation
## Important Configuration Variables
The script uses 80+ configuration options. Key ones include:
- `$suite`: Debian version (bookworm, bullseye, etc.)
- `$mirror_protocol` / `$mirror_host`: APT repository configuration
- `$disk`: Target installation disk
- `$authorized_keys_url`: SSH key provisioning
- `$cidata`: Cloud-init configuration directory
## Development Guidelines
1. **Maintain POSIX compliance** - Script must work with dash/sh, not just bash
2. **Test on real systems** - No test suite exists; changes require VM or physical testing
3. **Preserve backward compatibility** - Many users rely on specific option behaviors
4. **Document all options** - Update README.md for any new configuration options
5. **Handle errors gracefully** - Always provide rollback paths for critical operations
## Common Development Tasks
### Adding New Configuration Options
1. Add option to the case statement in the argument parsing section
2. Define corresponding variable with sensible default
3. Implement logic in appropriate phase function
4. Update README.md documentation
### Debugging Installation Issues
1. Use `--dry-run` to generate and inspect preseed configuration
2. Enable network console with `--ssh` for remote debugging
3. Check `/boot/debian-$VERSION/` for downloaded components
4. Review GRUB configuration changes in `/boot/grub/grub.cfg`
### Testing Platform Compatibility
Focus areas for testing:
- Network configuration (static IP vs DHCP)
- Disk detection and partitioning
- GRUB installation and boot entries
- Architecture-specific installer components

@ -30,7 +30,7 @@ sudo ./debi.sh --user root
sudo reboot sudo reboot
```` ````
**デフォルト設定:** Debian 12 (bookworm)、DHCPによるネットワーク設定、sudo権限を持つ`debian`ユーザーが作成され、パスワードの入力を求められます。 **デフォルト設定:** Debian 13 (trixie)、DHCPによるネットワーク設定、sudo権限を持つ`debian`ユーザーが作成され、パスワードの入力を求められます。
## プラットフォームサポート ## プラットフォームサポート
@ -65,8 +65,8 @@ sudo reboot
| オプション | デフォルト値 | 説明 | | オプション | デフォルト値 | 説明 |
|---|---|---| |---|---|---|
| `--version 12` | `12` | Debianのバージョン: `10`, `11`, `12`, `13` | | `--version 13` | `13` | Debianのバージョン: `10`, `11`, `12`, `13`, `14` |
| `--suite bookworm` | `bookworm` | Debianのスイート: `stable`, `testing`, `sid` など | | `--suite trixie` | `trixie` | Debianのスイート: `stable`, `testing`, `sid` など |
| `--user debian` | `debian` | ユーザー名 (`root`を指定するとrootユーザーのみ) | | `--user debian` | `debian` | ユーザー名 (`root`を指定するとrootユーザーのみ) |
| `--password PASSWORD` | *プロンプト* | ユーザーのパスワード(指定しない場合はプロンプト表示) | | `--password PASSWORD` | *プロンプト* | ユーザーのパスワード(指定しない場合はプロンプト表示) |
| `--authorized-keys-url URL` | *パスワード認証* | URLからSSH公開鍵を設定 (例: `https://github.com/user.keys`) | | `--authorized-keys-url URL` | *パスワード認証* | URLからSSH公開鍵を設定 (例: `https://github.com/user.keys`) |
@ -267,7 +267,7 @@ sudo ./debi.sh --ip 192.168.1.100/24 --gateway 192.168.1.1 --cidata ./cloud-conf
```bash ```bash
sudo ./debi.sh \ sudo ./debi.sh \
--version 12 \ --version 13 \
--user admin \ --user admin \
--timezone Europe/London \ --timezone Europe/London \
--disk /dev/nvme0n1 \ --disk /dev/nvme0n1 \

@ -31,7 +31,7 @@ sudo ./debi.sh --user root
sudo reboot sudo reboot
``` ```
**Default settings:** Debian 12 (bookworm), DHCP networking, user `debian` with sudo access, you'll be prompted for password. **Default settings:** Debian 13 (trixie), DHCP networking, user `debian` with sudo access, you'll be prompted for password.
## Platform Support ## Platform Support
@ -64,8 +64,8 @@ sudo reboot
### System & User Configuration ### System & User Configuration
| Option | Default | Description | | Option | Default | Description |
|--------|---------|-------------| |--------|---------|-------------|
| `--version 12` | `12` | Debian version: `10`, `11`, `12`, `13` | | `--version 13` | `13` | Debian version: `10`, `11`, `12`, `13`, `14` |
| `--suite bookworm` | `bookworm` | Debian suite: `stable`, `testing`, `sid`, etc. | | `--suite trixie` | `trixie` | Debian suite: `stable`, `testing`, `sid`, etc. |
| `--user debian` | `debian` | Username (use `root` for root-only) | | `--user debian` | `debian` | Username (use `root` for root-only) |
| `--password PASSWORD` | *prompt* | User password (prompted if not specified) | | `--password PASSWORD` | *prompt* | User password (prompted if not specified) |
| `--authorized-keys-url URL` | *password auth* | SSH keys from URL (e.g., `https://github.com/user.keys`) | | `--authorized-keys-url URL` | *password auth* | SSH keys from URL (e.g., `https://github.com/user.keys`) |
@ -245,7 +245,7 @@ sudo ./debi.sh --ip 192.168.1.100/24 --gateway 192.168.1.1 --cidata ./cloud-conf
### Advanced Custom Configuration ### Advanced Custom Configuration
```bash ```bash
sudo ./debi.sh \ sudo ./debi.sh \
--version 12 \ --version 13 \
--user admin \ --user admin \
--timezone Europe/London \ --timezone Europe/London \
--disk /dev/nvme0n1 \ --disk /dev/nvme0n1 \

@ -31,7 +31,7 @@ sudo ./debi.sh --user root
sudo reboot sudo reboot
``` ```
**默认设置:** Debian 12 (bookworm),DHCP 网络,创建一个名为 `debian` 并拥有 sudo 权限的用户,脚本会提示你为该用户设置密码。 **默认设置:** Debian 13 (trixie),DHCP 网络,创建一个名为 `debian` 并拥有 sudo 权限的用户,脚本会提示你为该用户设置密码。
## 平台支持 ## 平台支持
@ -66,8 +66,8 @@ sudo reboot
| 选项 | 默认值 | 描述 | | 选项 | 默认值 | 描述 |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| `--version 12` | `12` | Debian 版本:`10`, `11`, `12`, `13` | | `--version 13` | `13` | Debian 版本:`10`, `11`, `12`, `13`, `14` |
| `--suite bookworm` | `bookworm` | Debian 发行代号:`stable`, `testing`, `sid` 等 | | `--suite trixie` | `trixie` | Debian 发行代号:`stable`, `testing`, `sid` 等 |
| `--user debian` | `debian` | 用户名 (使用 `root` 则只创建 root 用户) | | `--user debian` | `debian` | 用户名 (使用 `root` 则只创建 root 用户) |
| `--password PASSWORD` | *交互式提示* | 用户密码 (如果未指定,则会提示输入) | | `--password PASSWORD` | *交互式提示* | 用户密码 (如果未指定,则会提示输入) |
| `--authorized-keys-url URL` | *密码认证* | 从 URL 加载 SSH 公钥 (例如 `https://github.com/user.keys`) | | `--authorized-keys-url URL` | *密码认证* | 从 URL 加载 SSH 公钥 (例如 `https://github.com/user.keys`) |
@ -269,7 +269,7 @@ sudo ./debi.sh --ip 192.168.1.100/24 --gateway 192.168.1.1 --cidata ./cloud-conf
```bash ```bash
sudo ./debi.sh \ sudo ./debi.sh \
--version 12 \ --version 13 \
--user admin \ --user admin \
--timezone Europe/London \ --timezone Europe/London \
--disk /dev/nvme0n1 \ --disk /dev/nvme0n1 \

@ -109,12 +109,16 @@ set_mirror_proxy() {
esac esac
} }
# Determines the security repository path format based on Debian suite
# - Buster (Debian 10): Uses old format "buster/updates"
# - Bullseye onwards and testing: Uses new format "suite-security"
# - Sid/unstable: No security repository (fixes go directly to unstable)
set_security_archive() { set_security_archive() {
case $suite in case $suite in
buster|oldoldstable) buster)
security_archive="$suite/updates" security_archive="$suite/updates"
;; ;;
bullseye|oldstable|bookworm|stable|trixie|testing) bullseye|oldoldstable|bookworm|oldstable|trixie|stable|forky|testing)
security_archive="$suite-security" security_archive="$suite-security"
;; ;;
sid|unstable) sid|unstable)
@ -125,12 +129,16 @@ set_security_archive() {
esac esac
} }
# Determines whether to use daily or stable installer builds
# - Stable/oldstable releases: Use stable installer builds (thoroughly tested)
# - Testing/unstable: Use daily installer builds (latest changes, may be less stable)
# Daily builds are necessary for testing/unstable as they need the latest kernel and packages
set_daily_d_i() { set_daily_d_i() {
case $suite in case $suite in
buster|oldoldstable|bullseye|oldstable|bookworm|stable) buster|bullseye|oldoldstable|bookworm|oldstable|trixie|stable)
daily_d_i=false daily_d_i=false
;; ;;
trixie|testing|sid|unstable) forky|testing|sid|unstable)
daily_d_i=true daily_d_i=true
;; ;;
*) *)
@ -144,20 +152,32 @@ set_suite() {
set_security_archive set_security_archive
} }
# Maps version numbers and release aliases to actual suite names
# Accepts: version number (10-14), suite name (buster, bullseye, etc.), or alias (stable, testing, etc.)
# Current mapping:
# - 10/buster: No longer supported as oldoldstable (archived)
# - 11/bullseye/oldoldstable: LTS support
# - 12/bookworm/oldstable: Previous stable
# - 13/trixie/stable: Current stable release
# - 14/forky/testing: Next release in development
# - sid/unstable: Rolling development branch
set_debian_version() { set_debian_version() {
case $1 in case $1 in
10|buster|oldoldstable) 10|buster)
set_suite buster set_suite buster
;; ;;
11|bullseye|oldstable) 11|bullseye|oldoldstable)
set_suite bullseye set_suite bullseye
;; ;;
12|bookworm|stable) 12|bookworm|oldstable)
set_suite bookworm set_suite bookworm
;; ;;
13|trixie|testing) 13|trixie|stable)
set_suite trixie set_suite trixie
;; ;;
14|forky|testing)
set_suite forky
;;
sid|unstable) sid|unstable)
set_suite sid set_suite sid
;; ;;
@ -166,13 +186,19 @@ set_debian_version() {
esac esac
} }
# Checks if cloud-optimized kernels are available for the current architecture and suite
# Cloud kernels are minimal kernels optimized for cloud/virtual environments
# - Buster: Only amd64 has cloud kernel, arm64 requires backports
# - Bullseye onwards: Both amd64 and arm64 have cloud kernels
# - Other architectures (i386, etc.): No cloud kernels available
# Returns 0 if available, 1 if not
has_cloud_kernel() { has_cloud_kernel() {
case $suite in case $suite in
buster|oldoldstable) buster)
[ "$architecture" = amd64 ] && return [ "$architecture" = amd64 ] && return
[ "$architecture" = arm64 ] && [ "$bpo_kernel" = true ] && return [ "$architecture" = arm64 ] && [ "$bpo_kernel" = true ] && return
;; ;;
bullseye|oldstable|bookworm|stable|trixie|testing|sid|unstable) bullseye|oldoldstable|bookworm|oldstable|trixie|stable|forky|testing|sid|unstable)
[ "$architecture" = amd64 ] || [ "$architecture" = arm64 ] && return [ "$architecture" = amd64 ] || [ "$architecture" = arm64 ] && return
esac esac
@ -182,9 +208,14 @@ has_cloud_kernel() {
return 1 return 1
} }
# Checks if backports repository is available for the current suite
# Backports provide newer versions of packages from testing/unstable rebuilt for stable releases
# - All stable releases and testing: Have backports available
# - Sid/unstable: No backports (already has the latest packages)
# Returns 0 if available, 1 if not
has_backports() { has_backports() {
case $suite in case $suite in
buster|oldoldstable|bullseye|oldstable|bookworm|stable|trixie|testing) return buster|bullseye|oldoldstable|bookworm|oldstable|trixie|stable|forky|testing) return
esac esac
warn "No backports kernel is available for $suite" warn "No backports kernel is available for $suite"
@ -201,7 +232,7 @@ dns6='2606:4700:4700::1111 2606:4700:4700::1001'
dns10='1.1.1.1 2606:4700:4700::1111' dns10='1.1.1.1 2606:4700:4700::1111'
hostname= hostname=
network_console=false network_console=false
set_debian_version 12 set_debian_version 13
mirror_protocol=https mirror_protocol=https
mirror_host=deb.debian.org mirror_host=deb.debian.org
mirror_directory=/debian mirror_directory=/debian
@ -540,9 +571,14 @@ done
[ -n "$authorized_keys_url" ] && ! download "$authorized_keys_url" /dev/null && [ -n "$authorized_keys_url" ] && ! download "$authorized_keys_url" /dev/null &&
err "Failed to download SSH authorized public keys from \"$authorized_keys_url\"" err "Failed to download SSH authorized public keys from \"$authorized_keys_url\""
# Determines if the non-free-firmware repository component is available
# Starting from Debian 12 (Bookworm), firmware was split into a separate component
# to make it easier to include necessary firmware while keeping main free
# - Bookworm onwards: non-free-firmware component available
# - Bullseye and earlier: Firmware is in non-free component
non_free_firmware_available=false non_free_firmware_available=false
case $suite in case $suite in
bookworm|stable|trixie|testing|sid|unstable) bookworm|oldstable|trixie|stable|forky|testing|sid|unstable)
non_free_firmware_available=true non_free_firmware_available=true
;; ;;
*) *)

Loading…
Cancel
Save