Compare commits
3 Commits
7cf4594f34
...
7c3e14f0f1
Author | SHA1 | Date | |
---|---|---|---|
7c3e14f0f1 | |||
a4ff9c1d51 | |||
00fd283987 |
@ -6,7 +6,13 @@ Support iocage jails, so they can coexist.
|
|||||||
Gocage is meant to be a complete jail management tool with network, snapshots, jail cloning support and a web interface. This is the hypothetic future.
|
Gocage is meant to be a complete jail management tool with network, snapshots, jail cloning support and a web interface. This is the hypothetic future.
|
||||||
Gocage can handle multiple datastores, so you can have jails on HDD storage and jails on SSD storage.
|
Gocage can handle multiple datastores, so you can have jails on HDD storage and jails on SSD storage.
|
||||||
|
|
||||||
|
From v0.33b, due to multi ZFS pool support, gocage is no longer 100% compatible with iocage.
|
||||||
|
Zfs datasets now should be specified with the ZFS pool. e.g. :
|
||||||
|
<code>
|
||||||
|
Config.Jail_zfs = 1
|
||||||
|
Config.Jail_zfs_dataset = myzfspool/poudriere
|
||||||
|
Config.Jail_zfs_mountpoint = none
|
||||||
|
</code>
|
||||||
|
|
||||||
List jails
|
List jails
|
||||||
----------
|
----------
|
||||||
|
@ -14,7 +14,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
gVersion = "0.33a"
|
gVersion = "0.33b"
|
||||||
|
|
||||||
// TODO : Get from $jail_zpool/defaults.json
|
// TODO : Get from $jail_zpool/defaults.json
|
||||||
MIN_DYN_DEVFS_RULESET = 1000
|
MIN_DYN_DEVFS_RULESET = 1000
|
||||||
@ -518,10 +518,8 @@ func WriteConfigToDisk(jailName string, changeauto bool, forceWrite bool) {
|
|||||||
fmt.Printf("ERROR marshaling config: %s\n", err.Error())
|
fmt.Printf("ERROR marshaling config: %s\n", err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("DEBUG: Will write config to disk, with content:\n")
|
//fmt.Printf("DEBUG: Will write config to disk, with content:\n")
|
||||||
fmt.Printf(string(marshaled))
|
//fmt.Printf(string(marshaled))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if os.WriteFile(j.ConfigPath, []byte(marshaled), 0644); err != nil {
|
if os.WriteFile(j.ConfigPath, []byte(marshaled), 0644); err != nil {
|
||||||
fmt.Printf("Error writing config file %s: %v\n", j.ConfigPath, err)
|
fmt.Printf("Error writing config file %s: %v\n", j.ConfigPath, err)
|
||||||
|
28
cmd/start.go
28
cmd/start.go
@ -190,24 +190,26 @@ func prepareJailedZfsDatasets(jail *Jail) error {
|
|||||||
}
|
}
|
||||||
for _, d := range strings.Split(jail.Config.Jail_zfs_dataset, " ") {
|
for _, d := range strings.Split(jail.Config.Jail_zfs_dataset, " ") {
|
||||||
// Check if dataset exist, create if necessary
|
// Check if dataset exist, create if necessary
|
||||||
cmd := fmt.Sprintf("zfs get -H creation %s/%s", jail.Zpool, d)
|
// Support jailing datasets on differents pools : dataset should be specified with pool name
|
||||||
|
cmd := fmt.Sprintf("zfs get -H creation %s", d)
|
||||||
out, err := executeCommand(cmd)
|
out, err := executeCommand(cmd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if strings.HasSuffix(out, "dataset does not exist") {
|
if strings.HasSuffix(out, "dataset does not exist") {
|
||||||
cmd = fmt.Sprintf("zfs create -o compression=lz4 -o mountpoint=none %s/%s", jail.Zpool, d)
|
// Support jailing datasets on differents pools : dataset should be specified with pool name
|
||||||
|
cmd = fmt.Sprintf("zfs create -o compression=lz4 -o mountpoint=none %s", d)
|
||||||
_, err = executeCommand(cmd)
|
_, err = executeCommand(cmd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.New(fmt.Sprintf("Error creating dataset %s/%s: %s", jail.Zpool, d, err.Error()))
|
return errors.New(fmt.Sprintf("Error creating dataset %s: %s", d, err.Error()))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return errors.New(fmt.Sprintf("Error getting zfs dataset %s: %s", d, err.Error()))
|
return errors.New(fmt.Sprintf("Error getting zfs dataset %s: %s", d, err.Error()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd = fmt.Sprintf("zfs set jailed=on %s/%s", jail.Zpool, d)
|
cmd = fmt.Sprintf("zfs set jailed=on %s", d)
|
||||||
out, err = executeCommand(cmd)
|
out, err = executeCommand(cmd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.New(fmt.Sprintf("Error executing \"zfs set jailed=on %s/%s\": %s", jail.Zpool, d, err.Error()))
|
return errors.New(fmt.Sprintf("Error executing \"zfs set jailed=on %s\": %s", d, err.Error()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -218,27 +220,27 @@ func jailZfsDatasets(jail *Jail) error {
|
|||||||
if jail.Config.Jail_zfs > 0 {
|
if jail.Config.Jail_zfs > 0 {
|
||||||
for _, d := range strings.Split(jail.Config.Jail_zfs_dataset, " ") {
|
for _, d := range strings.Split(jail.Config.Jail_zfs_dataset, " ") {
|
||||||
// Jail dataset
|
// Jail dataset
|
||||||
cmd := fmt.Sprintf("zfs jail %d %s/%s", jail.JID, jail.Zpool, d)
|
// Support jailing datasets on differents pools : dataset should be specified with pool name
|
||||||
|
cmd := fmt.Sprintf("zfs jail %d %s", jail.JID, d)
|
||||||
out, err := executeCommand(cmd)
|
out, err := executeCommand(cmd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.New(fmt.Sprintf("Error jailling zfs dataset %s: %v: out", d, err, out))
|
return errors.New(fmt.Sprintf("Error jailling zfs dataset %s: %v: out", d, err, out))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mount from inside jail if mountpoint is set
|
// Mount from inside jail if mountpoint is set
|
||||||
cmd = fmt.Sprintf("zfs get -H -o value mountpoint %s/%s", jail.Zpool, d)
|
cmd = fmt.Sprintf("zfs get -H -o value mountpoint %s", d)
|
||||||
out, err = executeCommand(cmd)
|
out, err = executeCommand(cmd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.New(fmt.Sprintf("Error getting zfs dataset %s/%s mountpoint: %v: %s", jail.Zpool, d, err, out))
|
return errors.New(fmt.Sprintf("Error getting zfs dataset %s mountpoint: %v: %s", d, err, out))
|
||||||
}
|
}
|
||||||
if len(out) > 0 && out != "-" && (false == strings.EqualFold(out, "none")) {
|
if len(out) > 0 && out != "-" && (false == strings.EqualFold(out, "none")) {
|
||||||
//cmd = fmt.Sprintf("zfs mount %s/%s", jail.Zpool, d)
|
// Should we "mount -a" ? cmd = fmt.Sprintf("zfs mount -a")
|
||||||
cmd = fmt.Sprintf("zfs mount -a")
|
cmd = fmt.Sprintf("zfs mount %s", d)
|
||||||
out, err = executeCommandInJail(jail, cmd)
|
out, err = executeCommandInJail(jail, cmd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// If already mounted, continue processing
|
// If already mounted, continue processing
|
||||||
if ! strings.HasSuffix(out, "filesystem already mounted\n") {
|
if ! strings.HasSuffix(out, "filesystem already mounted\n") {
|
||||||
//return errors.New(fmt.Sprintf("Error mounting zfs dataset %s/%s: %v: %s", jail.Zpool, d, err, out))
|
return errors.New(fmt.Sprintf("Error mounting zfs dataset %s from inside jail: %v: %s", d, err, out))
|
||||||
return errors.New(fmt.Sprintf("Error executing \"zfs mount -a\" from inside jail: %v: %s", err, out))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1011,7 +1013,7 @@ func generateResolvConf(jail *Jail) error {
|
|||||||
for _, l := range strings.Split(jail.Config.Resolver, ";") {
|
for _, l := range strings.Split(jail.Config.Resolver, ";") {
|
||||||
f.WriteString(fmt.Sprintf("%s\n", l))
|
f.WriteString(fmt.Sprintf("%s\n", l))
|
||||||
}
|
}
|
||||||
} else if jail.Config.Resolver == "none" {
|
} else if jail.Config.Resolver == "none" || jail.Config.Resolver == "/etc/resolv.conf" {
|
||||||
read, err := ioutil.ReadFile("/etc/resolv.conf")
|
read, err := ioutil.ReadFile("/etc/resolv.conf")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error opening /etc/resolv.conf: %v", err)
|
return fmt.Errorf("Error opening /etc/resolv.conf: %v", err)
|
||||||
|
@ -50,10 +50,10 @@ func umountAndUnjailZFS(jail *Jail) error {
|
|||||||
|
|
||||||
for _, zd := range ds {
|
for _, zd := range ds {
|
||||||
// 1. Get dataset and childs
|
// 1. Get dataset and childs
|
||||||
cmd := fmt.Sprintf("zfs list -H -r -o name -S name %s/%s", jail.Zpool, zd)
|
cmd := fmt.Sprintf("zfs list -H -r -o name -S name %s", zd)
|
||||||
out, err := executeCommand(cmd)
|
out, err := executeCommand(cmd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf(fmt.Sprintf("ERROR listing dataset %s/%s\n", jail.Zpool, zd))
|
fmt.Printf(fmt.Sprintf("ERROR listing dataset %s\n", zd))
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
for _, c := range strings.Split(out, "\n") {
|
for _, c := range strings.Split(out, "\n") {
|
||||||
@ -71,10 +71,10 @@ func umountAndUnjailZFS(jail *Jail) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 2. Unjail dataset from the host
|
// 2. Unjail dataset from the host
|
||||||
cmd := fmt.Sprintf("zfs unjail %s %s/%s", jail.InternalName, jail.Zpool, ds[len(ds)-1])
|
cmd := fmt.Sprintf("zfs unjail %s %s", jail.InternalName, ds[len(ds)-1])
|
||||||
_, err := executeCommand(cmd)
|
_, err := executeCommand(cmd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("ERROR unjailing %s/%s: %s\n", jail.Zpool, ds[len(ds)-1], err.Error())
|
fmt.Printf("ERROR unjailing %s: %s\n", ds[len(ds)-1], err.Error())
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user