Merge pull request #2704 from jterry75/remove_tar2vhd
Remove dependency on tar2vhd for LCOW differ
This commit is contained in:
commit
31aa418f84
@ -21,10 +21,11 @@ package lcow
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"io"
|
"io"
|
||||||
"os/exec"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/Microsoft/hcsshim/ext4/tar2ext4"
|
||||||
"github.com/containerd/containerd/archive/compression"
|
"github.com/containerd/containerd/archive/compression"
|
||||||
"github.com/containerd/containerd/content"
|
"github.com/containerd/containerd/content"
|
||||||
"github.com/containerd/containerd/diff"
|
"github.com/containerd/containerd/diff"
|
||||||
@ -40,6 +41,11 @@ import (
|
|||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// maxLcowVhdSizeGB is the max size in GB of any layer
|
||||||
|
maxLcowVhdSizeGB = 128 * 1024 * 1024 * 1024
|
||||||
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
plugin.Register(&plugin.Registration{
|
plugin.Register(&plugin.Registration{
|
||||||
Type: plugin.DiffPlugin,
|
Type: plugin.DiffPlugin,
|
||||||
@ -131,15 +137,22 @@ func (s windowsLcowDiff) Apply(ctx context.Context, desc ocispec.Descriptor, mou
|
|||||||
r: io.TeeReader(rdr, digester.Hash()),
|
r: io.TeeReader(rdr, digester.Hash()),
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd := exec.Command(
|
layerPath := path.Join(layer, "layer.vhd")
|
||||||
"runhcs.exe",
|
outFile, err := os.Create(layerPath)
|
||||||
"tar2vhd",
|
if err != nil {
|
||||||
"--scratchpath", path.Join(layer, "sandbox.vhdx"), // TODO: JTERRY75 when the snapshotter changes this to be scratch.vhdx update it here too.
|
return emptyDesc, err
|
||||||
"--destpath", path.Join(layer, "layer.vhd"))
|
}
|
||||||
|
defer outFile.Close()
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
outFile.Close()
|
||||||
|
os.Remove(layerPath)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
cmd.Stdin = rc
|
err = tar2ext4.Convert(rc, outFile, tar2ext4.ConvertWhiteout, tar2ext4.AppendVhdFooter, tar2ext4.MaximumDiskSize(maxLcowVhdSizeGB))
|
||||||
if bytes, err := cmd.CombinedOutput(); err != nil {
|
if err != nil {
|
||||||
return emptyDesc, errors.Wrapf(err, "failed to exec runhcs.exe tar2vhd: %s", string(bytes))
|
return emptyDesc, errors.Wrapf(err, "failed to convert tar to ext4 vhd")
|
||||||
}
|
}
|
||||||
|
|
||||||
return ocispec.Descriptor{
|
return ocispec.Descriptor{
|
||||||
|
@ -33,7 +33,7 @@ golang.org/x/sync 450f422ab23cf9881c94e2db30cac0eb1b7cf80c
|
|||||||
github.com/BurntSushi/toml a368813c5e648fee92e5f6c30e3944ff9d5e8895
|
github.com/BurntSushi/toml a368813c5e648fee92e5f6c30e3944ff9d5e8895
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus 6b7015e65d366bf3f19b2b2a000a831940f0f7e0
|
github.com/grpc-ecosystem/go-grpc-prometheus 6b7015e65d366bf3f19b2b2a000a831940f0f7e0
|
||||||
github.com/Microsoft/go-winio v0.4.10
|
github.com/Microsoft/go-winio v0.4.10
|
||||||
github.com/Microsoft/hcsshim v0.7.6
|
github.com/Microsoft/hcsshim v0.7.9
|
||||||
google.golang.org/genproto d80a6e20e776b0b17a324d0ba1ab50a39c8e8944
|
google.golang.org/genproto d80a6e20e776b0b17a324d0ba1ab50a39c8e8944
|
||||||
golang.org/x/text 19e51611da83d6be54ddafce4a4af510cb3e9ea4
|
golang.org/x/text 19e51611da83d6be54ddafce4a4af510cb3e9ea4
|
||||||
github.com/containerd/ttrpc 2a805f71863501300ae1976d29f0454ae003e85a
|
github.com/containerd/ttrpc 2a805f71863501300ae1976d29f0454ae003e85a
|
||||||
|
4
vendor/github.com/Microsoft/hcsshim/cmd/go-runhcs/runhcs.go
generated
vendored
4
vendor/github.com/Microsoft/hcsshim/cmd/go-runhcs/runhcs.go
generated
vendored
@ -10,6 +10,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
irunhcs "github.com/Microsoft/hcsshim/internal/runhcs"
|
||||||
"github.com/containerd/go-runc"
|
"github.com/containerd/go-runc"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -24,7 +25,6 @@ const (
|
|||||||
JSON Format = "json"
|
JSON Format = "json"
|
||||||
|
|
||||||
command = "runhcs"
|
command = "runhcs"
|
||||||
safePipePrefix = `\\.\pipe\ProtectedPrefix\Administrators\`
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var bytesBufferPool = sync.Pool{
|
var bytesBufferPool = sync.Pool{
|
||||||
@ -62,7 +62,7 @@ func (r *Runhcs) args() []string {
|
|||||||
out = append(out, "--debug")
|
out = append(out, "--debug")
|
||||||
}
|
}
|
||||||
if r.Log != "" {
|
if r.Log != "" {
|
||||||
if strings.HasPrefix(r.Log, safePipePrefix) {
|
if strings.HasPrefix(r.Log, irunhcs.SafePipePrefix) {
|
||||||
out = append(out, "--log", r.Log)
|
out = append(out, "--log", r.Log)
|
||||||
} else {
|
} else {
|
||||||
abs, err := filepath.Abs(r.Log)
|
abs, err := filepath.Abs(r.Log)
|
||||||
|
5
vendor/github.com/Microsoft/hcsshim/cmd/go-runhcs/runhcs_create.go
generated
vendored
5
vendor/github.com/Microsoft/hcsshim/cmd/go-runhcs/runhcs_create.go
generated
vendored
@ -6,6 +6,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
irunhcs "github.com/Microsoft/hcsshim/internal/runhcs"
|
||||||
runc "github.com/containerd/go-runc"
|
runc "github.com/containerd/go-runc"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -32,7 +33,7 @@ func (opt *CreateOpts) args() ([]string, error) {
|
|||||||
out = append(out, "--pid-file", abs)
|
out = append(out, "--pid-file", abs)
|
||||||
}
|
}
|
||||||
if opt.ShimLog != "" {
|
if opt.ShimLog != "" {
|
||||||
if strings.HasPrefix(opt.ShimLog, safePipePrefix) {
|
if strings.HasPrefix(opt.ShimLog, irunhcs.SafePipePrefix) {
|
||||||
out = append(out, "--shim-log", opt.ShimLog)
|
out = append(out, "--shim-log", opt.ShimLog)
|
||||||
} else {
|
} else {
|
||||||
abs, err := filepath.Abs(opt.ShimLog)
|
abs, err := filepath.Abs(opt.ShimLog)
|
||||||
@ -43,7 +44,7 @@ func (opt *CreateOpts) args() ([]string, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if opt.VMLog != "" {
|
if opt.VMLog != "" {
|
||||||
if strings.HasPrefix(opt.VMLog, safePipePrefix) {
|
if strings.HasPrefix(opt.VMLog, irunhcs.SafePipePrefix) {
|
||||||
out = append(out, "--vm-log", opt.VMLog)
|
out = append(out, "--vm-log", opt.VMLog)
|
||||||
} else {
|
} else {
|
||||||
abs, err := filepath.Abs(opt.VMLog)
|
abs, err := filepath.Abs(opt.VMLog)
|
||||||
|
3
vendor/github.com/Microsoft/hcsshim/cmd/go-runhcs/runhcs_exec.go
generated
vendored
3
vendor/github.com/Microsoft/hcsshim/cmd/go-runhcs/runhcs_exec.go
generated
vendored
@ -6,6 +6,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
irunhcs "github.com/Microsoft/hcsshim/internal/runhcs"
|
||||||
"github.com/containerd/go-runc"
|
"github.com/containerd/go-runc"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -33,7 +34,7 @@ func (opt *ExecOpts) args() ([]string, error) {
|
|||||||
out = append(out, "--pid-file", abs)
|
out = append(out, "--pid-file", abs)
|
||||||
}
|
}
|
||||||
if opt.ShimLog != "" {
|
if opt.ShimLog != "" {
|
||||||
if strings.HasPrefix(opt.ShimLog, safePipePrefix) {
|
if strings.HasPrefix(opt.ShimLog, irunhcs.SafePipePrefix) {
|
||||||
out = append(out, "--shim-log", opt.ShimLog)
|
out = append(out, "--shim-log", opt.ShimLog)
|
||||||
} else {
|
} else {
|
||||||
abs, err := filepath.Abs(opt.ShimLog)
|
abs, err := filepath.Abs(opt.ShimLog)
|
||||||
|
1263
vendor/github.com/Microsoft/hcsshim/ext4/internal/compactext4/compact.go
generated
vendored
Normal file
1263
vendor/github.com/Microsoft/hcsshim/ext4/internal/compactext4/compact.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
411
vendor/github.com/Microsoft/hcsshim/ext4/internal/format/format.go
generated
vendored
Normal file
411
vendor/github.com/Microsoft/hcsshim/ext4/internal/format/format.go
generated
vendored
Normal file
@ -0,0 +1,411 @@
|
|||||||
|
package format
|
||||||
|
|
||||||
|
type SuperBlock struct {
|
||||||
|
InodesCount uint32
|
||||||
|
BlocksCountLow uint32
|
||||||
|
RootBlocksCountLow uint32
|
||||||
|
FreeBlocksCountLow uint32
|
||||||
|
FreeInodesCount uint32
|
||||||
|
FirstDataBlock uint32
|
||||||
|
LogBlockSize uint32
|
||||||
|
LogClusterSize uint32
|
||||||
|
BlocksPerGroup uint32
|
||||||
|
ClustersPerGroup uint32
|
||||||
|
InodesPerGroup uint32
|
||||||
|
Mtime uint32
|
||||||
|
Wtime uint32
|
||||||
|
MountCount uint16
|
||||||
|
MaxMountCount uint16
|
||||||
|
Magic uint16
|
||||||
|
State uint16
|
||||||
|
Errors uint16
|
||||||
|
MinorRevisionLevel uint16
|
||||||
|
LastCheck uint32
|
||||||
|
CheckInterval uint32
|
||||||
|
CreatorOS uint32
|
||||||
|
RevisionLevel uint32
|
||||||
|
DefaultReservedUid uint16
|
||||||
|
DefaultReservedGid uint16
|
||||||
|
FirstInode uint32
|
||||||
|
InodeSize uint16
|
||||||
|
BlockGroupNr uint16
|
||||||
|
FeatureCompat CompatFeature
|
||||||
|
FeatureIncompat IncompatFeature
|
||||||
|
FeatureRoCompat RoCompatFeature
|
||||||
|
UUID [16]uint8
|
||||||
|
VolumeName [16]byte
|
||||||
|
LastMounted [64]byte
|
||||||
|
AlgorithmUsageBitmap uint32
|
||||||
|
PreallocBlocks uint8
|
||||||
|
PreallocDirBlocks uint8
|
||||||
|
ReservedGdtBlocks uint16
|
||||||
|
JournalUUID [16]uint8
|
||||||
|
JournalInum uint32
|
||||||
|
JournalDev uint32
|
||||||
|
LastOrphan uint32
|
||||||
|
HashSeed [4]uint32
|
||||||
|
DefHashVersion uint8
|
||||||
|
JournalBackupType uint8
|
||||||
|
DescSize uint16
|
||||||
|
DefaultMountOpts uint32
|
||||||
|
FirstMetaBg uint32
|
||||||
|
MkfsTime uint32
|
||||||
|
JournalBlocks [17]uint32
|
||||||
|
BlocksCountHigh uint32
|
||||||
|
RBlocksCountHigh uint32
|
||||||
|
FreeBlocksCountHigh uint32
|
||||||
|
MinExtraIsize uint16
|
||||||
|
WantExtraIsize uint16
|
||||||
|
Flags uint32
|
||||||
|
RaidStride uint16
|
||||||
|
MmpInterval uint16
|
||||||
|
MmpBlock uint64
|
||||||
|
RaidStripeWidth uint32
|
||||||
|
LogGroupsPerFlex uint8
|
||||||
|
ChecksumType uint8
|
||||||
|
ReservedPad uint16
|
||||||
|
KbytesWritten uint64
|
||||||
|
SnapshotInum uint32
|
||||||
|
SnapshotID uint32
|
||||||
|
SnapshotRBlocksCount uint64
|
||||||
|
SnapshotList uint32
|
||||||
|
ErrorCount uint32
|
||||||
|
FirstErrorTime uint32
|
||||||
|
FirstErrorInode uint32
|
||||||
|
FirstErrorBlock uint64
|
||||||
|
FirstErrorFunc [32]uint8
|
||||||
|
FirstErrorLine uint32
|
||||||
|
LastErrorTime uint32
|
||||||
|
LastErrorInode uint32
|
||||||
|
LastErrorLine uint32
|
||||||
|
LastErrorBlock uint64
|
||||||
|
LastErrorFunc [32]uint8
|
||||||
|
MountOpts [64]uint8
|
||||||
|
UserQuotaInum uint32
|
||||||
|
GroupQuotaInum uint32
|
||||||
|
OverheadBlocks uint32
|
||||||
|
BackupBgs [2]uint32
|
||||||
|
EncryptAlgos [4]uint8
|
||||||
|
EncryptPwSalt [16]uint8
|
||||||
|
LpfInode uint32
|
||||||
|
ProjectQuotaInum uint32
|
||||||
|
ChecksumSeed uint32
|
||||||
|
WtimeHigh uint8
|
||||||
|
MtimeHigh uint8
|
||||||
|
MkfsTimeHigh uint8
|
||||||
|
LastcheckHigh uint8
|
||||||
|
FirstErrorTimeHigh uint8
|
||||||
|
LastErrorTimeHigh uint8
|
||||||
|
Pad [2]uint8
|
||||||
|
Reserved [96]uint32
|
||||||
|
Checksum uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
const SuperBlockMagic uint16 = 0xef53
|
||||||
|
|
||||||
|
type CompatFeature uint32
|
||||||
|
type IncompatFeature uint32
|
||||||
|
type RoCompatFeature uint32
|
||||||
|
|
||||||
|
const (
|
||||||
|
CompatDirPrealloc CompatFeature = 0x1
|
||||||
|
CompatImagicInodes CompatFeature = 0x2
|
||||||
|
CompatHasJournal CompatFeature = 0x4
|
||||||
|
CompatExtAttr CompatFeature = 0x8
|
||||||
|
CompatResizeInode CompatFeature = 0x10
|
||||||
|
CompatDirIndex CompatFeature = 0x20
|
||||||
|
CompatLazyBg CompatFeature = 0x40
|
||||||
|
CompatExcludeInode CompatFeature = 0x80
|
||||||
|
CompatExcludeBitmap CompatFeature = 0x100
|
||||||
|
CompatSparseSuper2 CompatFeature = 0x200
|
||||||
|
|
||||||
|
IncompatCompression IncompatFeature = 0x1
|
||||||
|
IncompatFiletype IncompatFeature = 0x2
|
||||||
|
IncompatRecover IncompatFeature = 0x4
|
||||||
|
IncompatJournalDev IncompatFeature = 0x8
|
||||||
|
IncompatMetaBg IncompatFeature = 0x10
|
||||||
|
IncompatExtents IncompatFeature = 0x40
|
||||||
|
Incompat_64Bit IncompatFeature = 0x80
|
||||||
|
IncompatMmp IncompatFeature = 0x100
|
||||||
|
IncompatFlexBg IncompatFeature = 0x200
|
||||||
|
IncompatEaInode IncompatFeature = 0x400
|
||||||
|
IncompatDirdata IncompatFeature = 0x1000
|
||||||
|
IncompatCsumSeed IncompatFeature = 0x2000
|
||||||
|
IncompatLargedir IncompatFeature = 0x4000
|
||||||
|
IncompatInlineData IncompatFeature = 0x8000
|
||||||
|
IncompatEncrypt IncompatFeature = 0x10000
|
||||||
|
|
||||||
|
RoCompatSparseSuper RoCompatFeature = 0x1
|
||||||
|
RoCompatLargeFile RoCompatFeature = 0x2
|
||||||
|
RoCompatBtreeDir RoCompatFeature = 0x4
|
||||||
|
RoCompatHugeFile RoCompatFeature = 0x8
|
||||||
|
RoCompatGdtCsum RoCompatFeature = 0x10
|
||||||
|
RoCompatDirNlink RoCompatFeature = 0x20
|
||||||
|
RoCompatExtraIsize RoCompatFeature = 0x40
|
||||||
|
RoCompatHasSnapshot RoCompatFeature = 0x80
|
||||||
|
RoCompatQuota RoCompatFeature = 0x100
|
||||||
|
RoCompatBigalloc RoCompatFeature = 0x200
|
||||||
|
RoCompatMetadataCsum RoCompatFeature = 0x400
|
||||||
|
RoCompatReplica RoCompatFeature = 0x800
|
||||||
|
RoCompatReadonly RoCompatFeature = 0x1000
|
||||||
|
RoCompatProject RoCompatFeature = 0x2000
|
||||||
|
)
|
||||||
|
|
||||||
|
type BlockGroupFlag uint16
|
||||||
|
|
||||||
|
const (
|
||||||
|
BlockGroupInodeUninit BlockGroupFlag = 0x1
|
||||||
|
BlockGroupBlockUninit BlockGroupFlag = 0x2
|
||||||
|
BlockGroupInodeZeroed BlockGroupFlag = 0x4
|
||||||
|
)
|
||||||
|
|
||||||
|
type GroupDescriptor struct {
|
||||||
|
BlockBitmapLow uint32
|
||||||
|
InodeBitmapLow uint32
|
||||||
|
InodeTableLow uint32
|
||||||
|
FreeBlocksCountLow uint16
|
||||||
|
FreeInodesCountLow uint16
|
||||||
|
UsedDirsCountLow uint16
|
||||||
|
Flags BlockGroupFlag
|
||||||
|
ExcludeBitmapLow uint32
|
||||||
|
BlockBitmapCsumLow uint16
|
||||||
|
InodeBitmapCsumLow uint16
|
||||||
|
ItableUnusedLow uint16
|
||||||
|
Checksum uint16
|
||||||
|
}
|
||||||
|
|
||||||
|
type GroupDescriptor64 struct {
|
||||||
|
GroupDescriptor
|
||||||
|
BlockBitmapHigh uint32
|
||||||
|
InodeBitmapHigh uint32
|
||||||
|
InodeTableHigh uint32
|
||||||
|
FreeBlocksCountHigh uint16
|
||||||
|
FreeInodesCountHigh uint16
|
||||||
|
UsedDirsCountHigh uint16
|
||||||
|
ItableUnusedHigh uint16
|
||||||
|
ExcludeBitmapHigh uint32
|
||||||
|
BlockBitmapCsumHigh uint16
|
||||||
|
InodeBitmapCsumHigh uint16
|
||||||
|
Reserved uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
S_IXOTH = 0x1
|
||||||
|
S_IWOTH = 0x2
|
||||||
|
S_IROTH = 0x4
|
||||||
|
S_IXGRP = 0x8
|
||||||
|
S_IWGRP = 0x10
|
||||||
|
S_IRGRP = 0x20
|
||||||
|
S_IXUSR = 0x40
|
||||||
|
S_IWUSR = 0x80
|
||||||
|
S_IRUSR = 0x100
|
||||||
|
S_ISVTX = 0x200
|
||||||
|
S_ISGID = 0x400
|
||||||
|
S_ISUID = 0x800
|
||||||
|
S_IFIFO = 0x1000
|
||||||
|
S_IFCHR = 0x2000
|
||||||
|
S_IFDIR = 0x4000
|
||||||
|
S_IFBLK = 0x6000
|
||||||
|
S_IFREG = 0x8000
|
||||||
|
S_IFLNK = 0xA000
|
||||||
|
S_IFSOCK = 0xC000
|
||||||
|
|
||||||
|
TypeMask uint16 = 0xF000
|
||||||
|
)
|
||||||
|
|
||||||
|
type InodeNumber uint32
|
||||||
|
|
||||||
|
const (
|
||||||
|
InodeRoot = 2
|
||||||
|
)
|
||||||
|
|
||||||
|
type Inode struct {
|
||||||
|
Mode uint16
|
||||||
|
Uid uint16
|
||||||
|
SizeLow uint32
|
||||||
|
Atime uint32
|
||||||
|
Ctime uint32
|
||||||
|
Mtime uint32
|
||||||
|
Dtime uint32
|
||||||
|
Gid uint16
|
||||||
|
LinksCount uint16
|
||||||
|
BlocksLow uint32
|
||||||
|
Flags InodeFlag
|
||||||
|
Version uint32
|
||||||
|
Block [60]byte
|
||||||
|
Generation uint32
|
||||||
|
XattrBlockLow uint32
|
||||||
|
SizeHigh uint32
|
||||||
|
ObsoleteFragmentAddr uint32
|
||||||
|
BlocksHigh uint16
|
||||||
|
XattrBlockHigh uint16
|
||||||
|
UidHigh uint16
|
||||||
|
GidHigh uint16
|
||||||
|
ChecksumLow uint16
|
||||||
|
Reserved uint16
|
||||||
|
ExtraIsize uint16
|
||||||
|
ChecksumHigh uint16
|
||||||
|
CtimeExtra uint32
|
||||||
|
MtimeExtra uint32
|
||||||
|
AtimeExtra uint32
|
||||||
|
Crtime uint32
|
||||||
|
CrtimeExtra uint32
|
||||||
|
VersionHigh uint32
|
||||||
|
Projid uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
type InodeFlag uint32
|
||||||
|
|
||||||
|
const (
|
||||||
|
InodeFlagSecRm InodeFlag = 0x1
|
||||||
|
InodeFlagUnRm InodeFlag = 0x2
|
||||||
|
InodeFlagCompressed InodeFlag = 0x4
|
||||||
|
InodeFlagSync InodeFlag = 0x8
|
||||||
|
InodeFlagImmutable InodeFlag = 0x10
|
||||||
|
InodeFlagAppend InodeFlag = 0x20
|
||||||
|
InodeFlagNoDump InodeFlag = 0x40
|
||||||
|
InodeFlagNoAtime InodeFlag = 0x80
|
||||||
|
InodeFlagDirtyCompressed InodeFlag = 0x100
|
||||||
|
InodeFlagCompressedClusters InodeFlag = 0x200
|
||||||
|
InodeFlagNoCompress InodeFlag = 0x400
|
||||||
|
InodeFlagEncrypted InodeFlag = 0x800
|
||||||
|
InodeFlagHashedIndex InodeFlag = 0x1000
|
||||||
|
InodeFlagMagic InodeFlag = 0x2000
|
||||||
|
InodeFlagJournalData InodeFlag = 0x4000
|
||||||
|
InodeFlagNoTail InodeFlag = 0x8000
|
||||||
|
InodeFlagDirSync InodeFlag = 0x10000
|
||||||
|
InodeFlagTopDir InodeFlag = 0x20000
|
||||||
|
InodeFlagHugeFile InodeFlag = 0x40000
|
||||||
|
InodeFlagExtents InodeFlag = 0x80000
|
||||||
|
InodeFlagEaInode InodeFlag = 0x200000
|
||||||
|
InodeFlagEOFBlocks InodeFlag = 0x400000
|
||||||
|
InodeFlagSnapfile InodeFlag = 0x01000000
|
||||||
|
InodeFlagSnapfileDeleted InodeFlag = 0x04000000
|
||||||
|
InodeFlagSnapfileShrunk InodeFlag = 0x08000000
|
||||||
|
InodeFlagInlineData InodeFlag = 0x10000000
|
||||||
|
InodeFlagProjectIDInherit InodeFlag = 0x20000000
|
||||||
|
InodeFlagReserved InodeFlag = 0x80000000
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
MaxLinks = 65000
|
||||||
|
)
|
||||||
|
|
||||||
|
type ExtentHeader struct {
|
||||||
|
Magic uint16
|
||||||
|
Entries uint16
|
||||||
|
Max uint16
|
||||||
|
Depth uint16
|
||||||
|
Generation uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
const ExtentHeaderMagic uint16 = 0xf30a
|
||||||
|
|
||||||
|
type ExtentIndexNode struct {
|
||||||
|
Block uint32
|
||||||
|
LeafLow uint32
|
||||||
|
LeafHigh uint16
|
||||||
|
Unused uint16
|
||||||
|
}
|
||||||
|
|
||||||
|
type ExtentLeafNode struct {
|
||||||
|
Block uint32
|
||||||
|
Length uint16
|
||||||
|
StartHigh uint16
|
||||||
|
StartLow uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
type ExtentTail struct {
|
||||||
|
Checksum uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
type DirectoryEntry struct {
|
||||||
|
Inode InodeNumber
|
||||||
|
RecordLength uint16
|
||||||
|
NameLength uint8
|
||||||
|
FileType FileType
|
||||||
|
//Name []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
type FileType uint8
|
||||||
|
|
||||||
|
const (
|
||||||
|
FileTypeUnknown FileType = 0x0
|
||||||
|
FileTypeRegular FileType = 0x1
|
||||||
|
FileTypeDirectory FileType = 0x2
|
||||||
|
FileTypeCharacter FileType = 0x3
|
||||||
|
FileTypeBlock FileType = 0x4
|
||||||
|
FileTypeFIFO FileType = 0x5
|
||||||
|
FileTypeSocket FileType = 0x6
|
||||||
|
FileTypeSymbolicLink FileType = 0x7
|
||||||
|
)
|
||||||
|
|
||||||
|
type DirectoryEntryTail struct {
|
||||||
|
ReservedZero1 uint32
|
||||||
|
RecordLength uint16
|
||||||
|
ReservedZero2 uint8
|
||||||
|
FileType uint8
|
||||||
|
Checksum uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
type DirectoryTreeRoot struct {
|
||||||
|
Dot DirectoryEntry
|
||||||
|
DotName [4]byte
|
||||||
|
DotDot DirectoryEntry
|
||||||
|
DotDotName [4]byte
|
||||||
|
ReservedZero uint32
|
||||||
|
HashVersion uint8
|
||||||
|
InfoLength uint8
|
||||||
|
IndirectLevels uint8
|
||||||
|
UnusedFlags uint8
|
||||||
|
Limit uint16
|
||||||
|
Count uint16
|
||||||
|
Block uint32
|
||||||
|
//Entries []DirectoryTreeEntry
|
||||||
|
}
|
||||||
|
|
||||||
|
type DirectoryTreeNode struct {
|
||||||
|
FakeInode uint32
|
||||||
|
FakeRecordLength uint16
|
||||||
|
NameLength uint8
|
||||||
|
FileType uint8
|
||||||
|
Limit uint16
|
||||||
|
Count uint16
|
||||||
|
Block uint32
|
||||||
|
//Entries []DirectoryTreeEntry
|
||||||
|
}
|
||||||
|
|
||||||
|
type DirectoryTreeEntry struct {
|
||||||
|
Hash uint32
|
||||||
|
Block uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
type DirectoryTreeTail struct {
|
||||||
|
Reserved uint32
|
||||||
|
Checksum uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
type XAttrInodeBodyHeader struct {
|
||||||
|
Magic uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
type XAttrHeader struct {
|
||||||
|
Magic uint32
|
||||||
|
ReferenceCount uint32
|
||||||
|
Blocks uint32
|
||||||
|
Hash uint32
|
||||||
|
Checksum uint32
|
||||||
|
Reserved [3]uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
const XAttrHeaderMagic uint32 = 0xea020000
|
||||||
|
|
||||||
|
type XAttrEntry struct {
|
||||||
|
NameLength uint8
|
||||||
|
NameIndex uint8
|
||||||
|
ValueOffset uint16
|
||||||
|
ValueInum uint32
|
||||||
|
ValueSize uint32
|
||||||
|
Hash uint32
|
||||||
|
//Name []byte
|
||||||
|
}
|
174
vendor/github.com/Microsoft/hcsshim/ext4/tar2ext4/tar2ext4.go
generated
vendored
Normal file
174
vendor/github.com/Microsoft/hcsshim/ext4/tar2ext4/tar2ext4.go
generated
vendored
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
package tar2ext4
|
||||||
|
|
||||||
|
import (
|
||||||
|
"archive/tar"
|
||||||
|
"bufio"
|
||||||
|
"encoding/binary"
|
||||||
|
"io"
|
||||||
|
"path"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/Microsoft/hcsshim/ext4/internal/compactext4"
|
||||||
|
)
|
||||||
|
|
||||||
|
type params struct {
|
||||||
|
convertWhiteout bool
|
||||||
|
appendVhdFooter bool
|
||||||
|
ext4opts []compactext4.Option
|
||||||
|
}
|
||||||
|
|
||||||
|
// Option is the type for optional parameters to Convert.
|
||||||
|
type Option func(*params)
|
||||||
|
|
||||||
|
// ConvertWhiteout instructs the converter to convert OCI-style whiteouts
|
||||||
|
// (beginning with .wh.) to overlay-style whiteouts.
|
||||||
|
func ConvertWhiteout(p *params) {
|
||||||
|
p.convertWhiteout = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppendVhdFooter instructs the converter to add a fixed VHD footer to the
|
||||||
|
// file.
|
||||||
|
func AppendVhdFooter(p *params) {
|
||||||
|
p.appendVhdFooter = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// InlineData instructs the converter to write small files into the inode
|
||||||
|
// structures directly. This creates smaller images but currently is not
|
||||||
|
// compatible with DAX.
|
||||||
|
func InlineData(p *params) {
|
||||||
|
p.ext4opts = append(p.ext4opts, compactext4.InlineData)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MaximumDiskSize instructs the writer to limit the disk size to the specified
|
||||||
|
// value. This also reserves enough metadata space for the specified disk size.
|
||||||
|
// If not provided, then 16GB is the default.
|
||||||
|
func MaximumDiskSize(size int64) Option {
|
||||||
|
return func(p *params) {
|
||||||
|
p.ext4opts = append(p.ext4opts, compactext4.MaximumDiskSize(size))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
whiteoutPrefix = ".wh."
|
||||||
|
opaqueWhiteout = ".wh..wh..opq"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Convert writes a compact ext4 file system image that contains the files in the
|
||||||
|
// input tar stream.
|
||||||
|
func Convert(r io.Reader, w io.ReadWriteSeeker, options ...Option) error {
|
||||||
|
var p params
|
||||||
|
for _, opt := range options {
|
||||||
|
opt(&p)
|
||||||
|
}
|
||||||
|
t := tar.NewReader(bufio.NewReader(r))
|
||||||
|
fs := compactext4.NewWriter(w, p.ext4opts...)
|
||||||
|
for {
|
||||||
|
hdr, err := t.Next()
|
||||||
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if p.convertWhiteout {
|
||||||
|
dir, name := path.Split(hdr.Name)
|
||||||
|
if strings.HasPrefix(name, whiteoutPrefix) {
|
||||||
|
if name == opaqueWhiteout {
|
||||||
|
// Update the directory with the appropriate xattr.
|
||||||
|
f, err := fs.Stat(dir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
f.Xattrs["trusted.overlay.opaque"] = []byte("y")
|
||||||
|
err = fs.Create(dir, f)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Create an overlay-style whiteout.
|
||||||
|
f := &compactext4.File{
|
||||||
|
Mode: compactext4.S_IFCHR,
|
||||||
|
Devmajor: 0,
|
||||||
|
Devminor: 0,
|
||||||
|
}
|
||||||
|
err = fs.Create(path.Join(dir, name[len(whiteoutPrefix):]), f)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if hdr.Typeflag == tar.TypeLink {
|
||||||
|
err = fs.Link(hdr.Linkname, hdr.Name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
f := &compactext4.File{
|
||||||
|
Mode: uint16(hdr.Mode),
|
||||||
|
Atime: hdr.AccessTime,
|
||||||
|
Mtime: hdr.ModTime,
|
||||||
|
Ctime: hdr.ChangeTime,
|
||||||
|
Crtime: hdr.ModTime,
|
||||||
|
Size: hdr.Size,
|
||||||
|
Uid: uint32(hdr.Uid),
|
||||||
|
Gid: uint32(hdr.Gid),
|
||||||
|
Linkname: hdr.Linkname,
|
||||||
|
Devmajor: uint32(hdr.Devmajor),
|
||||||
|
Devminor: uint32(hdr.Devminor),
|
||||||
|
Xattrs: make(map[string][]byte),
|
||||||
|
}
|
||||||
|
for key, value := range hdr.PAXRecords {
|
||||||
|
const xattrPrefix = "SCHILY.xattr."
|
||||||
|
if strings.HasPrefix(key, xattrPrefix) {
|
||||||
|
f.Xattrs[key[len(xattrPrefix):]] = []byte(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var typ uint16
|
||||||
|
switch hdr.Typeflag {
|
||||||
|
case tar.TypeReg, tar.TypeRegA:
|
||||||
|
typ = compactext4.S_IFREG
|
||||||
|
case tar.TypeSymlink:
|
||||||
|
typ = compactext4.S_IFLNK
|
||||||
|
case tar.TypeChar:
|
||||||
|
typ = compactext4.S_IFCHR
|
||||||
|
case tar.TypeBlock:
|
||||||
|
typ = compactext4.S_IFBLK
|
||||||
|
case tar.TypeDir:
|
||||||
|
typ = compactext4.S_IFDIR
|
||||||
|
case tar.TypeFifo:
|
||||||
|
typ = compactext4.S_IFIFO
|
||||||
|
}
|
||||||
|
f.Mode &= ^compactext4.TypeMask
|
||||||
|
f.Mode |= typ
|
||||||
|
err = fs.Create(hdr.Name, f)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = io.Copy(fs, t)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err := fs.Close()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if p.appendVhdFooter {
|
||||||
|
size, err := w.Seek(0, io.SeekEnd)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = binary.Write(w, binary.BigEndian, makeFixedVHDFooter(size))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
76
vendor/github.com/Microsoft/hcsshim/ext4/tar2ext4/vhdfooter.go
generated
vendored
Normal file
76
vendor/github.com/Microsoft/hcsshim/ext4/tar2ext4/vhdfooter.go
generated
vendored
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
package tar2ext4
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"crypto/rand"
|
||||||
|
"encoding/binary"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Constants for the VHD footer
|
||||||
|
const (
|
||||||
|
cookieMagic = "conectix"
|
||||||
|
featureMask = 0x2
|
||||||
|
fileFormatVersionMagic = 0x00010000
|
||||||
|
fixedDataOffset = -1
|
||||||
|
creatorVersionMagic = 0x000a0000
|
||||||
|
diskTypeFixed = 2
|
||||||
|
)
|
||||||
|
|
||||||
|
type vhdFooter struct {
|
||||||
|
Cookie [8]byte
|
||||||
|
Features uint32
|
||||||
|
FileFormatVersion uint32
|
||||||
|
DataOffset int64
|
||||||
|
TimeStamp uint32
|
||||||
|
CreatorApplication [4]byte
|
||||||
|
CreatorVersion uint32
|
||||||
|
CreatorHostOS [4]byte
|
||||||
|
OriginalSize int64
|
||||||
|
CurrentSize int64
|
||||||
|
DiskGeometry uint32
|
||||||
|
DiskType uint32
|
||||||
|
Checksum uint32
|
||||||
|
UniqueID [16]uint8
|
||||||
|
SavedState uint8
|
||||||
|
Reserved [427]uint8
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeFixedVHDFooter(size int64) *vhdFooter {
|
||||||
|
footer := &vhdFooter{
|
||||||
|
Features: featureMask,
|
||||||
|
FileFormatVersion: fileFormatVersionMagic,
|
||||||
|
DataOffset: fixedDataOffset,
|
||||||
|
CreatorVersion: creatorVersionMagic,
|
||||||
|
OriginalSize: size,
|
||||||
|
CurrentSize: size,
|
||||||
|
DiskType: diskTypeFixed,
|
||||||
|
UniqueID: generateUUID(),
|
||||||
|
}
|
||||||
|
copy(footer.Cookie[:], cookieMagic)
|
||||||
|
footer.Checksum = calculateCheckSum(footer)
|
||||||
|
return footer
|
||||||
|
}
|
||||||
|
|
||||||
|
func calculateCheckSum(footer *vhdFooter) uint32 {
|
||||||
|
oldchk := footer.Checksum
|
||||||
|
footer.Checksum = 0
|
||||||
|
|
||||||
|
buf := &bytes.Buffer{}
|
||||||
|
binary.Write(buf, binary.BigEndian, footer)
|
||||||
|
|
||||||
|
var chk uint32
|
||||||
|
bufBytes := buf.Bytes()
|
||||||
|
for i := 0; i < len(bufBytes); i++ {
|
||||||
|
chk += uint32(bufBytes[i])
|
||||||
|
}
|
||||||
|
footer.Checksum = oldchk
|
||||||
|
return uint32(^chk)
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateUUID() [16]byte {
|
||||||
|
res := [16]byte{}
|
||||||
|
if _, err := rand.Read(res[:]); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
47
vendor/github.com/Microsoft/hcsshim/internal/runhcs/container.go
generated
vendored
47
vendor/github.com/Microsoft/hcsshim/internal/runhcs/container.go
generated
vendored
@ -1,6 +1,17 @@
|
|||||||
package runhcs
|
package runhcs
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"bytes"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/Microsoft/hcsshim/internal/guid"
|
||||||
|
)
|
||||||
|
|
||||||
// ContainerState represents the platform agnostic pieces relating to a
|
// ContainerState represents the platform agnostic pieces relating to a
|
||||||
// running container's status and state
|
// running container's status and state
|
||||||
@ -24,3 +35,37 @@ type ContainerState struct {
|
|||||||
// The owner of the state directory (the owner of the container).
|
// The owner of the state directory (the owner of the container).
|
||||||
Owner string `json:"owner"`
|
Owner string `json:"owner"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetErrorFromPipe returns reads from `pipe` and verifies if the operation
|
||||||
|
// returned success or error. If error converts that to an error and returns. If
|
||||||
|
// `p` is not nill will issue a `Kill` and `Wait` for exit.
|
||||||
|
func GetErrorFromPipe(pipe io.Reader, p *os.Process) error {
|
||||||
|
serr, err := ioutil.ReadAll(pipe)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if bytes.Equal(serr, ShimSuccess) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
extra := ""
|
||||||
|
if p != nil {
|
||||||
|
p.Kill()
|
||||||
|
state, err := p.Wait()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
extra = fmt.Sprintf(", exit code %d", state.Sys().(syscall.WaitStatus).ExitCode)
|
||||||
|
}
|
||||||
|
if len(serr) == 0 {
|
||||||
|
return fmt.Errorf("unknown shim failure%s", extra)
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors.New(string(serr))
|
||||||
|
}
|
||||||
|
|
||||||
|
// VMPipePath returns the named pipe path for the vm shim.
|
||||||
|
func VMPipePath(hostUniqueID guid.GUID) string {
|
||||||
|
return SafePipePath("runhcs-vm-" + hostUniqueID.String())
|
||||||
|
}
|
||||||
|
16
vendor/github.com/Microsoft/hcsshim/internal/runhcs/util.go
generated
vendored
Normal file
16
vendor/github.com/Microsoft/hcsshim/internal/runhcs/util.go
generated
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package runhcs
|
||||||
|
|
||||||
|
import "net/url"
|
||||||
|
|
||||||
|
const (
|
||||||
|
SafePipePrefix = `\\.\pipe\ProtectedPrefix\Administrators\`
|
||||||
|
)
|
||||||
|
|
||||||
|
// ShimSuccess is the byte stream returned on a successful operation.
|
||||||
|
var ShimSuccess = []byte{0, 'O', 'K', 0}
|
||||||
|
|
||||||
|
func SafePipePath(name string) string {
|
||||||
|
// Use a pipe in the Administrators protected prefixed to prevent malicious
|
||||||
|
// squatting.
|
||||||
|
return SafePipePrefix + url.PathEscape(name)
|
||||||
|
}
|
43
vendor/github.com/Microsoft/hcsshim/internal/runhcs/vm.go
generated
vendored
Normal file
43
vendor/github.com/Microsoft/hcsshim/internal/runhcs/vm.go
generated
vendored
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
package runhcs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
|
||||||
|
"github.com/Microsoft/go-winio"
|
||||||
|
)
|
||||||
|
|
||||||
|
// VMRequestOp is an operation that can be issued to a VM shim.
|
||||||
|
type VMRequestOp string
|
||||||
|
|
||||||
|
const (
|
||||||
|
// OpCreateContainer is a create container request.
|
||||||
|
OpCreateContainer VMRequestOp = "create"
|
||||||
|
// OpSyncNamespace is a `cni.NamespaceTypeGuest` sync request with the UVM.
|
||||||
|
OpSyncNamespace VMRequestOp = "sync"
|
||||||
|
// OpUnmountContainer is a container unmount request.
|
||||||
|
OpUnmountContainer VMRequestOp = "unmount"
|
||||||
|
// OpUnmountContainerDiskOnly is a container unmount disk request.
|
||||||
|
OpUnmountContainerDiskOnly VMRequestOp = "unmount-disk"
|
||||||
|
)
|
||||||
|
|
||||||
|
// VMRequest is an operation request that is issued to a VM shim.
|
||||||
|
type VMRequest struct {
|
||||||
|
ID string
|
||||||
|
Op VMRequestOp
|
||||||
|
}
|
||||||
|
|
||||||
|
// IssueVMRequest issues a request to a shim at the given pipe.
|
||||||
|
func IssueVMRequest(pipepath string, req *VMRequest) error {
|
||||||
|
pipe, err := winio.DialPipe(pipepath, nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer pipe.Close()
|
||||||
|
if err := json.NewEncoder(pipe).Encode(req); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := GetErrorFromPipe(pipe, nil); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
6
vendor/github.com/Microsoft/hcsshim/version.go
generated
vendored
6
vendor/github.com/Microsoft/hcsshim/version.go
generated
vendored
@ -1,6 +0,0 @@
|
|||||||
package hcsshim
|
|
||||||
|
|
||||||
// IsTP4 returns whether the currently running Windows build is at least TP4.
|
|
||||||
func IsTP4() bool {
|
|
||||||
return false
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user