Added Init to datastructure, fixups to container interface, and --setdefault to kernel and container build

This commit is contained in:
Gregory Kurtzer
2020-12-06 22:29:25 -08:00
parent 9de9778648
commit 5c995f9d0f
18 changed files with 104 additions and 12 deletions

View File

@@ -52,7 +52,7 @@ files: all
# cp -r tftpboot/* /var/lib/tftpboot/warewulf/ipxe/ # cp -r tftpboot/* /var/lib/tftpboot/warewulf/ipxe/
# restorecon -r /var/lib/tftpboot/warewulf # restorecon -r /var/lib/tftpboot/warewulf
cp -r overlays /var/warewulf/ cp -r overlays /var/warewulf/
chmod +x /var/warewulf/overlays/system/default/init chmod +x /var/warewulf/overlays/system/default/init.ww
mkdir -p /var/warewulf/overlays/system/default/warewulf/bin/ mkdir -p /var/warewulf/overlays/system/default/warewulf/bin/
cp wwclient /var/warewulf/overlays/system/default/warewulf/bin/ cp wwclient /var/warewulf/overlays/system/default/warewulf/bin/

View File

@@ -1,7 +1,9 @@
package build package build
import ( import (
"fmt"
"github.com/hpcng/warewulf/internal/pkg/container" "github.com/hpcng/warewulf/internal/pkg/container"
"github.com/hpcng/warewulf/internal/pkg/node"
"github.com/hpcng/warewulf/internal/pkg/wwlog" "github.com/hpcng/warewulf/internal/pkg/wwlog"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"os" "os"
@@ -25,6 +27,31 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
container.Build(c, BuildForce) container.Build(c, BuildForce)
} }
if SetDefault == true {
if len(containers) != 1 {
wwlog.Printf(wwlog.ERROR, "Can only set default for one container\n")
} else {
nodeDB, err := node.New()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err)
os.Exit(1)
}
//TODO: Don't loop through profiles, instead have a nodeDB function that goes directly to the map
profiles, _ := nodeDB.FindAllProfiles()
for _, profile := range profiles {
wwlog.Printf(wwlog.DEBUG, "Looking for profile default: %s\n", profile.Id.Get())
if profile.Id.Get() == "default" {
wwlog.Printf(wwlog.DEBUG, "Found profile default, setting container name to: %s\n", containers[0])
profile.ContainerName.Set(containers[0])
nodeDB.ProfileUpdate(profile)
}
}
nodeDB.Persist()
fmt.Printf("Set default profile to container: %s\n", containers[0])
}
}
/* /*
var nodes []node.NodeInfo var nodes []node.NodeInfo
set := make(map[string]int) set := make(map[string]int)

View File

@@ -12,11 +12,13 @@ var (
} }
BuildForce bool BuildForce bool
BuildAll bool BuildAll bool
SetDefault bool
) )
func init() { func init() {
baseCmd.PersistentFlags().BoolVarP(&BuildAll, "all", "a", false, "(re)Build all VNFS images for all nodes") baseCmd.PersistentFlags().BoolVarP(&BuildAll, "all", "a", false, "(re)Build all VNFS images for all nodes")
baseCmd.PersistentFlags().BoolVarP(&BuildForce, "force", "f", false, "Force rebuild, even if it isn't necessary") baseCmd.PersistentFlags().BoolVarP(&BuildForce, "force", "f", false, "Force rebuild, even if it isn't necessary")
baseCmd.PersistentFlags().BoolVar(&SetDefault, "setdefault", false, "Set this container for the default profile")
} }
// GetRootCommand returns the root cobra.Command for the application. // GetRootCommand returns the root cobra.Command for the application.

View File

@@ -1,4 +1,4 @@
// + build linux // +build linux
package child package child

View File

@@ -1,7 +1,9 @@
package build package build
import ( import (
"fmt"
"github.com/hpcng/warewulf/internal/pkg/kernel" "github.com/hpcng/warewulf/internal/pkg/kernel"
"github.com/hpcng/warewulf/internal/pkg/node"
"github.com/hpcng/warewulf/internal/pkg/wwlog" "github.com/hpcng/warewulf/internal/pkg/wwlog"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"os" "os"
@@ -17,6 +19,31 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
} }
} }
if SetDefault == true {
if len(args) != 1 {
wwlog.Printf(wwlog.ERROR, "Can only set default for one kernel version\n")
} else {
nodeDB, err := node.New()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err)
os.Exit(1)
}
//TODO: Don't loop through profiles, instead have a nodeDB function that goes directly to the map
profiles, _ := nodeDB.FindAllProfiles()
for _, profile := range profiles {
wwlog.Printf(wwlog.DEBUG, "Looking for profile default: %s\n", profile.Id.Get())
if profile.Id.Get() == "default" {
wwlog.Printf(wwlog.DEBUG, "Found profile default, setting kernel version to: %s\n", args[0])
profile.KernelVersion.Set(args[0])
nodeDB.ProfileUpdate(profile)
}
}
nodeDB.Persist()
fmt.Printf("Set default kernel version to: %s\n", args[0])
}
}
/* /*
var nodes []node.NodeInfo var nodes []node.NodeInfo
set := make(map[string]int) set := make(map[string]int)

View File

@@ -14,11 +14,13 @@ var (
} }
BuildAll bool BuildAll bool
ByNode bool ByNode bool
SetDefault bool
) )
func init() { func init() {
baseCmd.PersistentFlags().BoolVarP(&BuildAll, "all", "a", false, "Build all overlays (runtime and system)") baseCmd.PersistentFlags().BoolVarP(&BuildAll, "all", "a", false, "Build all overlays (runtime and system)")
baseCmd.PersistentFlags().BoolVarP(&ByNode, "node", "n", false, "Build overlay for a particular node(s)") baseCmd.PersistentFlags().BoolVarP(&ByNode, "node", "n", false, "Build overlay for a particular node(s)")
baseCmd.PersistentFlags().BoolVar(&SetDefault, "setdefault", false, "Set this kernel for the default profile")
} }
// GetRootCommand returns the root cobra.Command for the application. // GetRootCommand returns the root cobra.Command for the application.

View File

@@ -56,6 +56,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "RuntimeOverlay", node.RuntimeOverlay.Source(), node.RuntimeOverlay.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "RuntimeOverlay", node.RuntimeOverlay.Source(), node.RuntimeOverlay.Print())
fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "SystemOverlay", node.SystemOverlay.Source(), node.SystemOverlay.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "SystemOverlay", node.SystemOverlay.Source(), node.SystemOverlay.Print())
fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "Ipxe", node.Ipxe.Source(), node.Ipxe.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "Ipxe", node.Ipxe.Source(), node.Ipxe.Print())
fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "Init", node.Init.Source(), node.Init.Print())
fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "IpmiIpaddr", node.IpmiIpaddr.Source(), node.IpmiIpaddr.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "IpmiIpaddr", node.IpmiIpaddr.Source(), node.IpmiIpaddr.Print())
fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "IpmiNetmask", node.IpmiNetmask.Source(), node.IpmiNetmask.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "IpmiNetmask", node.IpmiNetmask.Source(), node.IpmiNetmask.Print())
fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "IpmiUserName", node.IpmiUserName.Source(), node.IpmiUserName.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "IpmiUserName", node.IpmiUserName.Source(), node.IpmiUserName.Print())

View File

@@ -84,6 +84,16 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
os.Exit(1) os.Exit(1)
} }
} }
if SetInit != "" {
wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting init command to: %s\n", n.Id.Get(), SetInit)
n.Init.Set(SetInit)
err := nodeDB.NodeUpdate(n)
if err != nil {
wwlog.Printf(wwlog.ERROR, "%s\n", err)
os.Exit(1)
}
}
if SetKernel != "" { if SetKernel != "" {
wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting kernel to: %s\n", n.Id.Get(), SetKernel) wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting kernel to: %s\n", n.Id.Get(), SetKernel)

View File

@@ -31,6 +31,7 @@ var (
SetAddProfile []string SetAddProfile []string
SetDelProfile []string SetDelProfile []string
SetForce bool SetForce bool
SetInit string
) )
func init() { func init() {
@@ -39,6 +40,7 @@ func init() {
baseCmd.PersistentFlags().StringVarP(&SetKernel, "kernel", "K", "", "Set Kernel version for nodes") baseCmd.PersistentFlags().StringVarP(&SetKernel, "kernel", "K", "", "Set Kernel version for nodes")
baseCmd.PersistentFlags().StringVarP(&SetClusterName, "cluster", "c", "", "Set the node's cluster group") baseCmd.PersistentFlags().StringVarP(&SetClusterName, "cluster", "c", "", "Set the node's cluster group")
baseCmd.PersistentFlags().StringVarP(&SetIpxe, "ipxe", "P", "", "Set the node's iPXE template name") baseCmd.PersistentFlags().StringVarP(&SetIpxe, "ipxe", "P", "", "Set the node's iPXE template name")
baseCmd.PersistentFlags().StringVarP(&SetInit, "init", "i", "", "Define the init process to boot the container")
baseCmd.PersistentFlags().StringVarP(&SetRuntimeOverlay, "runtime", "R", "", "Set the node's runtime overlay") baseCmd.PersistentFlags().StringVarP(&SetRuntimeOverlay, "runtime", "R", "", "Set the node's runtime overlay")
baseCmd.PersistentFlags().StringVarP(&SetSystemOverlay, "system", "S", "", "Set the node's system overlay") baseCmd.PersistentFlags().StringVarP(&SetSystemOverlay, "system", "S", "", "Set the node's system overlay")
baseCmd.PersistentFlags().StringVar(&SetIpmiIpaddr, "ipmi", "", "Set the node's IPMI IP address") baseCmd.PersistentFlags().StringVar(&SetIpmiIpaddr, "ipmi", "", "Set the node's IPMI IP address")

View File

@@ -40,6 +40,8 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "ContainerName", profile.ContainerName.Print()) fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "ContainerName", profile.ContainerName.Print())
fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "KernelVersion", profile.KernelVersion.Print()) fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "KernelVersion", profile.KernelVersion.Print())
fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "KernelArgs", profile.KernelArgs.Print()) fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "KernelArgs", profile.KernelArgs.Print())
fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "Init", profile.Init.Print())
fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "RuntimeOverlay", profile.RuntimeOverlay.Print()) fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "RuntimeOverlay", profile.RuntimeOverlay.Print())
fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "SystemOverlay", profile.SystemOverlay.Print()) fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "SystemOverlay", profile.SystemOverlay.Print())
fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "Ipxe", profile.Ipxe.Print()) fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "Ipxe", profile.Ipxe.Print())

View File

@@ -98,6 +98,17 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
os.Exit(1) os.Exit(1)
} }
} }
if SetInit != "" {
wwlog.Printf(wwlog.VERBOSE, "Profile: %s, Setting init command to: %s\n", p.Id, SetInit)
p.Init.Set(SetInit)
err := nodeDB.ProfileUpdate(p)
if err != nil {
wwlog.Printf(wwlog.ERROR, "%s\n", err)
os.Exit(1)
}
}
if SetKernel != "" { if SetKernel != "" {
wwlog.Printf(wwlog.VERBOSE, "Profile: %s, Setting Kernel version to: %s\n", p.Id, SetKernel) wwlog.Printf(wwlog.VERBOSE, "Profile: %s, Setting Kernel version to: %s\n", p.Id, SetKernel)

View File

@@ -27,6 +27,7 @@ var (
SetGateway string SetGateway string
SetHwaddr string SetHwaddr string
SetNetDevDel bool SetNetDevDel bool
SetInit string
) )
func init() { func init() {
@@ -35,6 +36,8 @@ func init() {
baseCmd.PersistentFlags().StringVarP(&SetKernel, "kernel", "K", "", "Set Kernel version for nodes") baseCmd.PersistentFlags().StringVarP(&SetKernel, "kernel", "K", "", "Set Kernel version for nodes")
baseCmd.PersistentFlags().StringVarP(&SetClusterName, "cluster", "c", "", "Set the node's cluster group") baseCmd.PersistentFlags().StringVarP(&SetClusterName, "cluster", "c", "", "Set the node's cluster group")
baseCmd.PersistentFlags().StringVarP(&SetIpxe, "ipxe", "P", "", "Set the node's iPXE template name") baseCmd.PersistentFlags().StringVarP(&SetIpxe, "ipxe", "P", "", "Set the node's iPXE template name")
baseCmd.PersistentFlags().StringVarP(&SetInit, "init", "i", "", "Define the init process to boot the container")
baseCmd.PersistentFlags().StringVarP(&SetRuntimeOverlay, "runtime", "R", "", "Set the node's runtime overlay") baseCmd.PersistentFlags().StringVarP(&SetRuntimeOverlay, "runtime", "R", "", "Set the node's runtime overlay")
baseCmd.PersistentFlags().StringVarP(&SetSystemOverlay, "system", "S", "", "Set the node's system overlay") baseCmd.PersistentFlags().StringVarP(&SetSystemOverlay, "system", "S", "", "Set the node's system overlay")
baseCmd.PersistentFlags().StringVar(&SetIpmiNetmask, "ipminetmask", "", "Set the node's IPMI netmask") baseCmd.PersistentFlags().StringVar(&SetIpmiNetmask, "ipminetmask", "", "Set the node's IPMI netmask")

View File

@@ -77,12 +77,7 @@ func ValidSource(name string) bool {
} }
if util.IsDir(fullPath) == false { if util.IsDir(fullPath) == false {
wwlog.Printf(wwlog.VERBOSE, "Location is not a VNFS source directory: %s\n", name) wwlog.Printf(wwlog.WARN, "Location is not a VNFS source directory: %s\n", name)
return false
}
if util.IsFile(path.Join(fullPath, "/sbin/init")) == false {
wwlog.Printf(wwlog.VERBOSE, "VNFS Source does not have a valid /sbin/init: %s\n", name)
return false return false
} }

View File

@@ -45,6 +45,7 @@ func (self *nodeYaml) FindAllNodes() ([]NodeInfo, error) {
n.SystemOverlay.SetDefault("default") n.SystemOverlay.SetDefault("default")
n.RuntimeOverlay.SetDefault("default") n.RuntimeOverlay.SetDefault("default")
n.Ipxe.SetDefault("default") n.Ipxe.SetDefault("default")
n.Init.SetDefault("/sbin/init")
fullname := strings.SplitN(nodename, ".", 2) fullname := strings.SplitN(nodename, ".", 2)
if len(fullname) > 1 { if len(fullname) > 1 {
@@ -64,6 +65,7 @@ func (self *nodeYaml) FindAllNodes() ([]NodeInfo, error) {
n.KernelArgs.Set(node.KernelArgs) n.KernelArgs.Set(node.KernelArgs)
n.ClusterName.Set(node.ClusterName) n.ClusterName.Set(node.ClusterName)
n.Ipxe.Set(node.Ipxe) n.Ipxe.Set(node.Ipxe)
n.Init.Set(node.Init)
n.IpmiIpaddr.Set(node.IpmiIpaddr) n.IpmiIpaddr.Set(node.IpmiIpaddr)
n.IpmiNetmask.Set(node.IpmiNetmask) n.IpmiNetmask.Set(node.IpmiNetmask)
n.IpmiUserName.Set(node.IpmiUserName) n.IpmiUserName.Set(node.IpmiUserName)
@@ -101,6 +103,7 @@ func (self *nodeYaml) FindAllNodes() ([]NodeInfo, error) {
n.KernelVersion.SetAlt(self.NodeProfiles[p].KernelVersion, pstring) n.KernelVersion.SetAlt(self.NodeProfiles[p].KernelVersion, pstring)
n.KernelArgs.SetAlt(self.NodeProfiles[p].KernelArgs, pstring) n.KernelArgs.SetAlt(self.NodeProfiles[p].KernelArgs, pstring)
n.Ipxe.SetAlt(self.NodeProfiles[p].Ipxe, pstring) n.Ipxe.SetAlt(self.NodeProfiles[p].Ipxe, pstring)
n.Init.SetAlt(self.NodeProfiles[p].Init, pstring)
n.IpmiIpaddr.SetAlt(self.NodeProfiles[p].IpmiIpaddr, pstring) n.IpmiIpaddr.SetAlt(self.NodeProfiles[p].IpmiIpaddr, pstring)
n.IpmiNetmask.SetAlt(self.NodeProfiles[p].IpmiNetmask, pstring) n.IpmiNetmask.SetAlt(self.NodeProfiles[p].IpmiNetmask, pstring)
n.IpmiUserName.SetAlt(self.NodeProfiles[p].IpmiUserName, pstring) n.IpmiUserName.SetAlt(self.NodeProfiles[p].IpmiUserName, pstring)
@@ -142,6 +145,7 @@ func (self *nodeYaml) FindAllProfiles() ([]NodeInfo, error) {
p.Comment.Set(profile.Comment) p.Comment.Set(profile.Comment)
p.ContainerName.Set(profile.ContainerName) p.ContainerName.Set(profile.ContainerName)
p.Ipxe.Set(profile.Ipxe) p.Ipxe.Set(profile.Ipxe)
p.Init.Set(profile.Init)
p.KernelVersion.Set(profile.KernelVersion) p.KernelVersion.Set(profile.KernelVersion)
p.KernelArgs.Set(profile.KernelArgs) p.KernelArgs.Set(profile.KernelArgs)
p.IpmiNetmask.Set(profile.IpmiNetmask) p.IpmiNetmask.Set(profile.IpmiNetmask)

View File

@@ -29,6 +29,7 @@ type NodeConf struct {
IpmiNetmask string `yaml:"ipmi netmask,omitempty"` IpmiNetmask string `yaml:"ipmi netmask,omitempty"`
RuntimeOverlay string `yaml:"runtime overlay files,omitempty"` RuntimeOverlay string `yaml:"runtime overlay files,omitempty"`
SystemOverlay string `yaml:"system overlay files,omitempty"` SystemOverlay string `yaml:"system overlay files,omitempty"`
Init string `yaml:"init,omitempty"`
Profiles []string `yaml:"profiles,omitempty"` Profiles []string `yaml:"profiles,omitempty"`
NetDevs map[string]*NetDevs `yaml:"network devices,omitempty"` NetDevs map[string]*NetDevs `yaml:"network devices,omitempty"`
} }
@@ -70,6 +71,7 @@ type NodeInfo struct {
IpmiPassword Entry IpmiPassword Entry
RuntimeOverlay Entry RuntimeOverlay Entry
SystemOverlay Entry SystemOverlay Entry
Init Entry //TODO: Finish adding this...
Profiles []string Profiles []string
GroupProfiles []string GroupProfiles []string
NetDevs map[string]*NetDevEntry NetDevs map[string]*NetDevEntry

View File

@@ -57,6 +57,7 @@ func (self *nodeYaml) NodeUpdate(node NodeInfo) error {
self.Nodes[nodeID].ContainerName = node.ContainerName.GetReal() self.Nodes[nodeID].ContainerName = node.ContainerName.GetReal()
self.Nodes[nodeID].ClusterName = node.ClusterName.GetReal() self.Nodes[nodeID].ClusterName = node.ClusterName.GetReal()
self.Nodes[nodeID].Ipxe = node.Ipxe.GetReal() self.Nodes[nodeID].Ipxe = node.Ipxe.GetReal()
self.Nodes[nodeID].Init = node.Init.GetReal()
self.Nodes[nodeID].KernelVersion = node.KernelVersion.GetReal() self.Nodes[nodeID].KernelVersion = node.KernelVersion.GetReal()
self.Nodes[nodeID].KernelArgs = node.KernelArgs.GetReal() self.Nodes[nodeID].KernelArgs = node.KernelArgs.GetReal()
self.Nodes[nodeID].IpmiIpaddr = node.IpmiIpaddr.GetReal() self.Nodes[nodeID].IpmiIpaddr = node.IpmiIpaddr.GetReal()
@@ -127,6 +128,7 @@ func (self *nodeYaml) ProfileUpdate(profile NodeInfo) error {
self.NodeProfiles[profileID].Comment = profile.Comment.GetReal() self.NodeProfiles[profileID].Comment = profile.Comment.GetReal()
self.NodeProfiles[profileID].ContainerName = profile.ContainerName.GetReal() self.NodeProfiles[profileID].ContainerName = profile.ContainerName.GetReal()
self.NodeProfiles[profileID].Ipxe = profile.Ipxe.GetReal() self.NodeProfiles[profileID].Ipxe = profile.Ipxe.GetReal()
self.NodeProfiles[profileID].Init = profile.Init.GetReal()
self.NodeProfiles[profileID].ClusterName = profile.ClusterName.GetReal() self.NodeProfiles[profileID].ClusterName = profile.ClusterName.GetReal()
self.NodeProfiles[profileID].KernelVersion = profile.KernelVersion.GetReal() self.NodeProfiles[profileID].KernelVersion = profile.KernelVersion.GetReal()
self.NodeProfiles[profileID].KernelArgs = profile.KernelArgs.GetReal() self.NodeProfiles[profileID].KernelArgs = profile.KernelArgs.GetReal()

View File

@@ -22,6 +22,7 @@ type TemplateStruct struct {
Hostname string Hostname string
GroupName string GroupName string
Container string Container string
Init string
IpmiIpaddr string IpmiIpaddr string
IpmiNetmask string IpmiNetmask string
IpmiUserName string IpmiUserName string
@@ -132,6 +133,7 @@ func buildOverlay(nodeList []node.NodeInfo, overlayType string) error {
t.Id = n.Id.Get() t.Id = n.Id.Get()
t.Hostname = n.Id.Get() t.Hostname = n.Id.Get()
t.Container = n.ContainerName.Get() t.Container = n.ContainerName.Get()
t.Init = n.Init.Get()
t.IpmiIpaddr = n.IpmiIpaddr.Get() t.IpmiIpaddr = n.IpmiIpaddr.Get()
t.IpmiNetmask = n.IpmiNetmask.Get() t.IpmiNetmask = n.IpmiNetmask.Get()
t.IpmiUserName = n.IpmiUserName.Get() t.IpmiUserName = n.IpmiUserName.Get()

View File

@@ -33,8 +33,8 @@ mount -t devtmpfs devtmpfs /dev
nohup /warewulf/bin/wwclient >/var/log/wwclient.log 2>&1 </dev/null & nohup /warewulf/bin/wwclient >/var/log/wwclient.log 2>&1 </dev/null &
echo "Calling /sbin/init..." echo "Calling {{$.Init}}..."
echo echo
sleep 2 sleep 2
exec /sbin/init exec {{$.Init}}