

 **Bantu tingkatkan halaman ini** 

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Untuk berkontribusi pada panduan pengguna ini, pilih **Edit halaman ini pada GitHub** tautan yang terletak di panel kanan setiap halaman.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Buat varian AMI Bottlerocket khusus untuk Amazon EKS
<a name="bottlerocket-custom-variant"></a>

Saat Anda menjalankan beban kerja GPU di Amazon Elastic Kubernetes Service (Amazon EKS), Anda memilih varian Bottlerocket. Varian harus sesuai dengan versi Kubernetes dan tipe akselerator Anda. Bottlerocket mengirimkan varian yang divalidasi untuk konfigurasi umum. Namun, organisasi Anda mungkin memerlukan varian yang berbeda untuk salah satu alasan berikut:
+ Cabang driver NVIDIA yang lebih baru
+ Versi driver yang disematkan untuk kepatuhan terhadap peraturan
+ Paket tambahan untuk pemantauan
+ Garis dasar yang diperkeras yang dibutuhkan oleh tim keamanan Anda

Karena [Bottlerocket](https://github.com/bottlerocket-os/bottlerocket) di GitHub situs web sepenuhnya open-source, Anda dapat membuat varian khusus yang memenuhi kebutuhan ini. Topik ini menunjukkan cara mengkloning varian yang ada dan menukar driver NVIDIA dari cabang R580 ke R595 (versi 595.71.05). Anda kemudian membangun gambar dan mendaftarkannya sebagai AMI pribadi.

**penting**  
Jenis instans G7 EC2 memerlukan driver NVIDIA versi 595 atau yang lebih baru. EKS Bottlerocket NVIDIA AMI saat ini menyertakan driver NVIDIA versi 580, yang tidak mendukung instance G7.  
Lihat [repositori Bottlerocket](https://github.com/bottlerocket-os/bottlerocket) di GitHub situs web untuk petunjuk tentang membangun varian dengan driver NVIDIA versi 595. Topik ini berjalan melalui proses lengkap mulai dari [Langkah 1](#bottlerocket-custom-variant-step1).

## Cara kerja sistem build
<a name="bottlerocket-custom-variant-build-system"></a>

Ketika Anda berlari`cargo make -e BUILDSYS_VARIANT=aws-k8s-1.36-nvidia`, tiga hal terjadi:
+  **Ambil dependensi.** Twoliter (orkestrator build Bottlerocket) membaca `Twoliter.toml` dan menarik tiga artefak Open Container Initiative (OCI) dari: `public.ecr.aws/bottlerocket`
  +  **bottlerocket-sdk** — gambar kontainer dengan rantai alat kompilasi silang lengkap (makro GCC, Rust, Go, RPM).
  +  **bottlerocket-kernel-kit** — RPM pra-bangun untuk kernel, modul kernel (termasuk paket NVIDIA kmod), dan firmware.
  +  **bottlerocket-core-kit** — RPM pra-bangun untuk ruang pengguna: kubelet, containerd, plugin perangkat NVIDIA dan toolkit kontainer, plugin pengaturan, dan layanan sistem.

     `Twoliter.toml`menyematkan versi dan `Twoliter.lock` mengunci intisari mereka. Untuk mengubah keduanya, jalankan `./tools/twoliter/twoliter update` untuk menyelesaikan kembali.
+  **Bangun variannya.** Twoliter meluncurkan build Docker di dalam wadah SDK. Ini mengkompilasi peti pengaturan-default varian Anda, menyelesaikan pohon ketergantungan RPM dari kit, dan merakit semuanya menjadi image disk.
+  **Keluaran.** Tdoliter menulis `.img.lz4` file terakhir ke. `build/images/` Build menghasilkan output deterministik: `Twoliter.toml` pin dan varian yang sama `Cargo.toml` selalu menghasilkan gambar yang sama, terlepas dari host.

## Tata letak repositori
<a name="bottlerocket-custom-variant-repo-layout"></a>

Direktori berikut relevan dengan pekerjaan varian:

```
bottlerocket/
├── Cargo.toml                       # workspace: lists every variant
├── Twoliter.toml                    # pins SDK + kit versions
├── Twoliter.lock                    # locked digests for the above
├── Licenses.toml                    # you create this (NVIDIA license acknowledgement)
├── Infra.toml                       # you create this (AMI publish regions)
│
├── variants/
│   ├── aws-k8s-1.36-nvidia/         # example variant you'll copy
│   │   ├── Cargo.toml               #   package list + kernel params
│   │   └── amispec.toml             #   symlink → ../shared/amispec-split.toml
│   └── shared/                      # shared AMI spec templates
│
├── sources/
│   ├── Cargo.toml                   # workspace: lists every settings-defaults crate
│   ├── shared-defaults/             # the actual defaults (symlink targets)
│   └── settings-defaults/
│       └── aws-k8s-1.36-nvidia/
│           ├── Cargo.toml
│           └── defaults.d/          # 30+ symlinks into shared-defaults/
│
└── packages/
    ├── settings-defaults/
    │   └── settings-defaults.spec   # RPM: declares which variants exist
    └── settings-plugins/
        └── settings-plugins.spec    # RPM: maps variants to settings plugins
```

Tinjau catatan berikut tentang struktur repositori:
+ Varian sebagian besar metadata. Kit eksternal memasok kernel, driver, dan ruang pengguna.
+ Settings-defaults file adalah symlink, bukan salinan. Gunakan `cp -R` (bukan `cp -r` di macOS) untuk melestarikannya.
+ Menambahkan varian memerlukan pengeditan di lima tempat: dua `Cargo.toml` file ruang kerja, dua `.spec` file, dan. `README.md`

## Prasyarat
<a name="bottlerocket-custom-variant-prereqs"></a>

Untuk menyelesaikan penelusuran, Anda perlu:
+  AWS Akun dengan izin untuk meluncurkan instans EC2 dan mendaftarkan AMI
+ Instans EC2 (atau host Linux x86\_64 yang setara) dengan setidaknya 8 core, memori 16 GiB, dan disk 150 GB
+ Ubuntu 24.04 LTS (atau Fedora; macOS tidak didukung sebagai host build)
+ Docker 20.10 atau yang lebih baru
+ Rust (rantai alat stabil, dipasang melalui rustup)
+ cargo-make (versi terbaru)
+ Keakraban dengan konsep pengemasan Git, Kargo Rust, dan RPM

**catatan**  
Saat Anda menyelesaikan panduan ini, hentikan instans EC2 dan deregister AMI apa pun yang tidak lagi Anda perlukan untuk menghindari tagihan yang sedang berlangsung. Untuk petunjuk tentang pembersihan, lihat[Membersihkan](#bottlerocket-custom-variant-cleanup).

## Langkah 1: Siapkan host build
<a name="bottlerocket-custom-variant-step1"></a>

Luncurkan instance EC2 - misalnya, `c7i.8xlarge` (32 vCPU, memori 64 GiB). Gunakan volume root 150 GB gp3 dan lampirkan kebijakan `AmazonSSMManagedInstanceCore` terkelola untuk akses SSM.

Connect ke instans menggunakan AWS Systems Manager (SSM) Session Manager:

```
aws ssm start-session --target <instance-id>
cd ~
```

Instal paket sistem operasi yang diperlukan:

```
apt-get update
apt-get install -y build-essential openssl libssl-dev pkg-config lz4 \
                   git ca-certificates curl gnupg
```

**catatan**  
`BUILDING.md`Referensi resmi`liblz4-tool`. Pada versi Ubuntu terbaru, paket ini diberi nama`lz4`.

Instal Docker menggunakan perintah berikut:

```
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
  https://download.docker.com/linux/ubuntu noble stable" \
  > /etc/apt/sources.list.d/docker.list
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin
systemctl enable --now docker
```

Instal Rust dan cargo-make menggunakan perintah berikut:

```
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
. "$HOME/.cargo/env"
cargo install cargo-make
```

## Langkah 2: Kloning repositori
<a name="bottlerocket-custom-variant-step2"></a>

Kloning [repositori Bottlerocket](https://github.com/bottlerocket-os/bottlerocket) di situs web dan navigasikan ke GitHub direktori:

```
cd ~/bottlerocket
```

Untuk membuat build yang dapat direproduksi, lihat rilis yang diberi tag (misalnya,). `git checkout v1.62.1` Untuk menggunakan paket terbaru, tetap di `develop` cabang.

## Langkah 3: Verifikasi versi kit
<a name="bottlerocket-custom-variant-step3"></a>

Buka `Twoliter.toml` dan konfirmasikan versi kit. Untuk dukungan R595, Anda memerlukan `bottlerocket-kernel-kit` versi 6.2.2 atau yang lebih baru:

```
[[kit]]
name = "bottlerocket-kernel-kit"
version = "6.2.2"
vendor = "bottlerocket"
```

Jika versinya lebih lama, perbarui dan buat ulang kunci:

```
./tools/twoliter/twoliter update
```

## Langkah 4: Mengatasi masalah jalur pembuatan kargo
<a name="bottlerocket-custom-variant-step4"></a>

Twoliter disetel `CARGO_HOME` ke`~/bottlerocket/.cargo`, yang mencegah proses Cargo bagian dalam menemukan pembuatan kargo yang diinstal secara global. Buat symlink:

```
mkdir -p ~/bottlerocket/.cargo/bin
ln -sf /root/.cargo/bin/cargo-make ~/bottlerocket/.cargo/bin/cargo-make
```

Tanpa langkah ini, build gagal`error: no such command: make`.

## Langkah 5: Temukan cabang driver yang tersedia
<a name="bottlerocket-custom-variant-step5"></a>

Paket NVIDIA kmod dikirim ke dalam. `bottlerocket-kernel-kit` Untuk informasi tentang paket driver yang tersedia, lihat [direktori paket kernel-kit](https://github.com/bottlerocket-os/bottlerocket-kernel-kit) di GitHub situs web, atau [catatan rilis](https://github.com/bottlerocket-os/bottlerocket-kernel-kit/releases) di situs web. GitHub 

Untuk kernel 6.18 (digunakan oleh `aws-k8s-1.36` varian):

```
kmod-6.18-nvidia-r580   ← driver 580.159.03 (current default)
kmod-6.18-nvidia-r595   ← driver 595.71.05
```

Untuk kernel 6.12 (digunakan oleh`aws-k8s-1.33`,`1.34`,`1.35`):

```
kmod-6.12-nvidia-r580
kmod-6.12-nvidia-r595
```

**catatan**  
Setiap paket kmod mengirimkan subpaket (`-tesla`,,, `-open-gpu` `-grid``-fabricmanager`,`-imex`). Referensi varian NVIDIA Bottlerocket resmi`-tesla`, yang menarik semua subpaket yang diperlukan melalui dependensi RPM. Saat boot, Bottlerocket secara otomatis memilih ragam driver yang sesuai berdasarkan jenis instance.

## Langkah 6: Buat varian baru
<a name="bottlerocket-custom-variant-step6"></a>

Salin varian yang ada. Gunakan `cp -R` untuk melestarikan symlink:

```
cp -R variants/aws-k8s-1.36-nvidia variants/aws-k8s-1.36-nvidia-595
cp -R sources/settings-defaults/aws-k8s-1.36-nvidia \
      sources/settings-defaults/aws-k8s-1.36-nvidia-595
```

Sunting`variants/aws-k8s-1.36-nvidia-595/Cargo.toml`:

```
- name = "aws-k8s-1_36-nvidia"
+ name = "aws-k8s-1_36-nvidia-595"

- "kmod-6.18-nvidia-r580-tesla",
+ "kmod-6.18-nvidia-r595-tesla",
```

Sunting`sources/settings-defaults/aws-k8s-1.36-nvidia-595/Cargo.toml`:

```
- name = "settings-defaults-aws-k8s-1_36-nvidia"
+ name = "settings-defaults-aws-k8s-1_36-nvidia-595"
```

## Langkah 7: Daftarkan varian
<a name="bottlerocket-custom-variant-step7"></a>

Daftarkan varian baru dalam lima file:

 **1. `Cargo.toml`**— tambahkan anggota ruang kerja:

```
 "variants/aws-k8s-1.36-nvidia",
+    "variants/aws-k8s-1.36-nvidia-595",
 "variants/aws-k8s-1.36-nvidia-fips",
```

 **2. `sources/Cargo.toml`**— tambahkan anggota pengaturan-default:

```
 "settings-defaults/aws-k8s-1.36-nvidia",
+    "settings-defaults/aws-k8s-1.36-nvidia-595",
```

 **3. `packages/settings-defaults/settings-defaults.spec`**— tambahkan `%package` blok, entri di kedua loop build, dan `%files` bagian:

```
%package aws-k8s-1.36-nvidia-595
Summary: Settings defaults for the aws-k8s 1.36 nvidia-595 variant
Requires: %{_cross_os}variant(aws-k8s-1.36-nvidia-595)
Provides: %{_cross_os}settings-defaults(any)
Provides: %{_cross_os}settings-defaults(aws-k8s-1.36-nvidia-595)
Conflicts: %{_cross_os}settings-defaults(any)

%description aws-k8s-1.36-nvidia-595
%{summary}.
```

Tambahkan ke kedua `for defaults in` loop:

```
    aws-k8s-1.36-nvidia \
+   aws-k8s-1.36-nvidia-595 \
    metal-dev \
```

Tambahkan `%files` bagian:

```
%files aws-k8s-1.36-nvidia-595
%{_cross_defaultsdir}/aws-k8s-1.36-nvidia-595.toml
%{_cross_tmpfilesdir}/storewolf-defaults-aws-k8s-1.36-nvidia-595.conf
```

 **4. `packages/settings-plugins/settings-plugins.spec`**— tambahkan `Provides:` baris di bawah`%package aws-k8s-nvidia`:

```
 Provides: %{_cross_os}settings-plugin(aws-k8s-1.36-nvidia)
+Provides: %{_cross_os}settings-plugin(aws-k8s-1.36-nvidia-595)
 Conflicts: %{_cross_os}settings-plugin(any)
```

## Langkah 8: Segarkan file kunci
<a name="bottlerocket-custom-variant-step8"></a>

Menambahkan anggota ruang kerja tidak valid`sources/Cargo.lock`. Segarkan itu:

```
cd ~/bottlerocket/sources
cargo update --workspace
```

**penting**  
Jangan gunakan`cargo generate-lockfile`. Ini menulis ulang seluruh file kunci dan menghilangkan dependensi transitif, yang menyebabkan kesalahan versi duplikat. `cargo-deny`

## Langkah 9: Buat file lisensi NVIDIA
<a name="bottlerocket-custom-variant-step9"></a>

NVIDIA membatasi redistribusi sumber driver. Anda harus menambahkan pengakuan lisensi eksplisit sebelum membangun:

```
cat > ~/bottlerocket/Licenses.toml <<'EOF'
[nvidia]
spdx-id = "LicensesRef-NVIDIA-Customer-Use"
licenses = [
  { path = "LICENSE", license-url = "https://www.nvidia.com/en-us/drivers/nvidia-license/" }
]
EOF
```

## Langkah 10: Bangun dan publikasikan AMI
<a name="bottlerocket-custom-variant-step10"></a>

Buat `Infra.toml` dengan wilayah target Anda:

```
cat > ~/bottlerocket/Infra.toml <<'EOF'
[aws]
regions = ["us-west-2", "us-east-1", "us-east-2"]
EOF
```

Bangun gambar:

```
cd ~/bottlerocket
cargo make \
  -e BUILDSYS_VARIANT=aws-k8s-1.36-nvidia-595 \
  -e BUILDSYS_UPSTREAM_SOURCE_FALLBACK=true \
  -e BUILDSYS_UPSTREAM_LICENSE_FETCH=true \
  -e BUILDSYS_JOBS=32
```

Build pertama menarik gambar SDK dan kit (total \~2 GB). Build selanjutnya membutuhkan waktu 3-5 menit pada host 32-core.

Publikasikan AMI:

```
cargo make \
  -e BUILDSYS_VARIANT=aws-k8s-1.36-nvidia-595 \
  -e PUBLISH_REGIONS=us-west-2,us-east-1,us-east-2 \
  ami
```

Build menulis ID AMI ke`build/images/x86_64-aws-k8s-1.36-nvidia-595/latest/*-amis.json`. Gunakan ini di grup node terkelola EKS Anda, Karpenter`EC2NodeClass`, atau template peluncuran.

## Kombinasi lain yang dapat Anda bangun
<a name="bottlerocket-custom-variant-other-combinations"></a>

Panduan ini menukar cabang driver NVIDIA, tetapi Anda dapat menggunakan pendekatan yang sama untuk paket apa pun yang tersedia di kit hulu. Contoh-contoh berikut menunjukkan apa yang dapat Anda rakit tanpa melakukan forking kit:


| Apa yang Anda inginkan | Apa yang harus diubah dalam varian `Cargo.toml`  | 
| --- | --- | 
| Cabang driver NVIDIA yang berbeda |  `kmod-6.18-nvidia-r580-tesla` → `kmod-6.18-nvidia-r595-tesla`  | 
| Versi kernel yang berbeda |  `kernel-6.18`→ `kernel-6.12` (sesuaikan kmod sesuai) | 
| Hapus NVIDIA seluruhnya | Hapus tiga `nvidia-*` baris dari `included-packages`  | 
| Tambahkan dukungan EFA | Tambahkan `kmod-6.18-efa` ke `included-packages`  | 
| Ganti versi runtime kontainer |  `containerd-2.2` → `containerd-2.1`  | 

Untuk informasi tentang paket yang tersedia, lihat [kernel-kit](https://github.com/bottlerocket-os/bottlerocket-kernel-kit) di GitHub situs web dan [core-kit](https://github.com/bottlerocket-os/bottlerocket-core-kit) di situs web. GitHub 

**penting**  
Sistem file root Bottlerocket tidak dapat diubah. Anda tidak dapat menginstal paket saat runtime. Setiap paket dalam kit dikompilasi silang khusus untuk Bottlerocket — RPM hulu standar tidak berfungsi. Jika Anda memerlukan perangkat lunak yang belum ada dalam kit, pertimbangkan [wadah bootstrap](https://github.com/bottlerocket-os/bottlerocket#bootstrap-containers-settings) di GitHub situs web atau [wadah host](https://github.com/bottlerocket-os/bottlerocket#host-containers) di GitHub situs web sebagai alternatif runtime.

## Membersihkan
<a name="bottlerocket-custom-variant-cleanup"></a>

Jika Anda tidak lagi membutuhkan host build, hentikan instans EC2 untuk menghindari tagihan yang sedang berlangsung. AMI bertahan secara independen di akun Anda; deregister mereka dengan konsol EC2 atau CLI jika Anda tidak lagi membutuhkannya.

## Ringkasan
<a name="bottlerocket-custom-variant-summary"></a>

Topik ini menunjukkan cara membuat varian Bottlerocket kustom dengan cabang driver NVIDIA yang berbeda. Prosesnya melibatkan penyalinan varian yang ada, mengubah satu referensi paket, mendaftarkan varian baru di ruang kerja dan spesifikasi RPM, dan menjalankan build. Pendekatan yang sama berlaku untuk kustomisasi apa pun: menukar versi kernel, menambahkan paket, atau membuat varian untuk rilis Kubernetes baru.