device_tool.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "github.com/dotcloud/docker/graphdriver/devmapper"
  6. "os"
  7. "path"
  8. "sort"
  9. )
  10. func usage() {
  11. fmt.Fprintf(os.Stderr, "Usage: %s <flags> [status] | [list] | [device id] | [snap new-id base-id] | [remove id] | [mount id mountpoint]\n", os.Args[0])
  12. flag.PrintDefaults()
  13. os.Exit(1)
  14. }
  15. func main() {
  16. root := flag.String("r", "/var/lib/docker", "Docker root dir")
  17. flDebug := flag.Bool("D", false, "Debug mode")
  18. flag.Parse()
  19. if *flDebug {
  20. os.Setenv("DEBUG", "1")
  21. }
  22. if flag.NArg() < 1 {
  23. usage()
  24. }
  25. args := flag.Args()
  26. home := path.Join(*root, "devicemapper")
  27. devices, err := devmapper.NewDeviceSet(home, false)
  28. if err != nil {
  29. fmt.Println("Can't initialize device mapper: ", err)
  30. os.Exit(1)
  31. }
  32. switch args[0] {
  33. case "status":
  34. status := devices.Status()
  35. fmt.Printf("Pool name: %s\n", status.PoolName)
  36. fmt.Printf("Data Loopback file: %s\n", status.DataLoopback)
  37. fmt.Printf("Metadata Loopback file: %s\n", status.MetadataLoopback)
  38. fmt.Printf("Sector size: %d\n", status.SectorSize)
  39. 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))
  40. 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))
  41. break
  42. case "list":
  43. ids := devices.List()
  44. sort.Strings(ids)
  45. for _, id := range ids {
  46. fmt.Println(id)
  47. }
  48. break
  49. case "device":
  50. if flag.NArg() < 2 {
  51. usage()
  52. }
  53. status, err := devices.GetDeviceStatus(args[1])
  54. if err != nil {
  55. fmt.Println("Can't get device info: ", err)
  56. os.Exit(1)
  57. }
  58. fmt.Printf("Id: %d\n", status.DeviceId)
  59. fmt.Printf("Size: %d\n", status.Size)
  60. fmt.Printf("Transaction Id: %d\n", status.TransactionId)
  61. fmt.Printf("Size in Sectors: %d\n", status.SizeInSectors)
  62. fmt.Printf("Mapped Sectors: %d\n", status.MappedSectors)
  63. fmt.Printf("Highest Mapped Sector: %d\n", status.HighestMappedSector)
  64. break
  65. case "snap":
  66. if flag.NArg() < 3 {
  67. usage()
  68. }
  69. err := devices.AddDevice(args[1], args[2])
  70. if err != nil {
  71. fmt.Println("Can't create snap device: ", err)
  72. os.Exit(1)
  73. }
  74. break
  75. case "remove":
  76. if flag.NArg() < 2 {
  77. usage()
  78. }
  79. err := devices.RemoveDevice(args[1])
  80. if err != nil {
  81. fmt.Println("Can't remove device: ", err)
  82. os.Exit(1)
  83. }
  84. break
  85. case "mount":
  86. if flag.NArg() < 3 {
  87. usage()
  88. }
  89. err := devices.MountDevice(args[1], args[2], false)
  90. if err != nil {
  91. fmt.Println("Can't create snap device: ", err)
  92. os.Exit(1)
  93. }
  94. break
  95. default:
  96. fmt.Printf("Unknown command %s\n", args[0])
  97. usage()
  98. os.Exit(1)
  99. }
  100. return
  101. }