@@ -26,14 +26,16 @@ import (
2626// Cuttlefish base images are based on debian images.
2727const (
2828 debianSourceImageProject = "debian-cloud"
29- debianSourceImage = "debian-13-trixie-v20251014"
29+ debianSourceImageX86 = "debian-13-trixie-v20251014"
30+ debianSourceImageArm = "debian-13-trixie-arm64-v20251014"
3031)
3132
3233const mountpoint = "/mnt/image"
3334
3435var (
3536 project = flag .String ("project" , "" , "GCE project whose resources will be used for creating the image" )
3637 zone = flag .String ("zone" , "us-central1-a" , "GCE zone used for creating relevant resources" )
38+ arch = flag .String ("arch" , "x86_64" , "architecture of GCE image. Supports either x86_64 or arm64" )
3739 linuxImageDeb = flag .String ("linux-image-deb" , "" , "linux-image-* package name. E.g. linux-image-6.1.0-40-cloud-amd64" )
3840 imageName = flag .String ("image-name" , "" , "output GCE image name" )
3941)
@@ -43,6 +45,7 @@ func mountAttachedDisk(project, zone, insName string) error {
4345}
4446
4547type kernelImageOpts struct {
48+ Arch gce.Arch
4649 LinuxImageDeb string
4750 ImageName string
4851}
@@ -78,13 +81,22 @@ func createImageMain(project, zone string, opts kernelImageOpts) error {
7881 }
7982 }()
8083 log .Println ("creating disk..." )
81- disk , err := h .CreateDisk (debianSourceImageProject , debianSourceImage , attachedDiskName , gce.CreateDiskOpts {})
84+ var sourceImage string
85+ switch opts .Arch {
86+ case gce .ArchX86 :
87+ sourceImage = debianSourceImageX86
88+ case gce .ArchArm :
89+ sourceImage = debianSourceImageArm
90+ default :
91+ return fmt .Errorf ("unsupported arch" )
92+ }
93+ disk , err := h .CreateDisk (debianSourceImageProject , sourceImage , attachedDiskName , gce.CreateDiskOpts {})
8294 if err != nil {
8395 return fmt .Errorf ("failed to create disk: %w" , err )
8496 }
8597 log .Printf ("disk created: %q" , attachedDiskName )
8698 log .Println ("creating instance..." )
87- ins , err := h .CreateInstance (insName , gce . ArchX86 )
99+ ins , err := h .CreateInstance (insName , opts . Arch )
88100 if err != nil {
89101 return fmt .Errorf ("failed to create instance: %w" , err )
90102 }
@@ -137,14 +149,22 @@ func main() {
137149 if * zone == "" {
138150 log .Fatal ("usage: `-zone` must not be empty" )
139151 }
152+ if * arch == "" {
153+ log .Fatal ("usage: `-arch` must not be empty" )
154+ }
140155 if * linuxImageDeb == "" {
141156 log .Fatal ("usage: `-linux-image-deb` must not be empty" )
142157 }
143158 if * imageName == "" {
144159 log .Fatal ("usage: `-image-name` must not be empty" )
145160 }
161+ architecture , err := gce .ParseArch (* arch )
162+ if err != nil {
163+ log .Fatal (err )
164+ }
146165
147166 opts := kernelImageOpts {
167+ Arch : architecture ,
148168 LinuxImageDeb : * linuxImageDeb ,
149169 ImageName : * imageName ,
150170 }
0 commit comments