device_tool.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "github.com/dotcloud/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. }
  54. if flag.NArg() < 1 {
  55. usage()
  56. }
  57. args := flag.Args()
  58. home := path.Join(*root, "devicemapper")
  59. devices, err := devmapper.NewDeviceSet(home, false)
  60. if err != nil {
  61. fmt.Println("Can't initialize device mapper: ", err)
  62. os.Exit(1)
  63. }
  64. switch args[0] {
  65. case "status":
  66. status := devices.Status()
  67. fmt.Printf("Pool name: %s\n", status.PoolName)
  68. fmt.Printf("Data Loopback file: %s\n", status.DataLoopback)
  69. fmt.Printf("Metadata Loopback file: %s\n", status.MetadataLoopback)
  70. fmt.Printf("Sector size: %d\n", status.SectorSize)
  71. 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))
  72. 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))
  73. break
  74. case "list":
  75. ids := devices.List()
  76. sort.Strings(ids)
  77. for _, id := range ids {
  78. fmt.Println(id)
  79. }
  80. break
  81. case "device":
  82. if flag.NArg() < 2 {
  83. usage()
  84. }
  85. status, err := devices.GetDeviceStatus(args[1])
  86. if err != nil {
  87. fmt.Println("Can't get device info: ", err)
  88. os.Exit(1)
  89. }
  90. fmt.Printf("Id: %d\n", status.DeviceId)
  91. fmt.Printf("Size: %d\n", status.Size)
  92. fmt.Printf("Transaction Id: %d\n", status.TransactionId)
  93. fmt.Printf("Size in Sectors: %d\n", status.SizeInSectors)
  94. fmt.Printf("Mapped Sectors: %d\n", status.MappedSectors)
  95. fmt.Printf("Highest Mapped Sector: %d\n", status.HighestMappedSector)
  96. break
  97. case "resize":
  98. if flag.NArg() < 2 {
  99. usage()
  100. }
  101. size, err := byteSizeFromString(args[1])
  102. if err != nil {
  103. fmt.Println("Invalid size: ", err)
  104. os.Exit(1)
  105. }
  106. err = devices.ResizePool(size)
  107. if err != nil {
  108. fmt.Println("Error resizeing pool: ", err)
  109. os.Exit(1)
  110. }
  111. break
  112. case "snap":
  113. if flag.NArg() < 3 {
  114. usage()
  115. }
  116. err := devices.AddDevice(args[1], args[2])
  117. if err != nil {
  118. fmt.Println("Can't create snap device: ", err)
  119. os.Exit(1)
  120. }
  121. break
  122. case "remove":
  123. if flag.NArg() < 2 {
  124. usage()
  125. }
  126. err := devices.RemoveDevice(args[1])
  127. if err != nil {
  128. fmt.Println("Can't remove device: ", err)
  129. os.Exit(1)
  130. }
  131. break
  132. case "mount":
  133. if flag.NArg() < 3 {
  134. usage()
  135. }
  136. err := devices.MountDevice(args[1], args[2], false)
  137. if err != nil {
  138. fmt.Println("Can't create snap device: ", err)
  139. os.Exit(1)
  140. }
  141. break
  142. default:
  143. fmt.Printf("Unknown command %s\n", args[0])
  144. usage()
  145. os.Exit(1)
  146. }
  147. return
  148. }