still working on the pool creation
Some checks failed
CI / test-build (push) Has been cancelled

This commit is contained in:
2025-12-18 12:25:36 +07:00
parent c98b5b0935
commit b335b0d9f3

View File

@@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"fmt" "fmt"
"log"
"os/exec" "os/exec"
"strconv" "strconv"
"strings" "strings"
@@ -190,11 +191,21 @@ func (s *Service) CreatePool(name string, vdevs []string, options map[string]str
// Default mountpoint: /storage/pools/{poolname} // Default mountpoint: /storage/pools/{poolname}
mountpoint = "/storage/pools/" + name mountpoint = "/storage/pools/" + name
options["mountpoint"] = mountpoint options["mountpoint"] = mountpoint
// Pre-create the mountpoint directory with sudo }
_ = s.createMountpointWithSudo(mountpoint)
} else if mountpoint != "none" { // Pre-create the mountpoint directory with sudo (non-blocking - log errors but continue)
// Ensure mountpoint directory exists with sudo if mountpoint != "none" {
_ = s.createMountpointWithSudo(mountpoint) if err := s.createMountpointWithSudo(mountpoint); err != nil {
// Log the error but don't fail - ZFS might still create the pool
// The mountpoint can be fixed later if needed
log.Printf("warning: failed to pre-create mountpoint %s: %v (continuing anyway)", mountpoint, err)
}
}
// Set canmount=noauto to prevent automatic mounting during creation
// This allows pool creation to succeed even if mountpoint can't be created
if _, hasCanmount := options["canmount"]; !hasCanmount {
options["canmount"] = "noauto"
} }
// Add options // Add options
@@ -205,10 +216,32 @@ func (s *Service) CreatePool(name string, vdevs []string, options map[string]str
args = append(args, name) args = append(args, name)
args = append(args, vdevs...) args = append(args, vdevs...)
// Create the pool
_, err := s.execCommand(s.zpoolPath, args...) _, err := s.execCommand(s.zpoolPath, args...)
if err != nil {
return err return err
} }
// Pool created successfully - now try to set mountpoint and mount if needed
if mountpoint != "none" {
// Set mountpoint property (in case it wasn't set during creation)
setMountpointArgs := []string{"set", fmt.Sprintf("mountpoint=%s", mountpoint), name}
if _, setErr := s.execCommand(s.zfsPath, setMountpointArgs...); setErr != nil {
log.Printf("warning: failed to set mountpoint property: %v (pool created but not mounted)", setErr)
// Don't return error - pool is created successfully
} else {
// Try to mount the pool
mountArgs := []string{"mount", name}
if _, mountErr := s.execCommand(s.zfsPath, mountArgs...); mountErr != nil {
log.Printf("warning: failed to mount pool: %v (pool created but not mounted)", mountErr)
// Don't return error - pool is created successfully, just not mounted
}
}
}
return nil
}
// createMountpointWithSudo creates a mountpoint directory using sudo // createMountpointWithSudo creates a mountpoint directory using sudo
// This allows ZFS to mount pools even if root filesystem appears read-only // This allows ZFS to mount pools even if root filesystem appears read-only
func (s *Service) createMountpointWithSudo(path string) error { func (s *Service) createMountpointWithSudo(path string) error {