device_tool.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "github.com/docker/docker/daemon/graphdriver/devmapper"
  6. "os"
  7. "path"
  8. "sort"
  9. "strconv"
  10. "strings"
  11. )
  12. func usage() {
  13. fmt.Fprintf(os.Stderr, "Usage: %s <flags> [status] | [list] | [device id] | [resize new-pool-size] | [snap new-id base-id] | [remove id] | [mount id mountpoint]\n", os.Args[0])
  14. flag.PrintDefaults()
  15. os.Exit(1)
  16. }
  17. func byteSizeFromString(arg string) (int64, error) {
  18. digits := ""
  19. rest := ""
  20. last := strings.LastIndexAny(arg, "0123456789")
  21. if last >= 0 {
  22. digits = arg[:last+1]
  23. rest = arg[last+1:]
  24. }
  25. val, err := strconv.ParseInt(digits, 10, 64)
  26. if err != nil {
  27. return val, err
  28. }
  29. rest = strings.ToLower(strings.TrimSpace(rest))
  30. var multiplier int64 = 1
  31. switch rest {
  32. case "":
  33. multiplier = 1
  34. case "k", "kb":
  35. multiplier = 1024
  36. case "m", "mb":
  37. multiplier = 1024 * 1024
  38. case "g", "gb":
  39. multiplier = 1024 * 1024 * 1024
  40. case "t", "tb":
  41. multiplier = 1024 * 1024 * 1024 * 1024
  42. default:
  43. return 0, fmt.Errorf("Unknown size unit: %s", rest)
  44. }
  45. return val * multiplier, nil
  46. }
  47. func main() {
  48. root := flag.String("r", "/var/lib/docker", "Docker root dir")
  49. flDebug := flag.Bool("D", false, "Debug mode")
  50. flag.Parse()
  51. if *flDebug {
  52. os.Setenv("DEBUG", "1")
  53. log.SetLevel("debug")
  54. }
  55. if flag.NArg() < 1 {
  56. usage()
  57. }
  58. args := flag.Args()
  59. home := path.Join(*root, "devicemapper")
  60. devices, err := devmapper.NewDeviceSet(home, false)
  61. if err != nil {
  62. fmt.Println("Can't initialize device mapper: ", err)
  63. os.Exit(1)
  64. }
  65. switch args[0] {
  66. case "status":
  67. status := devices.Status()
  68. fmt.Printf("Pool name: %s\n", status.PoolName)
  69. fmt.Printf("Data Loopback file: %s\n", status.DataLoopback)
  70. fmt.Printf("Metadata Loopback file: %s\n", status.MetadataLoopback)
  71. fmt.Printf("Sector size: %d\n", status.SectorSize)
  72. fmt.Printf("Data use: %d of %d (%.1f %%)\n", status.Data.Used, status.Data.Total, 100.0*float64(status.Data.Used)/float64(status.Data.Total))
  73. fmt.Printf("Metadata use: %d of %d (%.1f %%)\n", status.Metadata.Used, status.Metadata.Total, 100.0*float64(status.Metadata.Used)/float64(status.Metadata.Total))
  74. break
  75. case "list":
  76. ids := devices.List()
  77. sort.Strings(ids)
  78. for _, id := range ids {
  79. fmt.Println(id)
  80. }
  81. break
  82. case "device":
  83. if flag.NArg() < 2 {
  84. usage()
  85. }
  86. status, err := devices.GetDeviceStatus(args[1])
  87. if err != nil {
  88. fmt.Println("Can't get device info: ", err)
  89. os.Exit(1)
  90. }
  91. fmt.Printf("Id: %d\n", status.DeviceId)
  92. fmt.Printf("Size: %d\n", status.Size)
  93. fmt.Printf("Transaction Id: %d\n", status.TransactionId)
  94. fmt.Printf("Size in Sectors: %d\n", status.SizeInSectors)
  95. fmt.Printf("Mapped Sectors: %d\n", status.MappedSectors)
  96. fmt.Printf("Highest Mapped Sector: %d\n", status.HighestMappedSector)
  97. break
  98. case "resize":
  99. if flag.NArg() < 2 {
  100. usage()
  101. }
  102. size, err := byteSizeFromString(args[1])
  103. if err != nil {
  104. fmt.Println("Invalid size: ", err)
  105. os.Exit(1)
  106. }
  107. err = devices.ResizePool(size)
  108. if err != nil {
  109. fmt.Println("Error resizeing pool: ", err)
  110. os.Exit(1)
  111. }
  112. break
  113. case "snap":
  114. if flag.NArg() < 3 {
  115. usage()
  116. }
  117. err := devices.AddDevice(args[1], args[2])
  118. if err != nil {
  119. fmt.Println("Can't create snap device: ", err)
  120. os.Exit(1)
  121. }
  122. break
  123. case "remove":
  124. if flag.NArg() < 2 {
  125. usage()
  126. }
  127. err := devices.RemoveDevice(args[1])
  128. if err != nil {
  129. fmt.Println("Can't remove device: ", err)
  130. os.Exit(1)
  131. }
  132. break
  133. case "mount":
  134. if flag.NArg() < 3 {
  135. usage()
  136. }
  137. err := devices.MountDevice(args[1], args[2], false)
  138. if err != nil {
  139. fmt.Println("Can't create snap device: ", err)
  140. os.Exit(1)
  141. }
  142. break
  143. default:
  144. fmt.Printf("Unknown command %s\n", args[0])
  145. usage()
  146. os.Exit(1)
  147. }
  148. return
  149. }