mirror of
https://github.com/getcompanion-ai/computer-host.git
synced 2026-04-15 08:03:40 +00:00
feat: nvme disk on m6
This commit is contained in:
parent
54a4c423a6
commit
eb9d2a76df
9 changed files with 240 additions and 22 deletions
|
|
@ -97,7 +97,10 @@ func cloneFile(source string, target string) error {
|
|||
func cloneDiskFile(source string, target string, mode appconfig.DiskCloneMode) error {
|
||||
switch mode {
|
||||
case appconfig.DiskCloneModeReflink:
|
||||
return reflinkFile(source, target)
|
||||
if err := reflinkFile(source, target); err != nil {
|
||||
return reflinkRequiredError(err)
|
||||
}
|
||||
return nil
|
||||
case appconfig.DiskCloneModeCopy:
|
||||
return cloneFile(source, target)
|
||||
default:
|
||||
|
|
@ -105,6 +108,42 @@ func cloneDiskFile(source string, target string, mode appconfig.DiskCloneMode) e
|
|||
}
|
||||
}
|
||||
|
||||
func validateDiskCloneBackend(cfg appconfig.Config) error {
|
||||
if cfg.DiskCloneMode != appconfig.DiskCloneModeReflink {
|
||||
return nil
|
||||
}
|
||||
|
||||
sourceFile, err := os.CreateTemp(cfg.ArtifactsDir, ".reflink-probe-source-*")
|
||||
if err != nil {
|
||||
return fmt.Errorf("create reflink probe source in %q: %w", cfg.ArtifactsDir, err)
|
||||
}
|
||||
sourcePath := sourceFile.Name()
|
||||
defer func() {
|
||||
_ = os.Remove(sourcePath)
|
||||
}()
|
||||
|
||||
if _, err := sourceFile.WriteString("reflink-probe"); err != nil {
|
||||
_ = sourceFile.Close()
|
||||
return fmt.Errorf("write reflink probe source %q: %w", sourcePath, err)
|
||||
}
|
||||
if err := sourceFile.Close(); err != nil {
|
||||
return fmt.Errorf("close reflink probe source %q: %w", sourcePath, err)
|
||||
}
|
||||
|
||||
targetPath := filepath.Join(cfg.MachineDisksDir, "."+filepath.Base(sourcePath)+".target")
|
||||
defer func() {
|
||||
_ = os.Remove(targetPath)
|
||||
}()
|
||||
if err := cloneDiskFile(sourcePath, targetPath, cfg.DiskCloneMode); err != nil {
|
||||
return fmt.Errorf("validate disk clone backend from artifacts dir %q to machine disks dir %q: %w", cfg.ArtifactsDir, cfg.MachineDisksDir, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func reflinkRequiredError(err error) error {
|
||||
return fmt.Errorf("FIRECRACKER_HOST_DISK_CLONE_MODE=reflink requires a CoW filesystem with reflink support across artifacts and machine-disks; mount FIRECRACKER_HOST_ROOT_DIR on XFS with reflink=1 or Btrfs, preferably on local NVMe, or set FIRECRACKER_HOST_DISK_CLONE_MODE=copy for the slow full-copy fallback: %w", err)
|
||||
}
|
||||
|
||||
func reflinkFile(source string, target string) error {
|
||||
if err := os.MkdirAll(filepath.Dir(target), 0o755); err != nil {
|
||||
return fmt.Errorf("create target dir for %q: %w", target, err)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue