mirror of
https://github.com/linka-cloud/d2vm.git
synced 2025-02-19 15:05:51 +00:00
d2vm/run: hetzner expand root partition and file system
Signed-off-by: Adphi <philippe.adrien.nousse@gmail.com>
This commit is contained in:
parent
c7ea09b6a1
commit
9f702e5071
@ -19,7 +19,9 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
serverImg = "ubuntu-20.04"
|
serverImg = "ubuntu-20.04"
|
||||||
|
vmBlockPath = "/dev/sda"
|
||||||
|
sparsecatPath = "/usr/local/bin/sparsecat"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -140,11 +142,11 @@ func runHetzner(ctx context.Context, imgPath string, stdin io.Reader, stderr io.
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
f, err := sftpc.Create("/usr/local/bin/sparsecat")
|
f, err := sftpc.Create(sparsecatPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := sftpc.Chmod("/usr/local/bin/sparsecat", 0755); err != nil {
|
if err := sftpc.Chmod(sparsecatPath, 0755); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
@ -154,35 +156,83 @@ func runHetzner(ctx context.Context, imgPath string, stdin io.Reader, stderr io.
|
|||||||
if err := f.Close(); err != nil {
|
if err := f.Close(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
wses, err := sc.NewSession()
|
serrs := make(chan error, 2)
|
||||||
|
go func() {
|
||||||
|
serrs <- func() error {
|
||||||
|
s, err := sc.NewSession()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer s.Close()
|
||||||
|
logrus.Infof("installing cloud-guest-utils on rescue server")
|
||||||
|
if b, err := s.CombinedOutput("apt update && apt install -y cloud-guest-utils"); err != nil {
|
||||||
|
return fmt.Errorf("%v: %s", err, string(b))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}()
|
||||||
|
}()
|
||||||
|
go func() {
|
||||||
|
serrs <- func() error {
|
||||||
|
wses, err := sc.NewSession()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer wses.Close()
|
||||||
|
logrus.Infof("writing image to %s", vmBlockPath)
|
||||||
|
done := make(chan struct{})
|
||||||
|
defer close(done)
|
||||||
|
pr := newProgressReader(sparsecat.NewEncoder(src))
|
||||||
|
wses.Stdin = pr
|
||||||
|
go func() {
|
||||||
|
tk := time.NewTicker(time.Second)
|
||||||
|
last := 0
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-tk.C:
|
||||||
|
b := pr.Progress()
|
||||||
|
logrus.Infof("%s / %d%% transfered ( %s/s)", humanize.Bytes(uint64(b)), int(float64(b)/float64(i.VirtualSize)*100), humanize.Bytes(uint64(b-last)))
|
||||||
|
last = b
|
||||||
|
case <-ctx.Done():
|
||||||
|
return
|
||||||
|
case <-done:
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
if b, err := wses.CombinedOutput(fmt.Sprintf("%s -r -disable-sparse-target -of %s", sparsecatPath, vmBlockPath)); err != nil {
|
||||||
|
return fmt.Errorf("%v: %s", err, string(b))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}()
|
||||||
|
}()
|
||||||
|
for i := 0; i < 2; i++ {
|
||||||
|
select {
|
||||||
|
case err := <-serrs:
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
case <-ctx.Done():
|
||||||
|
return ctx.Err()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gses, err := sc.NewSession()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer wses.Close()
|
defer gses.Close()
|
||||||
logrus.Infof("writing image to /dev/sda")
|
logrus.Infof("resizing disk partition")
|
||||||
done := make(chan struct{})
|
if b, err := gses.CombinedOutput(fmt.Sprintf("growpart %s 1", vmBlockPath)); err != nil {
|
||||||
pr := newProgressReader(sparsecat.NewEncoder(src))
|
return fmt.Errorf("%v: %s", err, string(b))
|
||||||
wses.Stdin = pr
|
}
|
||||||
go func() {
|
eses, err := sc.NewSession()
|
||||||
tk := time.NewTicker(time.Second)
|
if err != nil {
|
||||||
last := 0
|
return err
|
||||||
for {
|
}
|
||||||
select {
|
defer eses.Close()
|
||||||
case <-tk.C:
|
logrus.Infof("extending partition file system")
|
||||||
b := pr.Progress()
|
if b, err := eses.CombinedOutput(fmt.Sprintf("resize2fs %s1", vmBlockPath)); err != nil {
|
||||||
logrus.Infof("%s / %d%% transfered ( %s/s)", humanize.Bytes(uint64(b)), int(float64(b)/float64(i.ActualSize)*100), humanize.Bytes(uint64(b-last)))
|
return fmt.Errorf("%v: %s", err, string(b))
|
||||||
last = b
|
|
||||||
case <-ctx.Done():
|
|
||||||
return
|
|
||||||
case <-done:
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
if b, err := wses.CombinedOutput("/usr/local/bin/sparsecat -r -disable-sparse-target -of /dev/sda"); err != nil {
|
|
||||||
logrus.Fatalf("%v: %s", err, string(b))
|
|
||||||
}
|
}
|
||||||
close(done)
|
|
||||||
logrus.Infof("rebooting server")
|
logrus.Infof("rebooting server")
|
||||||
rbres, _, err := c.Server.Reboot(ctx, sres.Server)
|
rbres, _, err := c.Server.Reboot(ctx, sres.Server)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -28,6 +28,7 @@ RUN DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \
|
|||||||
vim \
|
vim \
|
||||||
tmux \
|
tmux \
|
||||||
htop \
|
htop \
|
||||||
|
lsb-core \
|
||||||
cloud-init \
|
cloud-init \
|
||||||
cloud-guest-utils
|
cloud-guest-utils
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user