diff --git a/examples/funkmetal.json b/examples/funkmetal.json
new file mode 100644
index 00000000..6889ef21
--- /dev/null
+++ b/examples/funkmetal.json
@@ -0,0 +1,1773 @@
+{
+ "network": {
+ "eth0": {
+ "bond": {
+ "is_master": false,
+ "is_slave": false,
+ "mode": null,
+ "slaves": null
+ },
+ "bridge": {
+ "interfaces": [],
+ "is_bridge": false,
+ "is_port": false,
+ "options": {}
+ },
+ "hardware": {
+ "DEVPATH": "/devices/pci0000:00/0000:00:15.1/0000:05:00.0/net/eth0",
+ "ID_BUS": "pci",
+ "ID_MODEL_FROM_DATABASE": "RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (Motherboard)",
+ "ID_MODEL_ID": "0x8168",
+ "ID_NET_DRIVER": "r8169",
+ "ID_NET_LINK_FILE": "/lib/systemd/network/99-default.link",
+ "ID_NET_NAME": "enp5s0",
+ "ID_NET_NAME_MAC": "enx74d435c7cde4",
+ "ID_NET_NAME_PATH": "enp5s0",
+ "ID_OUI_FROM_DATABASE": "GIGA-BYTE TECHNOLOGY CO.,LTD.",
+ "ID_PATH": "pci-0000:05:00.0",
+ "ID_PATH_TAG": "pci-0000_05_00_0",
+ "ID_PCI_CLASS_FROM_DATABASE": "Network controller",
+ "ID_PCI_SUBCLASS_FROM_DATABASE": "Ethernet controller",
+ "ID_VENDOR_FROM_DATABASE": "Realtek Semiconductor Co., Ltd.",
+ "ID_VENDOR_ID": "0x10ec",
+ "IFINDEX": "2",
+ "INTERFACE": "eth0",
+ "SUBSYSTEM": "net",
+ "SYSTEMD_ALIAS": "/sys/subsystem/net/devices/eth0",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "4231947",
+ "attrs": {
+ "addr_assign_type": "0",
+ "addr_len": "6",
+ "address": "74:d4:35:c7:cd:e4",
+ "broadcast": "ff:ff:ff:ff:ff:ff",
+ "carrier": "1",
+ "carrier_changes": "2",
+ "dev_id": "0x0",
+ "dev_port": "0",
+ "device": null,
+ "dormant": "0",
+ "duplex": "full",
+ "flags": "0x1003",
+ "gro_flush_timeout": "0",
+ "ifalias": "",
+ "ifindex": "2",
+ "iflink": "2",
+ "link_mode": "0",
+ "mtu": "1500",
+ "name_assign_type": null,
+ "netdev_group": "0",
+ "operstate": "up",
+ "phys_port_id": null,
+ "phys_port_name": null,
+ "phys_switch_id": null,
+ "speed": "1000",
+ "subsystem": "net",
+ "tx_queue_len": "1000",
+ "type": "1",
+ "uevent": "INTERFACE=eth0\nIFINDEX=2"
+ }
+ },
+ "ip": {
+ "addr": "192.168.11.55",
+ "broadcast": "192.168.11.255",
+ "netmask": "255.255.255.0",
+ "source": {
+ "config": {
+ "active": true,
+ "lease": {
+ "expire": "6 2015/09/12 19:52:39",
+ "fixed-address": "192.168.11.55",
+ "interface": "eth0",
+ "options": {
+ "broadcast-address": "192.168.11.255",
+ "dhcp-lease-time": "216000",
+ "dhcp-message-type": "5",
+ "dhcp-rebinding-time": "186327",
+ "dhcp-renewal-time": "105327",
+ "dhcp-server-identifier": "192.168.11.1",
+ "domain-name": "home.woxford.com",
+ "domain-name-servers": "192.168.11.1",
+ "host-name": "funkmetal",
+ "routers": "192.168.11.1",
+ "subnet-mask": "255.255.255.0"
+ },
+ "rebind": "6 2015/09/12 19:52:39",
+ "renew": "6 2015/09/12 19:52:39"
+ }
+ },
+ "method": "dhcp",
+ "provider": "192.168.11.1"
+ }
+ },
+ "type": "eth"
+ },
+ "lo": {
+ "bond": {
+ "is_master": false,
+ "is_slave": false,
+ "mode": null,
+ "slaves": null
+ },
+ "bridge": {
+ "interfaces": [],
+ "is_bridge": false,
+ "is_port": false,
+ "options": {}
+ },
+ "hardware": {
+ "DEVPATH": "/devices/virtual/net/lo",
+ "ID_NET_LINK_FILE": "/lib/systemd/network/99-default.link",
+ "IFINDEX": "1",
+ "INTERFACE": "lo",
+ "SUBSYSTEM": "net",
+ "USEC_INITIALIZED": "4214443",
+ "attrs": {
+ "addr_assign_type": "0",
+ "addr_len": "6",
+ "address": "00:00:00:00:00:00",
+ "broadcast": "00:00:00:00:00:00",
+ "carrier": "1",
+ "carrier_changes": "0",
+ "dev_id": "0x0",
+ "dev_port": "0",
+ "dormant": "0",
+ "duplex": null,
+ "flags": "0x9",
+ "gro_flush_timeout": "0",
+ "ifalias": "",
+ "ifindex": "1",
+ "iflink": "1",
+ "link_mode": "0",
+ "mtu": "65536",
+ "name_assign_type": null,
+ "netdev_group": "0",
+ "operstate": "unknown",
+ "phys_port_id": null,
+ "phys_port_name": null,
+ "phys_switch_id": null,
+ "speed": null,
+ "subsystem": "net",
+ "tx_queue_len": "0",
+ "type": "772",
+ "uevent": "INTERFACE=lo\nIFINDEX=1"
+ }
+ },
+ "ip": {
+ "addr": "127.0.0.1",
+ "netmask": "255.0.0.0",
+ "peer": "127.0.0.1",
+ "source": {
+ "config": {
+ "auto": true,
+ "family": "inet",
+ "method": "loopback"
+ },
+ "method": "loopback",
+ "provider": "local config"
+ }
+ },
+ "type": "lo"
+ },
+ "lxcbr0": {
+ "bond": {
+ "is_master": false,
+ "is_slave": false,
+ "mode": null,
+ "slaves": null
+ },
+ "bridge": {
+ "interfaces": [],
+ "is_bridge": true,
+ "is_port": false,
+ "options": {
+ "ageing_time": "30000",
+ "bridge_id": "8000.000000000000",
+ "default_pvid": "1",
+ "forward_delay": "1500",
+ "gc_timer": "2896",
+ "group_addr": "1:80:c2:0:0:0",
+ "group_fwd_mask": "0x0",
+ "hash_elasticity": "4",
+ "hash_max": "512",
+ "hello_time": "200",
+ "hello_timer": "0",
+ "max_age": "2000",
+ "multicast_last_member_count": "2",
+ "multicast_last_member_interval": "100",
+ "multicast_membership_interval": "26000",
+ "multicast_querier": "0",
+ "multicast_querier_interval": "25500",
+ "multicast_query_interval": "12500",
+ "multicast_query_response_interval": "1000",
+ "multicast_query_use_ifaddr": "0",
+ "multicast_router": "1",
+ "multicast_snooping": "1",
+ "multicast_startup_query_count": "2",
+ "multicast_startup_query_interval": "3124",
+ "nf_call_arptables": "0",
+ "nf_call_ip6tables": "0",
+ "nf_call_iptables": "0",
+ "priority": "32768",
+ "root_id": "8000.000000000000",
+ "root_path_cost": "0",
+ "root_port": "0",
+ "stp_state": "0",
+ "tcn_timer": "0",
+ "topology_change": "0",
+ "topology_change_detected": "0",
+ "topology_change_timer": "0",
+ "vlan_filtering": "0",
+ "vlan_protocol": "0x8100"
+ }
+ },
+ "hardware": {
+ "DEVPATH": "/devices/virtual/net/lxcbr0",
+ "DEVTYPE": "bridge",
+ "ID_NET_DRIVER": "bridge",
+ "ID_NET_LINK_FILE": "/lib/systemd/network/99-default.link",
+ "IFINDEX": "4",
+ "INTERFACE": "lxcbr0",
+ "SUBSYSTEM": "net",
+ "SYSTEMD_ALIAS": "/sys/subsystem/net/devices/lxcbr0",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "9857315",
+ "attrs": {
+ "addr_assign_type": "1",
+ "addr_len": "6",
+ "address": "42:43:00:83:7a:bf",
+ "brforward": "",
+ "broadcast": "ff:ff:ff:ff:ff:ff",
+ "carrier": "1",
+ "carrier_changes": "0",
+ "dev_id": "0x0",
+ "dev_port": "0",
+ "dormant": "0",
+ "duplex": null,
+ "flags": "0x1003",
+ "gro_flush_timeout": "0",
+ "ifalias": "",
+ "ifindex": "4",
+ "iflink": "4",
+ "link_mode": "0",
+ "mtu": "1500",
+ "name_assign_type": "3",
+ "netdev_group": "0",
+ "operstate": "unknown",
+ "phys_port_id": null,
+ "phys_port_name": null,
+ "phys_switch_id": null,
+ "speed": null,
+ "subsystem": "net",
+ "tx_queue_len": "0",
+ "type": "1",
+ "uevent": "DEVTYPE=bridge\nINTERFACE=lxcbr0\nIFINDEX=4"
+ }
+ },
+ "ip": {
+ "addr": "10.0.3.1",
+ "broadcast": "10.0.3.1",
+ "netmask": "255.255.255.0",
+ "source": {
+ "config": null,
+ "method": "manual",
+ "provider": null
+ }
+ },
+ "type": "bridge"
+ },
+ "virbr0": {
+ "bond": {
+ "is_master": false,
+ "is_slave": false,
+ "mode": null,
+ "slaves": null
+ },
+ "bridge": {
+ "interfaces": [
+ "virbr0-nic"
+ ],
+ "is_bridge": true,
+ "is_port": false,
+ "options": {
+ "ageing_time": "30000",
+ "bridge_id": "8000.5254006b40ee",
+ "default_pvid": "1",
+ "forward_delay": "200",
+ "gc_timer": "2894",
+ "group_addr": "1:80:c2:0:0:0",
+ "group_fwd_mask": "0x0",
+ "hash_elasticity": "4",
+ "hash_max": "512",
+ "hello_time": "200",
+ "hello_timer": "82",
+ "max_age": "2000",
+ "multicast_last_member_count": "2",
+ "multicast_last_member_interval": "100",
+ "multicast_membership_interval": "26000",
+ "multicast_querier": "0",
+ "multicast_querier_interval": "25500",
+ "multicast_query_interval": "12500",
+ "multicast_query_response_interval": "1000",
+ "multicast_query_use_ifaddr": "0",
+ "multicast_router": "1",
+ "multicast_snooping": "1",
+ "multicast_startup_query_count": "2",
+ "multicast_startup_query_interval": "3124",
+ "nf_call_arptables": "0",
+ "nf_call_ip6tables": "0",
+ "nf_call_iptables": "0",
+ "priority": "32768",
+ "root_id": "8000.5254006b40ee",
+ "root_path_cost": "0",
+ "root_port": "0",
+ "stp_state": "1",
+ "tcn_timer": "0",
+ "topology_change": "0",
+ "topology_change_detected": "0",
+ "topology_change_timer": "0",
+ "vlan_filtering": "0",
+ "vlan_protocol": "0x8100"
+ }
+ },
+ "hardware": {
+ "DEVPATH": "/devices/virtual/net/virbr0",
+ "DEVTYPE": "bridge",
+ "ID_NET_DRIVER": "bridge",
+ "ID_NET_LINK_FILE": "/lib/systemd/network/99-default.link",
+ "IFINDEX": "5",
+ "INTERFACE": "virbr0",
+ "SUBSYSTEM": "net",
+ "SYSTEMD_ALIAS": "/sys/subsystem/net/devices/virbr0",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "10453465",
+ "attrs": {
+ "addr_assign_type": "1",
+ "addr_len": "6",
+ "address": "52:54:00:6b:40:ee",
+ "brforward": "RT",
+ "broadcast": "ff:ff:ff:ff:ff:ff",
+ "carrier": "0",
+ "carrier_changes": "1",
+ "dev_id": "0x0",
+ "dev_port": "0",
+ "dormant": "0",
+ "duplex": null,
+ "flags": "0x1003",
+ "gro_flush_timeout": "0",
+ "ifalias": "",
+ "ifindex": "5",
+ "iflink": "5",
+ "link_mode": "0",
+ "lower_virbr0-nic": null,
+ "mtu": "1500",
+ "name_assign_type": "3",
+ "netdev_group": "0",
+ "operstate": "down",
+ "phys_port_id": null,
+ "phys_port_name": null,
+ "phys_switch_id": null,
+ "speed": null,
+ "subsystem": "net",
+ "tx_queue_len": "0",
+ "type": "1",
+ "uevent": "DEVTYPE=bridge\nINTERFACE=virbr0\nIFINDEX=5"
+ }
+ },
+ "ip": {
+ "addr": "192.168.122.1",
+ "broadcast": "192.168.122.255",
+ "netmask": "255.255.255.0",
+ "source": {
+ "config": null,
+ "method": "manual",
+ "provider": null
+ }
+ },
+ "type": "bridge"
+ },
+ "virbr0-nic": {
+ "bond": {
+ "is_master": false,
+ "is_slave": false,
+ "mode": null,
+ "slaves": null
+ },
+ "bridge": {
+ "interfaces": [],
+ "is_bridge": false,
+ "is_port": true,
+ "options": {
+ "bpdu_guard": "0",
+ "change_ack": "0",
+ "config_pending": "0",
+ "designated_bridge": "8000.5254006b40ee",
+ "designated_cost": "0",
+ "designated_port": "32769",
+ "designated_root": "8000.5254006b40ee",
+ "forward_delay_timer": "0",
+ "hairpin_mode": "0",
+ "hold_timer": "0",
+ "learning": "1",
+ "message_age_timer": "0",
+ "multicast_fast_leave": "0",
+ "multicast_router": "1",
+ "path_cost": "100",
+ "port_id": "0x8001",
+ "port_no": "0x1",
+ "priority": "32",
+ "proxyarp": "0",
+ "proxyarp_wifi": "0",
+ "root_block": "0",
+ "state": "0",
+ "unicast_flood": "1"
+ }
+ },
+ "hardware": {
+ "DEVPATH": "/devices/virtual/net/virbr0-nic",
+ "ID_NET_DRIVER": "tun",
+ "ID_NET_LINK_FILE": "/lib/systemd/network/99-default.link",
+ "IFINDEX": "6",
+ "INTERFACE": "virbr0-nic",
+ "SUBSYSTEM": "net",
+ "SYSTEMD_ALIAS": "/sys/subsystem/net/devices/virbr0-nic",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "10454090",
+ "attrs": {
+ "addr_assign_type": "3",
+ "addr_len": "6",
+ "address": "52:54:00:6b:40:ee",
+ "broadcast": "ff:ff:ff:ff:ff:ff",
+ "carrier": null,
+ "carrier_changes": "1",
+ "dev_id": "0x0",
+ "dev_port": "0",
+ "dormant": null,
+ "duplex": null,
+ "flags": "0x1302",
+ "gro_flush_timeout": "0",
+ "group": "-1",
+ "ifalias": "",
+ "ifindex": "6",
+ "iflink": "6",
+ "link_mode": "0",
+ "master": null,
+ "mtu": "1500",
+ "name_assign_type": null,
+ "netdev_group": "0",
+ "operstate": "down",
+ "owner": "-1",
+ "phys_port_id": null,
+ "phys_port_name": null,
+ "phys_switch_id": null,
+ "speed": null,
+ "subsystem": "net",
+ "tun_flags": "0x1802",
+ "tx_queue_len": "500",
+ "type": "1",
+ "uevent": "INTERFACE=virbr0-nic\nIFINDEX=6",
+ "upper_virbr0": null
+ }
+ },
+ "ip": {
+ "addr": null,
+ "broadcast": null,
+ "netmask": null,
+ "source": {}
+ },
+ "type": "tap"
+ },
+ "wlan0": {
+ "bond": {
+ "is_master": false,
+ "is_slave": false,
+ "mode": null,
+ "slaves": null
+ },
+ "bridge": {
+ "interfaces": [],
+ "is_bridge": false,
+ "is_port": false,
+ "options": {}
+ },
+ "hardware": {
+ "DEVPATH": "/devices/pci0000:00/0000:00:15.2/0000:06:00.0/net/wlan0",
+ "DEVTYPE": "wlan",
+ "ID_BUS": "pci",
+ "ID_MODEL_FROM_DATABASE": "RTL8723AE PCIe Wireless Network Adapter",
+ "ID_MODEL_ID": "0x8723",
+ "ID_NET_DRIVER": "rtl8723ae",
+ "ID_NET_LINK_FILE": "/lib/systemd/network/99-default.link",
+ "ID_NET_NAME": "wlp6s0",
+ "ID_NET_NAME_MAC": "wlx54271e128d74",
+ "ID_NET_NAME_PATH": "wlp6s0",
+ "ID_OUI_FROM_DATABASE": "AzureWave Technonloies, Inc.",
+ "ID_PATH": "pci-0000:06:00.0",
+ "ID_PATH_TAG": "pci-0000_06_00_0",
+ "ID_PCI_CLASS_FROM_DATABASE": "Network controller",
+ "ID_PCI_SUBCLASS_FROM_DATABASE": "Network controller",
+ "ID_VENDOR_FROM_DATABASE": "Realtek Semiconductor Co., Ltd.",
+ "ID_VENDOR_ID": "0x10ec",
+ "IFINDEX": "3",
+ "INTERFACE": "wlan0",
+ "SUBSYSTEM": "net",
+ "SYSTEMD_ALIAS": "/sys/subsystem/net/devices/wlan0",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "8701101",
+ "attrs": {
+ "addr_assign_type": "0",
+ "addr_len": "6",
+ "address": "54:27:1e:12:8d:74",
+ "broadcast": "ff:ff:ff:ff:ff:ff",
+ "carrier": null,
+ "carrier_changes": "0",
+ "dev_id": "0x0",
+ "dev_port": "0",
+ "device": null,
+ "dormant": null,
+ "duplex": null,
+ "flags": "0x1002",
+ "gro_flush_timeout": "0",
+ "ifalias": "",
+ "ifindex": "3",
+ "iflink": "3",
+ "link_mode": "0",
+ "mtu": "1500",
+ "name_assign_type": "1",
+ "netdev_group": "0",
+ "operstate": "down",
+ "phy80211": null,
+ "phys_port_id": null,
+ "phys_port_name": null,
+ "phys_switch_id": null,
+ "speed": null,
+ "subsystem": "net",
+ "tx_queue_len": "1000",
+ "type": "1",
+ "uevent": "DEVTYPE=wlan\nINTERFACE=wlan0\nIFINDEX=3"
+ }
+ },
+ "ip": {
+ "addr": null,
+ "broadcast": null,
+ "netmask": null,
+ "source": {}
+ },
+ "type": "wlan"
+ }
+ },
+ "storage": {
+ "/dev/dm-0": {
+ "DEVLINKS": "/dev/disk/by-id/dm-name-funkmetal--vg-root /dev/disk/by-uuid/de8a5b24-5d2e-4394-a8c8-14938f9e3e96 /dev/disk/by-id/dm-uuid-LVM-3UD7rUfG1U4EAVKJkyjoNup3wQBT5hkuTh1g2U27IAy1WQtCQJ2vE7hbcM57kADs /dev/funkmetal-vg/root /dev/mapper/funkmetal--vg-root",
+ "DEVNAME": "/dev/dm-0",
+ "DEVPATH": "/devices/virtual/block/dm-0",
+ "DEVTYPE": "disk",
+ "DM_ACTIVATION": "1",
+ "DM_LV_NAME": "root",
+ "DM_NAME": "funkmetal--vg-root",
+ "DM_STATE": "ACTIVE",
+ "DM_SUSPENDED": "0",
+ "DM_TABLE_STATE": "LIVE",
+ "DM_TYPE": "raid",
+ "DM_UDEV_DISABLE_LIBRARY_FALLBACK_FLAG": "1",
+ "DM_UDEV_PRIMARY_SOURCE_FLAG": "1",
+ "DM_UDEV_RULES": "1",
+ "DM_UUID": "LVM-3UD7rUfG1U4EAVKJkyjoNup3wQBT5hkuTh1g2U27IAy1WQtCQJ2vE7hbcM57kADs",
+ "DM_VG_NAME": "funkmetal-vg",
+ "ID_FS_TYPE": "ext4",
+ "ID_FS_USAGE": "filesystem",
+ "ID_FS_UUID": "de8a5b24-5d2e-4394-a8c8-14938f9e3e96",
+ "ID_FS_UUID_ENC": "de8a5b24-5d2e-4394-a8c8-14938f9e3e96",
+ "ID_FS_VERSION": "1.0",
+ "MAJOR": "252",
+ "MINOR": "0",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "4940595",
+ "attrs": {
+ "alignment_offset": "0",
+ "bdi": null,
+ "capability": "10",
+ "dev": "252:0",
+ "discard_alignment": "0",
+ "ext_range": "1",
+ "inflight": " 0 0",
+ "range": "1",
+ "removable": "0",
+ "ro": "0",
+ "size": "103456702464",
+ "stat": " 86728 0 2333762 26928 154823 0 121318760 4037516 0 164976 4064572",
+ "subsystem": "block",
+ "uevent": "MAJOR=252\nMINOR=0\nDEVNAME=dm-0\nDEVTYPE=disk"
+ }
+ },
+ "/dev/dm-1": {
+ "DEVLINKS": "/dev/disk/by-id/dm-name-funkmetal--vg-swap_1 /dev/disk/by-uuid/66b1408a-434a-4d98-9dff-41aefc50130c /dev/mapper/funkmetal--vg-swap_1 /dev/disk/by-id/dm-uuid-LVM-3UD7rUfG1U4EAVKJkyjoNup3wQBT5hkuNWd8ozta3QP4qiZTEbcsTecp9Q2u30qJ /dev/funkmetal-vg/swap_1",
+ "DEVNAME": "/dev/dm-1",
+ "DEVPATH": "/devices/virtual/block/dm-1",
+ "DEVTYPE": "disk",
+ "DM_ACTIVATION": "1",
+ "DM_LV_NAME": "swap_1",
+ "DM_NAME": "funkmetal--vg-swap_1",
+ "DM_STATE": "ACTIVE",
+ "DM_SUSPENDED": "0",
+ "DM_TABLE_STATE": "LIVE",
+ "DM_TYPE": "raid",
+ "DM_UDEV_DISABLE_LIBRARY_FALLBACK_FLAG": "1",
+ "DM_UDEV_PRIMARY_SOURCE_FLAG": "1",
+ "DM_UDEV_RULES": "1",
+ "DM_UUID": "LVM-3UD7rUfG1U4EAVKJkyjoNup3wQBT5hkuNWd8ozta3QP4qiZTEbcsTecp9Q2u30qJ",
+ "DM_VG_NAME": "funkmetal-vg",
+ "ID_FS_TYPE": "swap",
+ "ID_FS_USAGE": "other",
+ "ID_FS_UUID": "66b1408a-434a-4d98-9dff-41aefc50130c",
+ "ID_FS_UUID_ENC": "66b1408a-434a-4d98-9dff-41aefc50130c",
+ "ID_FS_VERSION": "1",
+ "MAJOR": "252",
+ "MINOR": "1",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "4942475",
+ "attrs": {
+ "alignment_offset": "0",
+ "bdi": null,
+ "capability": "10",
+ "dev": "252:1",
+ "discard_alignment": "0",
+ "ext_range": "1",
+ "inflight": " 0 0",
+ "range": "1",
+ "removable": "0",
+ "ro": "0",
+ "size": "16315842560",
+ "stat": " 231 0 5632 16 0 0 0 0 0 16 16",
+ "subsystem": "block",
+ "uevent": "MAJOR=252\nMINOR=1\nDEVNAME=dm-1\nDEVTYPE=disk"
+ }
+ },
+ "/dev/sda": {
+ "DEVLINKS": "/dev/disk/by-id/wwn-0x500a07510d1e6322 /dev/disk/by-id/ata-Crucial_CT120M500SSD3_14350D1E6322",
+ "DEVNAME": "/dev/sda",
+ "DEVPATH": "/devices/pci0000:00/0000:00:11.0/ata1/host1/target1:0:0/1:0:0:0/block/sda",
+ "DEVTYPE": "disk",
+ "ID_ATA": "1",
+ "ID_ATA_DOWNLOAD_MICROCODE": "1",
+ "ID_ATA_FEATURE_SET_APM": "1",
+ "ID_ATA_FEATURE_SET_APM_CURRENT_VALUE": "254",
+ "ID_ATA_FEATURE_SET_APM_ENABLED": "1",
+ "ID_ATA_FEATURE_SET_HPA": "1",
+ "ID_ATA_FEATURE_SET_HPA_ENABLED": "1",
+ "ID_ATA_FEATURE_SET_PM": "1",
+ "ID_ATA_FEATURE_SET_PM_ENABLED": "1",
+ "ID_ATA_FEATURE_SET_SECURITY": "1",
+ "ID_ATA_FEATURE_SET_SECURITY_ENABLED": "0",
+ "ID_ATA_FEATURE_SET_SECURITY_ENHANCED_ERASE_UNIT_MIN": "2",
+ "ID_ATA_FEATURE_SET_SECURITY_ERASE_UNIT_MIN": "2",
+ "ID_ATA_FEATURE_SET_SECURITY_FROZEN": "1",
+ "ID_ATA_FEATURE_SET_SMART": "1",
+ "ID_ATA_FEATURE_SET_SMART_ENABLED": "1",
+ "ID_ATA_ROTATION_RATE_RPM": "0",
+ "ID_ATA_SATA": "1",
+ "ID_ATA_SATA_SIGNAL_RATE_GEN1": "1",
+ "ID_ATA_SATA_SIGNAL_RATE_GEN2": "1",
+ "ID_ATA_WRITE_CACHE": "1",
+ "ID_ATA_WRITE_CACHE_ENABLED": "1",
+ "ID_BUS": "ata",
+ "ID_MODEL": "Crucial_CT120M500SSD3",
+ "ID_MODEL_ENC": "Crucial_CT120M500SSD3\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20",
+ "ID_PART_TABLE_TYPE": "dos",
+ "ID_PART_TABLE_UUID": "000701fc",
+ "ID_REVISION": "MU05",
+ "ID_SERIAL": "Crucial_CT120M500SSD3_14350D1E6322",
+ "ID_SERIAL_SHORT": "14350D1E6322",
+ "ID_TYPE": "disk",
+ "ID_WWN": "0x500a07510d1e6322",
+ "ID_WWN_WITH_EXTENSION": "0x500a07510d1e6322",
+ "MAJOR": "8",
+ "MINOR": "0",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "4741347",
+ "attrs": {
+ "alignment_offset": "0",
+ "bdi": null,
+ "capability": "50",
+ "dev": "8:0",
+ "device": null,
+ "discard_alignment": "0",
+ "events": "",
+ "events_async": "",
+ "events_poll_msecs": "-1",
+ "ext_range": "256",
+ "inflight": " 0 0",
+ "range": "16",
+ "removable": "0",
+ "ro": "0",
+ "size": "120034123776",
+ "stat": " 87864 22 2359714 27296 91352 70699 121683034 1085520 0 165920 1112848",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=0\nDEVNAME=sda\nDEVTYPE=disk"
+ }
+ },
+ "/dev/sda1": {
+ "DEVLINKS": "/dev/disk/by-id/wwn-0x500a07510d1e6322-part1 /dev/disk/by-id/ata-Crucial_CT120M500SSD3_14350D1E6322-part1 /dev/disk/by-uuid/efb26132-4a85-450c-8e71-0c6fc9a5bbcb",
+ "DEVNAME": "/dev/sda1",
+ "DEVPATH": "/devices/pci0000:00/0000:00:11.0/ata1/host1/target1:0:0/1:0:0:0/block/sda/sda1",
+ "DEVTYPE": "partition",
+ "ID_ATA": "1",
+ "ID_ATA_DOWNLOAD_MICROCODE": "1",
+ "ID_ATA_FEATURE_SET_APM": "1",
+ "ID_ATA_FEATURE_SET_APM_CURRENT_VALUE": "254",
+ "ID_ATA_FEATURE_SET_APM_ENABLED": "1",
+ "ID_ATA_FEATURE_SET_HPA": "1",
+ "ID_ATA_FEATURE_SET_HPA_ENABLED": "1",
+ "ID_ATA_FEATURE_SET_PM": "1",
+ "ID_ATA_FEATURE_SET_PM_ENABLED": "1",
+ "ID_ATA_FEATURE_SET_SECURITY": "1",
+ "ID_ATA_FEATURE_SET_SECURITY_ENABLED": "0",
+ "ID_ATA_FEATURE_SET_SECURITY_ENHANCED_ERASE_UNIT_MIN": "2",
+ "ID_ATA_FEATURE_SET_SECURITY_ERASE_UNIT_MIN": "2",
+ "ID_ATA_FEATURE_SET_SECURITY_FROZEN": "1",
+ "ID_ATA_FEATURE_SET_SMART": "1",
+ "ID_ATA_FEATURE_SET_SMART_ENABLED": "1",
+ "ID_ATA_ROTATION_RATE_RPM": "0",
+ "ID_ATA_SATA": "1",
+ "ID_ATA_SATA_SIGNAL_RATE_GEN1": "1",
+ "ID_ATA_SATA_SIGNAL_RATE_GEN2": "1",
+ "ID_ATA_WRITE_CACHE": "1",
+ "ID_ATA_WRITE_CACHE_ENABLED": "1",
+ "ID_BUS": "ata",
+ "ID_FS_TYPE": "ext2",
+ "ID_FS_USAGE": "filesystem",
+ "ID_FS_UUID": "efb26132-4a85-450c-8e71-0c6fc9a5bbcb",
+ "ID_FS_UUID_ENC": "efb26132-4a85-450c-8e71-0c6fc9a5bbcb",
+ "ID_FS_VERSION": "1.0",
+ "ID_MODEL": "Crucial_CT120M500SSD3",
+ "ID_MODEL_ENC": "Crucial_CT120M500SSD3\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20",
+ "ID_PART_ENTRY_DISK": "8:0",
+ "ID_PART_ENTRY_FLAGS": "0x80",
+ "ID_PART_ENTRY_NUMBER": "1",
+ "ID_PART_ENTRY_OFFSET": "2048",
+ "ID_PART_ENTRY_SCHEME": "dos",
+ "ID_PART_ENTRY_SIZE": "497664",
+ "ID_PART_ENTRY_TYPE": "0x83",
+ "ID_PART_ENTRY_UUID": "000701fc-01",
+ "ID_PART_TABLE_TYPE": "dos",
+ "ID_PART_TABLE_UUID": "000701fc",
+ "ID_REVISION": "MU05",
+ "ID_SERIAL": "Crucial_CT120M500SSD3_14350D1E6322",
+ "ID_SERIAL_SHORT": "14350D1E6322",
+ "ID_TYPE": "disk",
+ "ID_WWN": "0x500a07510d1e6322",
+ "ID_WWN_WITH_EXTENSION": "0x500a07510d1e6322",
+ "MAJOR": "8",
+ "MINOR": "1",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "4753526",
+ "attrs": {
+ "alignment_offset": "0",
+ "dev": "8:1",
+ "discard_alignment": "0",
+ "inflight": " 0 0",
+ "partition": "1",
+ "ro": "0",
+ "size": "254803968",
+ "start": "2048",
+ "stat": " 682 12 13746 196 394 280 364274 3360 0 956 3556",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=1\nDEVNAME=sda1\nDEVTYPE=partition"
+ }
+ },
+ "/dev/sda2": {
+ "DEVLINKS": "/dev/disk/by-id/wwn-0x500a07510d1e6322-part2 /dev/disk/by-id/ata-Crucial_CT120M500SSD3_14350D1E6322-part2",
+ "DEVNAME": "/dev/sda2",
+ "DEVPATH": "/devices/pci0000:00/0000:00:11.0/ata1/host1/target1:0:0/1:0:0:0/block/sda/sda2",
+ "DEVTYPE": "partition",
+ "ID_ATA": "1",
+ "ID_ATA_DOWNLOAD_MICROCODE": "1",
+ "ID_ATA_FEATURE_SET_APM": "1",
+ "ID_ATA_FEATURE_SET_APM_CURRENT_VALUE": "254",
+ "ID_ATA_FEATURE_SET_APM_ENABLED": "1",
+ "ID_ATA_FEATURE_SET_HPA": "1",
+ "ID_ATA_FEATURE_SET_HPA_ENABLED": "1",
+ "ID_ATA_FEATURE_SET_PM": "1",
+ "ID_ATA_FEATURE_SET_PM_ENABLED": "1",
+ "ID_ATA_FEATURE_SET_SECURITY": "1",
+ "ID_ATA_FEATURE_SET_SECURITY_ENABLED": "0",
+ "ID_ATA_FEATURE_SET_SECURITY_ENHANCED_ERASE_UNIT_MIN": "2",
+ "ID_ATA_FEATURE_SET_SECURITY_ERASE_UNIT_MIN": "2",
+ "ID_ATA_FEATURE_SET_SECURITY_FROZEN": "1",
+ "ID_ATA_FEATURE_SET_SMART": "1",
+ "ID_ATA_FEATURE_SET_SMART_ENABLED": "1",
+ "ID_ATA_ROTATION_RATE_RPM": "0",
+ "ID_ATA_SATA": "1",
+ "ID_ATA_SATA_SIGNAL_RATE_GEN1": "1",
+ "ID_ATA_SATA_SIGNAL_RATE_GEN2": "1",
+ "ID_ATA_WRITE_CACHE": "1",
+ "ID_ATA_WRITE_CACHE_ENABLED": "1",
+ "ID_BUS": "ata",
+ "ID_MODEL": "Crucial_CT120M500SSD3",
+ "ID_MODEL_ENC": "Crucial_CT120M500SSD3\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20",
+ "ID_PART_ENTRY_DISK": "8:0",
+ "ID_PART_ENTRY_NUMBER": "2",
+ "ID_PART_ENTRY_OFFSET": "501758",
+ "ID_PART_ENTRY_SCHEME": "dos",
+ "ID_PART_ENTRY_SIZE": "233938946",
+ "ID_PART_ENTRY_TYPE": "0x5",
+ "ID_PART_ENTRY_UUID": "000701fc-02",
+ "ID_PART_TABLE_TYPE": "dos",
+ "ID_PART_TABLE_UUID": "000701fc",
+ "ID_REVISION": "MU05",
+ "ID_SERIAL": "Crucial_CT120M500SSD3_14350D1E6322",
+ "ID_SERIAL_SHORT": "14350D1E6322",
+ "ID_TYPE": "disk",
+ "ID_WWN": "0x500a07510d1e6322",
+ "ID_WWN_WITH_EXTENSION": "0x500a07510d1e6322",
+ "MAJOR": "8",
+ "MINOR": "2",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "4744895",
+ "attrs": {
+ "alignment_offset": "1024",
+ "dev": "8:2",
+ "discard_alignment": "1024",
+ "inflight": " 0 0",
+ "partition": "2",
+ "ro": "0",
+ "size": "1024",
+ "start": "501758",
+ "stat": " 7 0 14 4 0 0 0 0 0 4 4",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=2\nDEVNAME=sda2\nDEVTYPE=partition"
+ }
+ },
+ "/dev/sda5": {
+ "DEVLINKS": "/dev/disk/by-id/lvm-pv-uuid-rfx2vc-pVY3-KC0A-fmAT-Scv4-dSKP-HnEd1c /dev/disk/by-id/ata-Crucial_CT120M500SSD3_14350D1E6322-part5 /dev/disk/by-id/wwn-0x500a07510d1e6322-part5",
+ "DEVNAME": "/dev/sda5",
+ "DEVPATH": "/devices/pci0000:00/0000:00:11.0/ata1/host1/target1:0:0/1:0:0:0/block/sda/sda5",
+ "DEVTYPE": "partition",
+ "ID_ATA": "1",
+ "ID_ATA_DOWNLOAD_MICROCODE": "1",
+ "ID_ATA_FEATURE_SET_APM": "1",
+ "ID_ATA_FEATURE_SET_APM_CURRENT_VALUE": "254",
+ "ID_ATA_FEATURE_SET_APM_ENABLED": "1",
+ "ID_ATA_FEATURE_SET_HPA": "1",
+ "ID_ATA_FEATURE_SET_HPA_ENABLED": "1",
+ "ID_ATA_FEATURE_SET_PM": "1",
+ "ID_ATA_FEATURE_SET_PM_ENABLED": "1",
+ "ID_ATA_FEATURE_SET_SECURITY": "1",
+ "ID_ATA_FEATURE_SET_SECURITY_ENABLED": "0",
+ "ID_ATA_FEATURE_SET_SECURITY_ENHANCED_ERASE_UNIT_MIN": "2",
+ "ID_ATA_FEATURE_SET_SECURITY_ERASE_UNIT_MIN": "2",
+ "ID_ATA_FEATURE_SET_SECURITY_FROZEN": "1",
+ "ID_ATA_FEATURE_SET_SMART": "1",
+ "ID_ATA_FEATURE_SET_SMART_ENABLED": "1",
+ "ID_ATA_ROTATION_RATE_RPM": "0",
+ "ID_ATA_SATA": "1",
+ "ID_ATA_SATA_SIGNAL_RATE_GEN1": "1",
+ "ID_ATA_SATA_SIGNAL_RATE_GEN2": "1",
+ "ID_ATA_WRITE_CACHE": "1",
+ "ID_ATA_WRITE_CACHE_ENABLED": "1",
+ "ID_BUS": "ata",
+ "ID_FS_TYPE": "LVM2_member",
+ "ID_FS_USAGE": "raid",
+ "ID_FS_UUID": "rfx2vc-pVY3-KC0A-fmAT-Scv4-dSKP-HnEd1c",
+ "ID_FS_UUID_ENC": "rfx2vc-pVY3-KC0A-fmAT-Scv4-dSKP-HnEd1c",
+ "ID_FS_VERSION": "LVM2 001",
+ "ID_MODEL": "LVM PV rfx2vc-pVY3-KC0A-fmAT-Scv4-dSKP-HnEd1c on /dev/sda5",
+ "ID_MODEL_ENC": "Crucial_CT120M500SSD3\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20",
+ "ID_PART_ENTRY_DISK": "8:0",
+ "ID_PART_ENTRY_NUMBER": "5",
+ "ID_PART_ENTRY_OFFSET": "501760",
+ "ID_PART_ENTRY_SCHEME": "dos",
+ "ID_PART_ENTRY_SIZE": "233938944",
+ "ID_PART_ENTRY_TYPE": "0x8e",
+ "ID_PART_ENTRY_UUID": "000701fc-05",
+ "ID_PART_TABLE_TYPE": "dos",
+ "ID_PART_TABLE_UUID": "000701fc",
+ "ID_REVISION": "MU05",
+ "ID_SERIAL": "Crucial_CT120M500SSD3_14350D1E6322",
+ "ID_SERIAL_SHORT": "14350D1E6322",
+ "ID_TYPE": "disk",
+ "ID_WWN": "0x500a07510d1e6322",
+ "ID_WWN_WITH_EXTENSION": "0x500a07510d1e6322",
+ "MAJOR": "8",
+ "MINOR": "5",
+ "SUBSYSTEM": "block",
+ "SYSTEMD_ALIAS": "/dev/block/8:5",
+ "SYSTEMD_READY": "1",
+ "SYSTEMD_WANTS": "lvm2-pvscan@8:5.service",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "4746898",
+ "attrs": {
+ "alignment_offset": "0",
+ "dev": "8:5",
+ "discard_alignment": "0",
+ "inflight": " 0 0",
+ "partition": "5",
+ "ro": "0",
+ "size": "119776739328",
+ "start": "501760",
+ "stat": " 87046 10 2343162 27084 80748 70419 121318760 1036192 0 119344 1063312",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=5\nDEVNAME=sda5\nDEVTYPE=partition"
+ }
+ },
+ "/dev/sdb": {
+ "DEVLINKS": "/dev/disk/by-path/pci-0000:00:10.1-usb-0:1:1.0-scsi-0:0:0:0 /dev/disk/by-id/usb-Hitachi_HDS5C3020ALA632_152D00539000-0:0",
+ "DEVNAME": "/dev/sdb",
+ "DEVPATH": "/devices/pci0000:00/0000:00:10.1/usb4/4-1/4-1:1.0/host9/target9:0:0/9:0:0:0/block/sdb",
+ "DEVTYPE": "disk",
+ "ID_BUS": "usb",
+ "ID_INSTANCE": "0:0",
+ "ID_MODEL": "HDS5C3020ALA632",
+ "ID_MODEL_ENC": "HDS5C3020ALA632\\x20",
+ "ID_MODEL_ID": "0567",
+ "ID_PART_TABLE_TYPE": "dos",
+ "ID_PART_TABLE_UUID": "60866121",
+ "ID_PATH": "pci-0000:00:10.1-usb-0:1:1.0-scsi-0:0:0:0",
+ "ID_PATH_TAG": "pci-0000_00_10_1-usb-0_1_1_0-scsi-0_0_0_0",
+ "ID_REVISION": "0125",
+ "ID_SERIAL": "Hitachi_HDS5C3020ALA632_152D00539000-0:0",
+ "ID_SERIAL_SHORT": "152D00539000",
+ "ID_TYPE": "disk",
+ "ID_USB_DRIVER": "usb-storage",
+ "ID_USB_INTERFACES": ":080650:",
+ "ID_USB_INTERFACE_NUM": "00",
+ "ID_VENDOR": "Hitachi",
+ "ID_VENDOR_ENC": "Hitachi\\x20",
+ "ID_VENDOR_ID": "152d",
+ "MAJOR": "8",
+ "MINOR": "16",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "161572560532",
+ "attrs": {
+ "alignment_offset": "0",
+ "bdi": null,
+ "capability": "50",
+ "dev": "8:16",
+ "device": null,
+ "discard_alignment": "0",
+ "events": "",
+ "events_async": "",
+ "events_poll_msecs": "-1",
+ "ext_range": "256",
+ "inflight": " 0 0",
+ "range": "16",
+ "removable": "0",
+ "ro": "0",
+ "size": "2000398934016",
+ "stat": " 211961 147132 2885082 235760 4 0 32 0 0 192416 235616",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=16\nDEVNAME=sdb\nDEVTYPE=disk"
+ }
+ },
+ "/dev/sdb1": {
+ "DEVLINKS": "/dev/disk/by-uuid/e52be4f9-810a-43ab-ba79-a460f9d154a0 /dev/disk/by-path/pci-0000:00:10.1-usb-0:1:1.0-scsi-0:0:0:0-part1 /dev/disk/by-id/usb-Hitachi_HDS5C3020ALA632_152D00539000-0:0-part1",
+ "DEVNAME": "/dev/sdb1",
+ "DEVPATH": "/devices/pci0000:00/0000:00:10.1/usb4/4-1/4-1:1.0/host9/target9:0:0/9:0:0:0/block/sdb/sdb1",
+ "DEVTYPE": "partition",
+ "ID_BUS": "usb",
+ "ID_FS_TYPE": "ext4",
+ "ID_FS_USAGE": "filesystem",
+ "ID_FS_UUID": "e52be4f9-810a-43ab-ba79-a460f9d154a0",
+ "ID_FS_UUID_ENC": "e52be4f9-810a-43ab-ba79-a460f9d154a0",
+ "ID_FS_VERSION": "1.0",
+ "ID_INSTANCE": "0:0",
+ "ID_MODEL": "HDS5C3020ALA632",
+ "ID_MODEL_ENC": "HDS5C3020ALA632\\x20",
+ "ID_MODEL_ID": "0567",
+ "ID_PART_ENTRY_DISK": "8:16",
+ "ID_PART_ENTRY_NUMBER": "1",
+ "ID_PART_ENTRY_OFFSET": "2048",
+ "ID_PART_ENTRY_SCHEME": "dos",
+ "ID_PART_ENTRY_SIZE": "3907027120",
+ "ID_PART_ENTRY_TYPE": "0x83",
+ "ID_PART_ENTRY_UUID": "60866121-01",
+ "ID_PART_TABLE_TYPE": "dos",
+ "ID_PART_TABLE_UUID": "60866121",
+ "ID_PATH": "pci-0000:00:10.1-usb-0:1:1.0-scsi-0:0:0:0",
+ "ID_PATH_TAG": "pci-0000_00_10_1-usb-0_1_1_0-scsi-0_0_0_0",
+ "ID_REVISION": "0125",
+ "ID_SERIAL": "Hitachi_HDS5C3020ALA632_152D00539000-0:0",
+ "ID_SERIAL_SHORT": "152D00539000",
+ "ID_TYPE": "disk",
+ "ID_USB_DRIVER": "usb-storage",
+ "ID_USB_INTERFACES": ":080650:",
+ "ID_USB_INTERFACE_NUM": "00",
+ "ID_VENDOR": "Hitachi",
+ "ID_VENDOR_ENC": "Hitachi\\x20",
+ "ID_VENDOR_ID": "152d",
+ "MAJOR": "8",
+ "MINOR": "17",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "161572601986",
+ "attrs": {
+ "alignment_offset": "0",
+ "dev": "8:17",
+ "discard_alignment": "0",
+ "inflight": " 0 0",
+ "partition": "1",
+ "ro": "0",
+ "size": "2000397885440",
+ "start": "2048",
+ "stat": " 211915 147132 2884282 235688 4 0 32 0 0 192344 235544",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=17\nDEVNAME=sdb1\nDEVTYPE=partition"
+ }
+ },
+ "/dev/sdc": {
+ "DEVLINKS": "/dev/disk/by-path/pci-0000:00:10.1-usb-0:1:1.0-scsi-0:0:0:1 /dev/disk/by-id/usb-ST2000DM_001-9YN164_152D00539000-0:1",
+ "DEVNAME": "/dev/sdc",
+ "DEVPATH": "/devices/pci0000:00/0000:00:10.1/usb4/4-1/4-1:1.0/host9/target9:0:0/9:0:0:1/block/sdc",
+ "DEVTYPE": "disk",
+ "ID_BUS": "usb",
+ "ID_INSTANCE": "0:1",
+ "ID_MODEL": "001-9YN164",
+ "ID_MODEL_ENC": "001-9YN164\\x20\\x20\\x20\\x20\\x20\\x20",
+ "ID_MODEL_ID": "0567",
+ "ID_PART_TABLE_TYPE": "dos",
+ "ID_PART_TABLE_UUID": "60866121",
+ "ID_PATH": "pci-0000:00:10.1-usb-0:1:1.0-scsi-0:0:0:1",
+ "ID_PATH_TAG": "pci-0000_00_10_1-usb-0_1_1_0-scsi-0_0_0_1",
+ "ID_REVISION": "0125",
+ "ID_SERIAL": "ST2000DM_001-9YN164_152D00539000-0:1",
+ "ID_SERIAL_SHORT": "152D00539000",
+ "ID_TYPE": "disk",
+ "ID_USB_DRIVER": "usb-storage",
+ "ID_USB_INTERFACES": ":080650:",
+ "ID_USB_INTERFACE_NUM": "00",
+ "ID_VENDOR": "ST2000DM",
+ "ID_VENDOR_ENC": "ST2000DM",
+ "ID_VENDOR_ID": "152d",
+ "MAJOR": "8",
+ "MINOR": "32",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "161572551409",
+ "attrs": {
+ "alignment_offset": "0",
+ "bdi": null,
+ "capability": "50",
+ "dev": "8:32",
+ "device": null,
+ "discard_alignment": "0",
+ "events": "",
+ "events_async": "",
+ "events_poll_msecs": "-1",
+ "ext_range": "256",
+ "inflight": " 0 0",
+ "range": "16",
+ "removable": "0",
+ "ro": "0",
+ "size": "2000398934016",
+ "stat": " 213557 146788 2884826 191548 0 0 0 0 0 167972 191296",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=32\nDEVNAME=sdc\nDEVTYPE=disk"
+ }
+ },
+ "/dev/sdc1": {
+ "DEVLINKS": "/dev/disk/by-id/usb-ST2000DM_001-9YN164_152D00539000-0:1-part1 /dev/disk/by-uuid/e52be4f9-810a-43ab-ba79-a460f9d154a0 /dev/disk/by-path/pci-0000:00:10.1-usb-0:1:1.0-scsi-0:0:0:1-part1",
+ "DEVNAME": "/dev/sdc1",
+ "DEVPATH": "/devices/pci0000:00/0000:00:10.1/usb4/4-1/4-1:1.0/host9/target9:0:0/9:0:0:1/block/sdc/sdc1",
+ "DEVTYPE": "partition",
+ "ID_BUS": "usb",
+ "ID_FS_TYPE": "ext4",
+ "ID_FS_USAGE": "filesystem",
+ "ID_FS_UUID": "e52be4f9-810a-43ab-ba79-a460f9d154a0",
+ "ID_FS_UUID_ENC": "e52be4f9-810a-43ab-ba79-a460f9d154a0",
+ "ID_FS_VERSION": "1.0",
+ "ID_INSTANCE": "0:1",
+ "ID_MODEL": "001-9YN164",
+ "ID_MODEL_ENC": "001-9YN164\\x20\\x20\\x20\\x20\\x20\\x20",
+ "ID_MODEL_ID": "0567",
+ "ID_PART_ENTRY_DISK": "8:32",
+ "ID_PART_ENTRY_NUMBER": "1",
+ "ID_PART_ENTRY_OFFSET": "2048",
+ "ID_PART_ENTRY_SCHEME": "dos",
+ "ID_PART_ENTRY_SIZE": "3907027120",
+ "ID_PART_ENTRY_TYPE": "0x83",
+ "ID_PART_ENTRY_UUID": "60866121-01",
+ "ID_PART_TABLE_TYPE": "dos",
+ "ID_PART_TABLE_UUID": "60866121",
+ "ID_PATH": "pci-0000:00:10.1-usb-0:1:1.0-scsi-0:0:0:1",
+ "ID_PATH_TAG": "pci-0000_00_10_1-usb-0_1_1_0-scsi-0_0_0_1",
+ "ID_REVISION": "0125",
+ "ID_SERIAL": "ST2000DM_001-9YN164_152D00539000-0:1",
+ "ID_SERIAL_SHORT": "152D00539000",
+ "ID_TYPE": "disk",
+ "ID_USB_DRIVER": "usb-storage",
+ "ID_USB_INTERFACES": ":080650:",
+ "ID_USB_INTERFACE_NUM": "00",
+ "ID_VENDOR": "ST2000DM",
+ "ID_VENDOR_ENC": "ST2000DM",
+ "ID_VENDOR_ID": "152d",
+ "MAJOR": "8",
+ "MINOR": "33",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "161572597299",
+ "attrs": {
+ "alignment_offset": "0",
+ "dev": "8:33",
+ "discard_alignment": "0",
+ "inflight": " 0 0",
+ "partition": "1",
+ "ro": "0",
+ "size": "2000397885440",
+ "start": "2048",
+ "stat": " 213511 146788 2884026 191448 0 0 0 0 0 167872 191196",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=33\nDEVNAME=sdc1\nDEVTYPE=partition"
+ }
+ },
+ "/dev/sdf": {
+ "DEVLINKS": "/dev/disk/by-path/pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:0 /dev/disk/by-id/usb-ST2000DM_001-9YN164_152D00539000-0:0",
+ "DEVNAME": "/dev/sdf",
+ "DEVPATH": "/devices/pci0000:00/0000:00:10.1/usb4/4-2/4-2:1.0/host2/target2:0:0/2:0:0:0/block/sdf",
+ "DEVTYPE": "disk",
+ "ID_BUS": "usb",
+ "ID_INSTANCE": "0:0",
+ "ID_MODEL": "001-9YN164",
+ "ID_MODEL_ENC": "001-9YN164\\x20\\x20\\x20\\x20\\x20\\x20",
+ "ID_MODEL_ID": "0567",
+ "ID_PART_TABLE_TYPE": "gpt",
+ "ID_PART_TABLE_UUID": "882fd323-afc8-ca41-9ecb-8070e9657c26",
+ "ID_PATH": "pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:0",
+ "ID_PATH_TAG": "pci-0000_00_10_1-usb-0_2_1_0-scsi-0_0_0_0",
+ "ID_REVISION": "0125",
+ "ID_SERIAL": "ST2000DM_001-9YN164_152D00539000-0:0",
+ "ID_SERIAL_SHORT": "152D00539000",
+ "ID_TYPE": "disk",
+ "ID_USB_DRIVER": "usb-storage",
+ "ID_USB_INTERFACES": ":080650:",
+ "ID_USB_INTERFACE_NUM": "00",
+ "ID_VENDOR": "ST2000DM",
+ "ID_VENDOR_ENC": "ST2000DM",
+ "ID_VENDOR_ID": "152d",
+ "MAJOR": "8",
+ "MINOR": "80",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "6791409",
+ "attrs": {
+ "alignment_offset": "0",
+ "bdi": null,
+ "capability": "50",
+ "dev": "8:80",
+ "device": null,
+ "discard_alignment": "0",
+ "events": "",
+ "events_async": "",
+ "events_poll_msecs": "-1",
+ "ext_range": "256",
+ "inflight": " 0 0",
+ "range": "16",
+ "removable": "0",
+ "ro": "0",
+ "size": "2000398934016",
+ "stat": " 6963835 86830 1078799645 52530852 102692 30 1561118 92936 0 22152132 52614972",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=80\nDEVNAME=sdf\nDEVTYPE=disk"
+ }
+ },
+ "/dev/sdf1": {
+ "DEVLINKS": "/dev/disk/by-id/usb-ST2000DM_001-9YN164_152D00539000-0:0-part1 /dev/disk/by-path/pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:0-part1 /dev/disk/by-partlabel/zfs /dev/disk/by-partuuid/caa78e7a-3540-f548-9d09-c9c589f85e90",
+ "DEVNAME": "/dev/sdf1",
+ "DEVPATH": "/devices/pci0000:00/0000:00:10.1/usb4/4-2/4-2:1.0/host2/target2:0:0/2:0:0:0/block/sdf/sdf1",
+ "DEVTYPE": "partition",
+ "ID_BUS": "usb",
+ "ID_FS_LABEL": "test2",
+ "ID_FS_LABEL_ENC": "test2",
+ "ID_FS_TYPE": "zfs_member",
+ "ID_FS_USAGE": "raid",
+ "ID_FS_UUID": "18330803618132730915",
+ "ID_FS_UUID_ENC": "18330803618132730915",
+ "ID_FS_UUID_SUB": "18116658753708879961",
+ "ID_FS_UUID_SUB_ENC": "18116658753708879961",
+ "ID_FS_VERSION": "5000",
+ "ID_INSTANCE": "0:0",
+ "ID_MODEL": "001-9YN164",
+ "ID_MODEL_ENC": "001-9YN164\\x20\\x20\\x20\\x20\\x20\\x20",
+ "ID_MODEL_ID": "0567",
+ "ID_PART_ENTRY_DISK": "8:80",
+ "ID_PART_ENTRY_NAME": "zfs",
+ "ID_PART_ENTRY_NUMBER": "1",
+ "ID_PART_ENTRY_OFFSET": "2048",
+ "ID_PART_ENTRY_SCHEME": "gpt",
+ "ID_PART_ENTRY_SIZE": "3907010560",
+ "ID_PART_ENTRY_TYPE": "6a898cc3-1dd2-11b2-99a6-080020736631",
+ "ID_PART_ENTRY_UUID": "caa78e7a-3540-f548-9d09-c9c589f85e90",
+ "ID_PART_TABLE_TYPE": "gpt",
+ "ID_PART_TABLE_UUID": "882fd323-afc8-ca41-9ecb-8070e9657c26",
+ "ID_PATH": "pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:0",
+ "ID_PATH_TAG": "pci-0000_00_10_1-usb-0_2_1_0-scsi-0_0_0_0",
+ "ID_REVISION": "0125",
+ "ID_SERIAL": "ST2000DM_001-9YN164_152D00539000-0:0",
+ "ID_SERIAL_SHORT": "152D00539000",
+ "ID_TYPE": "disk",
+ "ID_USB_DRIVER": "usb-storage",
+ "ID_USB_INTERFACES": ":080650:",
+ "ID_USB_INTERFACE_NUM": "00",
+ "ID_VENDOR": "ST2000DM",
+ "ID_VENDOR_ENC": "ST2000DM",
+ "ID_VENDOR_ID": "152d",
+ "MAJOR": "8",
+ "MINOR": "81",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "6847988",
+ "attrs": {
+ "alignment_offset": "0",
+ "dev": "8:81",
+ "discard_alignment": "0",
+ "inflight": " 0 0",
+ "partition": "1",
+ "ro": "0",
+ "size": "2000389406720",
+ "start": "2048",
+ "stat": " 6963530 86830 1078782901 52527660 102692 30 1561118 92936 0 22150144 52611772",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=81\nDEVNAME=sdf1\nDEVTYPE=partition"
+ }
+ },
+ "/dev/sdf9": {
+ "DEVLINKS": "/dev/disk/by-partuuid/e8b912e2-0ff9-3747-8c55-d698d3864530 /dev/disk/by-id/usb-ST2000DM_001-9YN164_152D00539000-0:0-part9 /dev/disk/by-path/pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:0-part9",
+ "DEVNAME": "/dev/sdf9",
+ "DEVPATH": "/devices/pci0000:00/0000:00:10.1/usb4/4-2/4-2:1.0/host2/target2:0:0/2:0:0:0/block/sdf/sdf9",
+ "DEVTYPE": "partition",
+ "ID_BUS": "usb",
+ "ID_INSTANCE": "0:0",
+ "ID_MODEL": "001-9YN164",
+ "ID_MODEL_ENC": "001-9YN164\\x20\\x20\\x20\\x20\\x20\\x20",
+ "ID_MODEL_ID": "0567",
+ "ID_PART_ENTRY_DISK": "8:80",
+ "ID_PART_ENTRY_NUMBER": "9",
+ "ID_PART_ENTRY_OFFSET": "3907012608",
+ "ID_PART_ENTRY_SCHEME": "gpt",
+ "ID_PART_ENTRY_SIZE": "16384",
+ "ID_PART_ENTRY_TYPE": "6a945a3b-1dd2-11b2-99a6-080020736631",
+ "ID_PART_ENTRY_UUID": "e8b912e2-0ff9-3747-8c55-d698d3864530",
+ "ID_PART_TABLE_TYPE": "gpt",
+ "ID_PART_TABLE_UUID": "882fd323-afc8-ca41-9ecb-8070e9657c26",
+ "ID_PATH": "pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:0",
+ "ID_PATH_TAG": "pci-0000_00_10_1-usb-0_2_1_0-scsi-0_0_0_0",
+ "ID_REVISION": "0125",
+ "ID_SERIAL": "ST2000DM_001-9YN164_152D00539000-0:0",
+ "ID_SERIAL_SHORT": "152D00539000",
+ "ID_TYPE": "disk",
+ "ID_USB_DRIVER": "usb-storage",
+ "ID_USB_INTERFACES": ":080650:",
+ "ID_USB_INTERFACE_NUM": "00",
+ "ID_VENDOR": "ST2000DM",
+ "ID_VENDOR_ENC": "ST2000DM",
+ "ID_VENDOR_ID": "152d",
+ "MAJOR": "8",
+ "MINOR": "89",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "6850013",
+ "attrs": {
+ "alignment_offset": "0",
+ "dev": "8:89",
+ "discard_alignment": "0",
+ "inflight": " 0 0",
+ "partition": "9",
+ "ro": "0",
+ "size": "8388608",
+ "start": "3907012608",
+ "stat": " 172 0 12016 1792 0 0 0 0 0 748 1792",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=89\nDEVNAME=sdf9\nDEVTYPE=partition"
+ }
+ },
+ "/dev/sdg": {
+ "DEVLINKS": "/dev/disk/by-id/usb-ST2000DM_001-9YN164_152D00539000-0:1 /dev/disk/by-path/pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:1",
+ "DEVNAME": "/dev/sdg",
+ "DEVPATH": "/devices/pci0000:00/0000:00:10.1/usb4/4-2/4-2:1.0/host2/target2:0:0/2:0:0:1/block/sdg",
+ "DEVTYPE": "disk",
+ "ID_BUS": "usb",
+ "ID_INSTANCE": "0:1",
+ "ID_MODEL": "001-9YN164",
+ "ID_MODEL_ENC": "001-9YN164\\x20\\x20\\x20\\x20\\x20\\x20",
+ "ID_MODEL_ID": "0567",
+ "ID_PART_TABLE_TYPE": "gpt",
+ "ID_PART_TABLE_UUID": "512254cd-07e1-9145-8bdd-e82db5f76c1d",
+ "ID_PATH": "pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:1",
+ "ID_PATH_TAG": "pci-0000_00_10_1-usb-0_2_1_0-scsi-0_0_0_1",
+ "ID_REVISION": "0125",
+ "ID_SERIAL": "ST2000DM_001-9YN164_152D00539000-0:1",
+ "ID_SERIAL_SHORT": "152D00539000",
+ "ID_TYPE": "disk",
+ "ID_USB_DRIVER": "usb-storage",
+ "ID_USB_INTERFACES": ":080650:",
+ "ID_USB_INTERFACE_NUM": "00",
+ "ID_VENDOR": "ST2000DM",
+ "ID_VENDOR_ENC": "ST2000DM",
+ "ID_VENDOR_ID": "152d",
+ "MAJOR": "8",
+ "MINOR": "96",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "6809723",
+ "attrs": {
+ "alignment_offset": "0",
+ "bdi": null,
+ "capability": "50",
+ "dev": "8:96",
+ "device": null,
+ "discard_alignment": "0",
+ "events": "",
+ "events_async": "",
+ "events_poll_msecs": "-1",
+ "ext_range": "256",
+ "inflight": " 0 0",
+ "range": "16",
+ "removable": "0",
+ "ro": "0",
+ "size": "2000398934016",
+ "stat": " 6972701 87320 1079040822 53072876 103038 42 1570160 93916 0 22207732 53157516",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=96\nDEVNAME=sdg\nDEVTYPE=disk"
+ }
+ },
+ "/dev/sdg1": {
+ "DEVLINKS": "/dev/disk/by-path/pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:1-part1 /dev/disk/by-partuuid/65c56c76-4860-f04f-b2fe-5617f38cc832 /dev/disk/by-partlabel/zfs /dev/disk/by-id/usb-ST2000DM_001-9YN164_152D00539000-0:1-part1",
+ "DEVNAME": "/dev/sdg1",
+ "DEVPATH": "/devices/pci0000:00/0000:00:10.1/usb4/4-2/4-2:1.0/host2/target2:0:0/2:0:0:1/block/sdg/sdg1",
+ "DEVTYPE": "partition",
+ "ID_BUS": "usb",
+ "ID_FS_LABEL": "test2",
+ "ID_FS_LABEL_ENC": "test2",
+ "ID_FS_TYPE": "zfs_member",
+ "ID_FS_USAGE": "raid",
+ "ID_FS_UUID": "18330803618132730915",
+ "ID_FS_UUID_ENC": "18330803618132730915",
+ "ID_FS_UUID_SUB": "14990692260026163009",
+ "ID_FS_UUID_SUB_ENC": "14990692260026163009",
+ "ID_FS_VERSION": "5000",
+ "ID_INSTANCE": "0:1",
+ "ID_MODEL": "001-9YN164",
+ "ID_MODEL_ENC": "001-9YN164\\x20\\x20\\x20\\x20\\x20\\x20",
+ "ID_MODEL_ID": "0567",
+ "ID_PART_ENTRY_DISK": "8:96",
+ "ID_PART_ENTRY_NAME": "zfs",
+ "ID_PART_ENTRY_NUMBER": "1",
+ "ID_PART_ENTRY_OFFSET": "2048",
+ "ID_PART_ENTRY_SCHEME": "gpt",
+ "ID_PART_ENTRY_SIZE": "3907010560",
+ "ID_PART_ENTRY_TYPE": "6a898cc3-1dd2-11b2-99a6-080020736631",
+ "ID_PART_ENTRY_UUID": "65c56c76-4860-f04f-b2fe-5617f38cc832",
+ "ID_PART_TABLE_TYPE": "gpt",
+ "ID_PART_TABLE_UUID": "512254cd-07e1-9145-8bdd-e82db5f76c1d",
+ "ID_PATH": "pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:1",
+ "ID_PATH_TAG": "pci-0000_00_10_1-usb-0_2_1_0-scsi-0_0_0_1",
+ "ID_REVISION": "0125",
+ "ID_SERIAL": "ST2000DM_001-9YN164_152D00539000-0:1",
+ "ID_SERIAL_SHORT": "152D00539000",
+ "ID_TYPE": "disk",
+ "ID_USB_DRIVER": "usb-storage",
+ "ID_USB_INTERFACES": ":080650:",
+ "ID_USB_INTERFACE_NUM": "00",
+ "ID_VENDOR": "ST2000DM",
+ "ID_VENDOR_ENC": "ST2000DM",
+ "ID_VENDOR_ID": "152d",
+ "MAJOR": "8",
+ "MINOR": "97",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "6853176",
+ "attrs": {
+ "alignment_offset": "0",
+ "dev": "8:97",
+ "discard_alignment": "0",
+ "inflight": " 0 0",
+ "partition": "1",
+ "ro": "0",
+ "size": "2000389406720",
+ "start": "2048",
+ "stat": " 6972414 87320 1079024246 53070932 103038 42 1570160 93916 0 22206308 53155564",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=97\nDEVNAME=sdg1\nDEVTYPE=partition"
+ }
+ },
+ "/dev/sdg9": {
+ "DEVLINKS": "/dev/disk/by-partuuid/b01f1a7e-7279-9f45-97de-f74e05d00c00 /dev/disk/by-path/pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:1-part9 /dev/disk/by-id/usb-ST2000DM_001-9YN164_152D00539000-0:1-part9",
+ "DEVNAME": "/dev/sdg9",
+ "DEVPATH": "/devices/pci0000:00/0000:00:10.1/usb4/4-2/4-2:1.0/host2/target2:0:0/2:0:0:1/block/sdg/sdg9",
+ "DEVTYPE": "partition",
+ "ID_BUS": "usb",
+ "ID_INSTANCE": "0:1",
+ "ID_MODEL": "001-9YN164",
+ "ID_MODEL_ENC": "001-9YN164\\x20\\x20\\x20\\x20\\x20\\x20",
+ "ID_MODEL_ID": "0567",
+ "ID_PART_ENTRY_DISK": "8:96",
+ "ID_PART_ENTRY_NUMBER": "9",
+ "ID_PART_ENTRY_OFFSET": "3907012608",
+ "ID_PART_ENTRY_SCHEME": "gpt",
+ "ID_PART_ENTRY_SIZE": "16384",
+ "ID_PART_ENTRY_TYPE": "6a945a3b-1dd2-11b2-99a6-080020736631",
+ "ID_PART_ENTRY_UUID": "b01f1a7e-7279-9f45-97de-f74e05d00c00",
+ "ID_PART_TABLE_TYPE": "gpt",
+ "ID_PART_TABLE_UUID": "512254cd-07e1-9145-8bdd-e82db5f76c1d",
+ "ID_PATH": "pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:1",
+ "ID_PATH_TAG": "pci-0000_00_10_1-usb-0_2_1_0-scsi-0_0_0_1",
+ "ID_REVISION": "0125",
+ "ID_SERIAL": "ST2000DM_001-9YN164_152D00539000-0:1",
+ "ID_SERIAL_SHORT": "152D00539000",
+ "ID_TYPE": "disk",
+ "ID_USB_DRIVER": "usb-storage",
+ "ID_USB_INTERFACES": ":080650:",
+ "ID_USB_INTERFACE_NUM": "00",
+ "ID_VENDOR": "ST2000DM",
+ "ID_VENDOR_ENC": "ST2000DM",
+ "ID_VENDOR_ID": "152d",
+ "MAJOR": "8",
+ "MINOR": "105",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "6847526",
+ "attrs": {
+ "alignment_offset": "0",
+ "dev": "8:105",
+ "discard_alignment": "0",
+ "inflight": " 0 0",
+ "partition": "9",
+ "ro": "0",
+ "size": "8388608",
+ "start": "3907012608",
+ "stat": " 156 0 11888 504 0 0 0 0 0 264 504",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=105\nDEVNAME=sdg9\nDEVTYPE=partition"
+ }
+ },
+ "/dev/sdh": {
+ "DEVLINKS": "/dev/disk/by-path/pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:2 /dev/disk/by-id/usb-Hitachi_HDS5C3020ALA632_152D00539000-0:2",
+ "DEVNAME": "/dev/sdh",
+ "DEVPATH": "/devices/pci0000:00/0000:00:10.1/usb4/4-2/4-2:1.0/host2/target2:0:0/2:0:0:2/block/sdh",
+ "DEVTYPE": "disk",
+ "ID_BUS": "usb",
+ "ID_FS_TYPE": "linux_raid_member",
+ "ID_FS_USAGE": "raid",
+ "ID_FS_UUID": "0a9a6eae-e753-4128-98b6-d86b4162b4c6",
+ "ID_FS_UUID_ENC": "0a9a6eae-e753-4128-98b6-d86b4162b4c6",
+ "ID_FS_VERSION": "0.90.0",
+ "ID_INSTANCE": "0:2",
+ "ID_MODEL": "HDS5C3020ALA632",
+ "ID_MODEL_ENC": "HDS5C3020ALA632\\x20",
+ "ID_MODEL_ID": "0567",
+ "ID_PATH": "pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:2",
+ "ID_PATH_TAG": "pci-0000_00_10_1-usb-0_2_1_0-scsi-0_0_0_2",
+ "ID_REVISION": "0125",
+ "ID_SERIAL": "Hitachi_HDS5C3020ALA632_152D00539000-0:2",
+ "ID_SERIAL_SHORT": "152D00539000",
+ "ID_TYPE": "disk",
+ "ID_USB_DRIVER": "usb-storage",
+ "ID_USB_INTERFACES": ":080650:",
+ "ID_USB_INTERFACE_NUM": "00",
+ "ID_VENDOR": "Hitachi",
+ "ID_VENDOR_ENC": "Hitachi\\x20",
+ "ID_VENDOR_ID": "152d",
+ "MAJOR": "8",
+ "MINOR": "112",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "6545733",
+ "attrs": {
+ "alignment_offset": "0",
+ "bdi": null,
+ "capability": "50",
+ "dev": "8:112",
+ "device": null,
+ "discard_alignment": "0",
+ "events": "",
+ "events_async": "",
+ "events_poll_msecs": "-1",
+ "ext_range": "256",
+ "inflight": " 0 0",
+ "range": "16",
+ "removable": "0",
+ "ro": "0",
+ "size": "2000398934016",
+ "stat": " 6938180 85938 1076285186 52558944 128935 41 4192766 249848 0 22126748 52799840",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=112\nDEVNAME=sdh\nDEVTYPE=disk"
+ }
+ },
+ "/dev/sdh1": {
+ "DEVLINKS": "/dev/disk/by-partuuid/c9049bb1-4283-fe4e-84b5-cb8cfba76bdc /dev/disk/by-path/pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:2-part1 /dev/disk/by-id/usb-Hitachi_HDS5C3020ALA632_152D00539000-0:2-part1 /dev/disk/by-partlabel/zfs",
+ "DEVNAME": "/dev/sdh1",
+ "DEVPATH": "/devices/pci0000:00/0000:00:10.1/usb4/4-2/4-2:1.0/host2/target2:0:0/2:0:0:2/block/sdh/sdh1",
+ "DEVTYPE": "partition",
+ "ID_BUS": "usb",
+ "ID_FS_LABEL": "test2",
+ "ID_FS_LABEL_ENC": "test2",
+ "ID_FS_TYPE": "zfs_member",
+ "ID_FS_USAGE": "raid",
+ "ID_FS_UUID": "18330803618132730915",
+ "ID_FS_UUID_ENC": "18330803618132730915",
+ "ID_FS_UUID_SUB": "17642984744436519357",
+ "ID_FS_UUID_SUB_ENC": "17642984744436519357",
+ "ID_FS_VERSION": "5000",
+ "ID_INSTANCE": "0:2",
+ "ID_MODEL": "HDS5C3020ALA632",
+ "ID_MODEL_ENC": "HDS5C3020ALA632\\x20",
+ "ID_MODEL_ID": "0567",
+ "ID_PART_ENTRY_DISK": "8:112",
+ "ID_PART_ENTRY_NAME": "zfs",
+ "ID_PART_ENTRY_NUMBER": "1",
+ "ID_PART_ENTRY_OFFSET": "2048",
+ "ID_PART_ENTRY_SCHEME": "gpt",
+ "ID_PART_ENTRY_SIZE": "3907010560",
+ "ID_PART_ENTRY_TYPE": "6a898cc3-1dd2-11b2-99a6-080020736631",
+ "ID_PART_ENTRY_UUID": "c9049bb1-4283-fe4e-84b5-cb8cfba76bdc",
+ "ID_PATH": "pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:2",
+ "ID_PATH_TAG": "pci-0000_00_10_1-usb-0_2_1_0-scsi-0_0_0_2",
+ "ID_REVISION": "0125",
+ "ID_SERIAL": "Hitachi_HDS5C3020ALA632_152D00539000-0:2",
+ "ID_SERIAL_SHORT": "152D00539000",
+ "ID_TYPE": "disk",
+ "ID_USB_DRIVER": "usb-storage",
+ "ID_USB_INTERFACES": ":080650:",
+ "ID_USB_INTERFACE_NUM": "00",
+ "ID_VENDOR": "Hitachi",
+ "ID_VENDOR_ENC": "Hitachi\\x20",
+ "ID_VENDOR_ID": "152d",
+ "MAJOR": "8",
+ "MINOR": "113",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "6716901",
+ "attrs": {
+ "alignment_offset": "0",
+ "dev": "8:113",
+ "discard_alignment": "0",
+ "inflight": " 0 0",
+ "partition": "1",
+ "ro": "0",
+ "size": "2000389406720",
+ "start": "2048",
+ "stat": " 6937999 85938 1076270250 52556992 128935 41 4192766 249848 0 22125472 52797860",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=113\nDEVNAME=sdh1\nDEVTYPE=partition"
+ }
+ },
+ "/dev/sdh9": {
+ "DEVLINKS": "/dev/disk/by-id/usb-Hitachi_HDS5C3020ALA632_152D00539000-0:2-part9 /dev/disk/by-path/pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:2-part9 /dev/disk/by-partuuid/fde58a4c-34c2-dd4a-b6f3-0e73fe651afd",
+ "DEVNAME": "/dev/sdh9",
+ "DEVPATH": "/devices/pci0000:00/0000:00:10.1/usb4/4-2/4-2:1.0/host2/target2:0:0/2:0:0:2/block/sdh/sdh9",
+ "DEVTYPE": "partition",
+ "ID_BUS": "usb",
+ "ID_FS_TYPE": "linux_raid_member",
+ "ID_FS_USAGE": "raid",
+ "ID_FS_UUID": "0a9a6eae-e753-4128-98b6-d86b4162b4c6",
+ "ID_FS_UUID_ENC": "0a9a6eae-e753-4128-98b6-d86b4162b4c6",
+ "ID_FS_VERSION": "0.90.0",
+ "ID_INSTANCE": "0:2",
+ "ID_MODEL": "HDS5C3020ALA632",
+ "ID_MODEL_ENC": "HDS5C3020ALA632\\x20",
+ "ID_MODEL_ID": "0567",
+ "ID_PART_ENTRY_DISK": "8:112",
+ "ID_PART_ENTRY_NUMBER": "9",
+ "ID_PART_ENTRY_OFFSET": "3907012608",
+ "ID_PART_ENTRY_SCHEME": "gpt",
+ "ID_PART_ENTRY_SIZE": "16384",
+ "ID_PART_ENTRY_TYPE": "6a945a3b-1dd2-11b2-99a6-080020736631",
+ "ID_PART_ENTRY_UUID": "fde58a4c-34c2-dd4a-b6f3-0e73fe651afd",
+ "ID_PATH": "pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:2",
+ "ID_PATH_TAG": "pci-0000_00_10_1-usb-0_2_1_0-scsi-0_0_0_2",
+ "ID_REVISION": "0125",
+ "ID_SERIAL": "Hitachi_HDS5C3020ALA632_152D00539000-0:2",
+ "ID_SERIAL_SHORT": "152D00539000",
+ "ID_TYPE": "disk",
+ "ID_USB_DRIVER": "usb-storage",
+ "ID_USB_INTERFACES": ":080650:",
+ "ID_USB_INTERFACE_NUM": "00",
+ "ID_VENDOR": "Hitachi",
+ "ID_VENDOR_ENC": "Hitachi\\x20",
+ "ID_VENDOR_ID": "152d",
+ "MAJOR": "8",
+ "MINOR": "121",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "6758735",
+ "attrs": {
+ "alignment_offset": "0",
+ "dev": "8:121",
+ "discard_alignment": "0",
+ "inflight": " 0 0",
+ "partition": "9",
+ "ro": "0",
+ "size": "8388608",
+ "start": "3907012608",
+ "stat": " 134 0 11712 708 0 0 0 0 0 416 708",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=121\nDEVNAME=sdh9\nDEVTYPE=partition"
+ }
+ },
+ "/dev/sdi": {
+ "DEVLINKS": "/dev/disk/by-path/pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:3 /dev/disk/by-id/usb-ST2000DM_001-9YN164_152D00539000-0:3",
+ "DEVNAME": "/dev/sdi",
+ "DEVPATH": "/devices/pci0000:00/0000:00:10.1/usb4/4-2/4-2:1.0/host2/target2:0:0/2:0:0:3/block/sdi",
+ "DEVTYPE": "disk",
+ "ID_BUS": "usb",
+ "ID_INSTANCE": "0:3",
+ "ID_MODEL": "001-9YN164",
+ "ID_MODEL_ENC": "001-9YN164\\x20\\x20\\x20\\x20\\x20\\x20",
+ "ID_MODEL_ID": "0567",
+ "ID_PART_TABLE_TYPE": "gpt",
+ "ID_PART_TABLE_UUID": "1c6efd95-20bf-0e43-a48c-314fc01e2013",
+ "ID_PATH": "pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:3",
+ "ID_PATH_TAG": "pci-0000_00_10_1-usb-0_2_1_0-scsi-0_0_0_3",
+ "ID_REVISION": "0125",
+ "ID_SERIAL": "ST2000DM_001-9YN164_152D00539000-0:3",
+ "ID_SERIAL_SHORT": "152D00539000",
+ "ID_TYPE": "disk",
+ "ID_USB_DRIVER": "usb-storage",
+ "ID_USB_INTERFACES": ":080650:",
+ "ID_USB_INTERFACE_NUM": "00",
+ "ID_VENDOR": "ST2000DM",
+ "ID_VENDOR_ENC": "ST2000DM",
+ "ID_VENDOR_ID": "152d",
+ "MAJOR": "8",
+ "MINOR": "128",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "6772658",
+ "attrs": {
+ "alignment_offset": "0",
+ "bdi": null,
+ "capability": "50",
+ "dev": "8:128",
+ "device": null,
+ "discard_alignment": "0",
+ "events": "",
+ "events_async": "",
+ "events_poll_msecs": "-1",
+ "ext_range": "256",
+ "inflight": " 0 0",
+ "range": "16",
+ "removable": "0",
+ "ro": "0",
+ "size": "2000398934016",
+ "stat": " 6955949 86319 1078766342 52280320 102863 34 1566144 93804 0 22043464 52365304",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=128\nDEVNAME=sdi\nDEVTYPE=disk"
+ }
+ },
+ "/dev/sdi1": {
+ "DEVLINKS": "/dev/disk/by-partuuid/87d499ac-fee0-f24a-9f53-f800af3debc5 /dev/disk/by-path/pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:3-part1 /dev/disk/by-id/usb-ST2000DM_001-9YN164_152D00539000-0:3-part1 /dev/disk/by-partlabel/zfs",
+ "DEVNAME": "/dev/sdi1",
+ "DEVPATH": "/devices/pci0000:00/0000:00:10.1/usb4/4-2/4-2:1.0/host2/target2:0:0/2:0:0:3/block/sdi/sdi1",
+ "DEVTYPE": "partition",
+ "ID_BUS": "usb",
+ "ID_FS_LABEL": "test2",
+ "ID_FS_LABEL_ENC": "test2",
+ "ID_FS_TYPE": "zfs_member",
+ "ID_FS_USAGE": "raid",
+ "ID_FS_UUID": "18330803618132730915",
+ "ID_FS_UUID_ENC": "18330803618132730915",
+ "ID_FS_UUID_SUB": "11720289127315922372",
+ "ID_FS_UUID_SUB_ENC": "11720289127315922372",
+ "ID_FS_VERSION": "5000",
+ "ID_INSTANCE": "0:3",
+ "ID_MODEL": "001-9YN164",
+ "ID_MODEL_ENC": "001-9YN164\\x20\\x20\\x20\\x20\\x20\\x20",
+ "ID_MODEL_ID": "0567",
+ "ID_PART_ENTRY_DISK": "8:128",
+ "ID_PART_ENTRY_NAME": "zfs",
+ "ID_PART_ENTRY_NUMBER": "1",
+ "ID_PART_ENTRY_OFFSET": "2048",
+ "ID_PART_ENTRY_SCHEME": "gpt",
+ "ID_PART_ENTRY_SIZE": "3907010560",
+ "ID_PART_ENTRY_TYPE": "6a898cc3-1dd2-11b2-99a6-080020736631",
+ "ID_PART_ENTRY_UUID": "87d499ac-fee0-f24a-9f53-f800af3debc5",
+ "ID_PART_TABLE_TYPE": "gpt",
+ "ID_PART_TABLE_UUID": "1c6efd95-20bf-0e43-a48c-314fc01e2013",
+ "ID_PATH": "pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:3",
+ "ID_PATH_TAG": "pci-0000_00_10_1-usb-0_2_1_0-scsi-0_0_0_3",
+ "ID_REVISION": "0125",
+ "ID_SERIAL": "ST2000DM_001-9YN164_152D00539000-0:3",
+ "ID_SERIAL_SHORT": "152D00539000",
+ "ID_TYPE": "disk",
+ "ID_USB_DRIVER": "usb-storage",
+ "ID_USB_INTERFACES": ":080650:",
+ "ID_USB_INTERFACE_NUM": "00",
+ "ID_VENDOR": "ST2000DM",
+ "ID_VENDOR_ENC": "ST2000DM",
+ "ID_VENDOR_ID": "152d",
+ "MAJOR": "8",
+ "MINOR": "129",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "6826286",
+ "attrs": {
+ "alignment_offset": "0",
+ "dev": "8:129",
+ "discard_alignment": "0",
+ "inflight": " 0 0",
+ "partition": "1",
+ "ro": "0",
+ "size": "2000389406720",
+ "start": "2048",
+ "stat": " 6955658 86319 1078749710 52276744 102863 34 1566144 93804 0 22041144 52361728",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=129\nDEVNAME=sdi1\nDEVTYPE=partition"
+ }
+ },
+ "/dev/sdi9": {
+ "DEVLINKS": "/dev/disk/by-partuuid/74b45b8f-df47-9740-a7af-6ab7f83a2476 /dev/disk/by-path/pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:3-part9 /dev/disk/by-id/usb-ST2000DM_001-9YN164_152D00539000-0:3-part9",
+ "DEVNAME": "/dev/sdi9",
+ "DEVPATH": "/devices/pci0000:00/0000:00:10.1/usb4/4-2/4-2:1.0/host2/target2:0:0/2:0:0:3/block/sdi/sdi9",
+ "DEVTYPE": "partition",
+ "ID_BUS": "usb",
+ "ID_INSTANCE": "0:3",
+ "ID_MODEL": "001-9YN164",
+ "ID_MODEL_ENC": "001-9YN164\\x20\\x20\\x20\\x20\\x20\\x20",
+ "ID_MODEL_ID": "0567",
+ "ID_PART_ENTRY_DISK": "8:128",
+ "ID_PART_ENTRY_NUMBER": "9",
+ "ID_PART_ENTRY_OFFSET": "3907012608",
+ "ID_PART_ENTRY_SCHEME": "gpt",
+ "ID_PART_ENTRY_SIZE": "16384",
+ "ID_PART_ENTRY_TYPE": "6a945a3b-1dd2-11b2-99a6-080020736631",
+ "ID_PART_ENTRY_UUID": "74b45b8f-df47-9740-a7af-6ab7f83a2476",
+ "ID_PART_TABLE_TYPE": "gpt",
+ "ID_PART_TABLE_UUID": "1c6efd95-20bf-0e43-a48c-314fc01e2013",
+ "ID_PATH": "pci-0000:00:10.1-usb-0:2:1.0-scsi-0:0:0:3",
+ "ID_PATH_TAG": "pci-0000_00_10_1-usb-0_2_1_0-scsi-0_0_0_3",
+ "ID_REVISION": "0125",
+ "ID_SERIAL": "ST2000DM_001-9YN164_152D00539000-0:3",
+ "ID_SERIAL_SHORT": "152D00539000",
+ "ID_TYPE": "disk",
+ "ID_USB_DRIVER": "usb-storage",
+ "ID_USB_INTERFACES": ":080650:",
+ "ID_USB_INTERFACE_NUM": "00",
+ "ID_VENDOR": "ST2000DM",
+ "ID_VENDOR_ENC": "ST2000DM",
+ "ID_VENDOR_ID": "152d",
+ "MAJOR": "8",
+ "MINOR": "137",
+ "SUBSYSTEM": "block",
+ "TAGS": ":systemd:",
+ "USEC_INITIALIZED": "6828558",
+ "attrs": {
+ "alignment_offset": "0",
+ "dev": "8:137",
+ "discard_alignment": "0",
+ "inflight": " 0 0",
+ "partition": "9",
+ "ro": "0",
+ "size": "8388608",
+ "start": "3907012608",
+ "stat": " 156 0 11888 1760 0 0 0 0 0 788 1760",
+ "subsystem": "block",
+ "uevent": "MAJOR=8\nMINOR=137\nDEVNAME=sdi9\nDEVTYPE=partition"
+ }
+ }
+ }
+}
diff --git a/subiquity/controllers/filesystem.py b/subiquity/controllers/filesystem.py
index ef69137c..3717679c 100644
--- a/subiquity/controllers/filesystem.py
+++ b/subiquity/controllers/filesystem.py
@@ -17,11 +17,11 @@ import logging
import os
from subiquity.controller import ControllerPolicy
from subiquity.models.actions import preserve_action
-from subiquity.models import (FilesystemModel, IscsiDiskModel, RaidModel,
- CephDiskModel)
+from subiquity.models import (FilesystemModel,
+ RaidModel)
from subiquity.ui.views import (DiskPartitionView, AddPartitionView,
FilesystemView, DiskInfoView,
- RaidView, CephDiskView, IscsiDiskView)
+ RaidView)
import subiquity.utils as utils
from subiquity.ui.dummy import DummyView
from subiquity.curtin import (curtin_write_storage_actions,
@@ -38,8 +38,8 @@ class FilesystemController(ControllerPolicy):
def __init__(self, common):
super().__init__(common)
self.model = FilesystemModel(self.prober, self.opts)
- self.iscsi_model = IscsiDiskModel()
- self.ceph_model = CephDiskModel()
+ #self.iscsi_model = IscsiDiskModel()
+ #self.ceph_model = CephDiskModel()
self.raid_model = RaidModel()
def filesystem(self, reset=False):
@@ -172,7 +172,7 @@ class FilesystemController(ControllerPolicy):
self.ui.set_body(DummyView(self.signal))
def create_raid(self, *args, **kwargs):
- title = ("Disk and filesystem setup")
+ title = ("Create software RAID (\"MD\") disk")
footer = ("ENTER on a disk will show detailed "
"information for that disk")
excerpt = ("Use SPACE to select disks to form your RAID array, "
@@ -181,9 +181,14 @@ class FilesystemController(ControllerPolicy):
"the same size and speed.")
self.ui.set_header(title, excerpt)
self.ui.set_footer(footer)
- self.ui.set_body(RaidView(self.raid_model,
+ self.ui.set_body(RaidView(self.model,
self.signal))
+ def add_raid_dev(self, result):
+ log.debug('add_raid_dev: result={}'.format(result))
+ self.model.add_raid_device(result)
+ self.signal.emit_signal('filesystem:show')
+
def setup_bcache(self, *args, **kwargs):
self.ui.set_body(DummyView(self.signal))
@@ -216,4 +221,5 @@ class FilesystemController(ControllerPolicy):
if self.opts.dry_run and self.opts.uefi:
log.debug('forcing is_uefi True beacuse of options')
return True
+
return os.path.exists('/sys/firmware/efi')
diff --git a/subiquity/controllers/raid.py b/subiquity/controllers/raid.py
new file mode 100644
index 00000000..8c324788
--- /dev/null
+++ b/subiquity/controllers/raid.py
@@ -0,0 +1,32 @@
+# Copyright 2015 Canonical, Ltd.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+
+import logging
+from subiquity.models import RaidDiskModel
+from subiquity.controller import ControllerPolicy
+
+log = logging.getLogger("subiquity.controller.raid")
+
+
+class RaidDiskController(ControllerPolicy):
+ def __init__(self, common):
+ super().__init__(common)
+ self.model = RaidDiskModel()
+
+ def raid(self):
+ pass
+
+ def raid_handler(self):
+ pass
diff --git a/subiquity/models/actions.py b/subiquity/models/actions.py
index 955ae130..69f28e01 100644
--- a/subiquity/models/actions.py
+++ b/subiquity/models/actions.py
@@ -121,6 +121,26 @@ class DiskAction():
return yaml.dump(self.get(), default_flow_style=False)
+class RaidAction(DiskAction):
+ def __init__(self, action_id, raidlevel, dev_ids, spare_ids):
+ self._action_id = action_id
+ self.parent = None
+ self._raidlevel = raidlevel
+ self._devices = dev_ids
+ self._spares = spare_ids
+
+ def get(self):
+ action = {
+ 'id': self.action_id,
+ 'name': self.action_id,
+ 'raidlevel': self._raidlevel,
+ 'devices': self._devices,
+ 'spare_devices': self._spares,
+ 'type': 'raid',
+ }
+ return action
+
+
class PartitionAction(DiskAction):
def __init__(self, parent, partnum, offset, size, flags=None):
self.parent = parent
diff --git a/subiquity/models/blockdev.py b/subiquity/models/blockdev.py
index 899f3f66..7dca07cf 100644
--- a/subiquity/models/blockdev.py
+++ b/subiquity/models/blockdev.py
@@ -24,7 +24,8 @@ from .actions import (
DiskAction,
PartitionAction,
FormatAction,
- MountAction
+ MountAction,
+ RaidAction,
)
log = logging.getLogger("subiquity.filesystem.blockdev")
@@ -125,6 +126,7 @@ class Blockdev():
self._mounts = {}
self.bcache = []
self.lvm = []
+ self.holder = {}
self.baseaction = DiskAction(os.path.basename(self.disk.devpath),
self.disk.model, self.disk.serial,
self.disk.parttype)
@@ -136,6 +138,7 @@ class Blockdev():
self._mounts = {}
self.bcache = []
self.lvm = []
+ self.holder = {}
@property
def devpath(self):
@@ -165,11 +168,17 @@ class Blockdev():
def filesystems(self):
return self._filesystems
+ @property
+ def percent_free(self):
+ ''' return the device free percentage of the whole device'''
+ percent = ( int((1.0 - (self.usedspace / self.size)) * 100))
+ return percent
+
@property
def available(self):
''' return True if has free space or partitions not
assigned '''
- if not self.is_mounted() and self.freespace > 0.0:
+ if not self.is_mounted() and self.percent_free > 0:
return True
return False
@@ -269,6 +278,9 @@ class Blockdev():
log.debug('Partition Added')
return new_size
+ def set_holder(self, devpath, holdtype):
+ self.holder[holdtype] = devpath
+
def is_mounted(self):
with open('/proc/mounts') as pm:
mounts = pm.read()
@@ -317,7 +329,7 @@ class Blockdev():
def sort_actions(self, actions):
def type_index(t):
- order = ['disk', 'partition', 'format', 'mount']
+ order = ['disk', 'partition', 'raid', 'format', 'mount']
return order.index(t.get('type'))
def path_count(p):
@@ -349,6 +361,19 @@ class Blockdev():
return fs_table
+class Raiddev(Blockdev):
+ def __init__(self, devpath, serial, model, parttype, size,
+ raid_level, raid_devices, spare_devices):
+ super().__init__(devpath, serial, model, parttype, size)
+ self._raid_devices = raid_devices
+ self._raid_level = raid_level
+ self._spare_devices = spare_devices
+ self.baseaction = RaidAction(os.path.basename(self.disk.devpath),
+ self._raid_devices,
+ self._raid_level,
+ self._spare_devices)
+
+
if __name__ == '__main__':
def get_filesystems(devices):
print("FILE SYSTEM")
diff --git a/subiquity/models/filesystem.py b/subiquity/models/filesystem.py
index d3c7ee53..8eca33c6 100644
--- a/subiquity/models/filesystem.py
+++ b/subiquity/models/filesystem.py
@@ -16,7 +16,7 @@
import json
import logging
-from .blockdev import Blockdev
+from .blockdev import Blockdev, Raiddev
import math
from subiquity.model import ModelPolicy
@@ -25,6 +25,10 @@ HUMAN_UNITS = ['B', 'K', 'M', 'G', 'T', 'P']
log = logging.getLogger('subiquity.models.filesystem')
+class AttrDict(dict):
+ __getattr__ = dict.__getitem__
+ __setattr__ = dict.__setitem__
+
class FilesystemModel(ModelPolicy):
""" Model representing storage options
"""
@@ -58,7 +62,10 @@ class FilesystemModel(ModelPolicy):
'create_swap_entire_device'),
('Show disk information',
'filesystem:show-disk-information',
- 'show_disk_information')
+ 'show_disk_information'),
+ ('Add Raid Device',
+ 'filesystem:add-raid-dev',
+ 'add_raid_dev'),
]
# TODO: Re-add once curtin supports this.
@@ -72,9 +79,9 @@ class FilesystemModel(ModelPolicy):
# ('Create volume group (LVM2)',
# 'filesystem:create-volume-group',
# 'create_volume_group'),
- # ('Create software RAID (MD)',
- # 'filesystem:create-raid',
- # 'create_raid'),
+ ('Create software RAID (MD)',
+ 'filesystem:create-raid',
+ 'create_raid'),
# ('Setup hierarchichal storage (bcache)',
# 'filesystem:setup-bcache',
# 'setup_bcache')
@@ -90,11 +97,21 @@ class FilesystemModel(ModelPolicy):
'leave unformatted'
]
+ # TODO: what is "linear" level?
+ raid_levels = [
+ "0",
+ "1",
+ "5",
+ "6",
+ "10",
+ ]
+
def __init__(self, prober, opts):
self.opts = opts
self.prober = prober
self.info = {}
self.devices = {}
+ self.raid_devices = {}
self.storage = {}
def reset(self):
@@ -142,8 +159,119 @@ class FilesystemModel(ModelPolicy):
return self.devices[disk]
def get_disks(self):
- return [self.get_disk(d) for d in sorted(self.info.keys())
- if len(d) > 0]
+ possible_devices = list(set(list(self.devices.keys()) +
+ list(self.info.keys())))
+ possible_disks = [self.get_disk(d) for d in sorted(possible_devices)]
+ return [d for d in possible_disks if d.available]
+
+ def calculate_raid_size(self, raid_level, raid_devices, spare_devices):
+ '''
+ 0: array size is the size of the smallest component partition times
+ the number of component partitions
+ 1: array size is the size of the smallest component partition
+ 5: array size is the size of the smallest component partition times
+ the number of component partitions munus 1
+ 6: array size is the size of the smallest component partition times
+ the number of component partitions munus 2
+ '''
+ # https://raid.wiki.kernel.org/ \
+ # index.php/RAID_superblock_formats#Total_Size_of_superblock
+ # Version-1 superblock format on-disk layout:
+ # Total size of superblock: 256 Bytes plus 2 bytes per device in the
+ # array
+ log.debug('calc_raid_size: level={} rd={} sd={}'.format(raid_level,
+ raid_devices,
+ spare_devices))
+ overhead_bytes = 256 + (2 * (len(raid_devices) + len(spare_devices)))
+ log.debug('calc_raid_size: overhead_bytes={}'.format(overhead_bytes))
+
+ # find the smallest device
+ min_dev_size = min([d.size for d in raid_devices])
+ log.debug('calc_raid_size: min_dev_size={}'.format(min_dev_size))
+
+ if raid_level == 0:
+ array_size = min_dev_size * len(raid_devices)
+ elif raid_level == 1:
+ array_size = min_dev_size
+ elif raid_level == 5:
+ array_size = min_dev_size * (len(raid_devices) - 1)
+ elif raid_level == 10:
+ array_size = min_dev_size * int((len(raid_devices) /
+ len(spare_devices)))
+ total_size = array_size - overhead_bytes
+ log.debug('calc_raid_size: array_size:{} - overhead:{} = {}'.format(
+ array_size, overhead_bytes, total_size))
+ return total_size
+
+ def add_raid_device(self, raidspec):
+ # assume raidspec has already been valided in view/controller
+ log.debug('Attempting to create a raid device')
+ '''
+ raidspec = {
+ 'devices': ['/dev/sdb 1.819T, HDS5C3020ALA632',
+ '/dev/sdc 1.819T, 001-9YN164',
+ '/dev/sdf 1.819T, 001-9YN164',
+ '/dev/sdg 1.819T, 001-9YN164',
+ '/dev/sdh 1.819T, HDS5C3020ALA632',
+ '/dev/sdi 1.819T, 001-9YN164'],
+ 'raid_level': '0',
+ 'hot_spares': '0',
+ 'chunk_size': '4K',
+ }
+ '''
+ raid_devices = []
+ spare_devices = []
+ all_devices = [r.split() for r in raidspec.get('devices', [])]
+ nr_spares = int(raidspec.get('hot_spares'))
+
+ # XXX: curtin requires a partition table on the base devices
+ # and then one partition of type raid
+ for (devpath, _, _) in all_devices:
+ disk = self.get_disk(devpath)
+ disk.add_partition(1, disk.freespace, None, None, flag='raid')
+ if len(raid_devices) + nr_spares < len(all_devices):
+ raid_devices.append(disk)
+ else:
+ spare_devices.append(disk)
+
+ # auto increment md number based in registered devices
+ raid_dev_name = '/dev/md{}'.format(len(self.raid_devices))
+ raid_serial = '{}_serial'.format(raid_dev_name)
+ raid_model = '{}_model'.format(raid_dev_name)
+ raid_parttype = 'gpt'
+ raid_level = int(raidspec.get('raid_level'))
+ raid_size = self.calculate_raid_size(raid_level, raid_devices,
+ spare_devices)
+ # create a Raiddev (pass in only the names)
+ raid_dev = Raiddev(raid_dev_name, raid_serial, raid_model,
+ raid_parttype, raid_size,
+ [d.devpath for d in raid_devices],
+ raid_level,
+ [d.devpath for d in spare_devices])
+
+ # add it to the model's info dict
+ raid_dev_info = {
+ 'type': 'disk',
+ 'name': raid_dev_name,
+ 'size': raid_size,
+ 'serial': raid_serial,
+ 'vendor': 'Linux Software RAID',
+ 'model': raid_model,
+ 'is_virtual': True,
+ 'raw': {},
+ }
+ self.info[raid_dev_name] = AttrDict(raid_dev_info)
+
+ # add it to the model's raid devices
+ self.raid_devices[raid_dev_name] = raid_dev
+ # add it to the model's devices
+ self.add_device(raid_dev_name, raid_dev)
+
+ log.debug('Successfully added raid_dev: {}'.format(raid_dev))
+
+ def add_device(self, devpath, device):
+ log.debug("adding device: {} = {}".format(devpath, device))
+ self.devices[devpath] = device
def get_partitions(self):
log.debug('probe_storage: get_partitions()')
@@ -158,16 +286,23 @@ class FilesystemModel(ModelPolicy):
partitions))
return partitions
+ def installable(self):
+ ''' one or more disks has used space
+ and has "/" as a mount
+ '''
+ for disk in self.get_disks():
+ if disk.usedspace > 0 and "/" in disk.mounts:
+ return True
+
def get_available_disks(self):
- return [dev.disk.devpath for dev in self.get_disks()
- if self.opts.dry_run is True or dev.mounted is False]
+ return [dev.disk.devpath for dev in self.get_disks()]
def get_used_disks(self):
return [dev.disk.devpath for dev in self.devices.values()
if dev.available is False]
def get_disk_info(self, disk):
- return self.info[disk]
+ return self.info.get(disk, {})
def get_disk_action(self, disk):
return self.devices[disk].get_actions()
diff --git a/subiquity/models/raid.py b/subiquity/models/raid.py
index db54eba4..6763216c 100644
--- a/subiquity/models/raid.py
+++ b/subiquity/models/raid.py
@@ -14,7 +14,6 @@
# along with this program. If not, see .
import logging
-from collections import OrderedDict
from subiquity.model import ModelPolicy
diff --git a/subiquity/ui/views/filesystem.py b/subiquity/ui/views/filesystem.py
index 970e9df5..7b84c5a2 100644
--- a/subiquity/ui/views/filesystem.py
+++ b/subiquity/ui/views/filesystem.py
@@ -380,7 +380,6 @@ class FilesystemView(ViewPolicy):
self.signal = signal
self.items = []
self.model.probe_storage() # probe before we complete
- self.installable = True
self.body = [
Padding.center_79(Text("FILE SYSTEM")),
Padding.center_79(self._build_partition_list()),
@@ -441,7 +440,7 @@ class FilesystemView(ViewPolicy):
buttons = []
# don't enable done botton if we can't install
- if self.installable:
+ if self.model.installable:
buttons.append(
Color.button(done_btn(on_press=self.done),
focus_map='button focus'))
@@ -467,7 +466,6 @@ class FilesystemView(ViewPolicy):
avail_disks = self.model.get_available_disks()
if len(avail_disks) == 0:
- self.installable = False
return Pile([Color.info_minor(Text("No available disks."))])
for dname in avail_disks:
diff --git a/subiquity/ui/views/raid.py b/subiquity/ui/views/raid.py
index 7ab89d58..711dc5bb 100644
--- a/subiquity/ui/views/raid.py
+++ b/subiquity/ui/views/raid.py
@@ -13,10 +13,12 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
-from urwid import Text, Columns, Pile, ListBox
+from urwid import Text, Columns, Pile, ListBox, CheckBox
+from subiquity.models.filesystem import _humanize_size
from subiquity.view import ViewPolicy
from subiquity.ui.buttons import cancel_btn, done_btn
-from subiquity.ui.interactive import StringEditor, IntegerEditor, Selector
+from subiquity.ui.interactive import (StringEditor, IntegerEditor,
+ Selector)
from subiquity.ui.utils import Color, Padding
import logging
@@ -29,7 +31,8 @@ class RaidView(ViewPolicy):
self.signal = signal
self.raid_level = Selector(self.model.raid_levels)
self.hot_spares = IntegerEditor(caption="")
- self.chunk_size = StringEditor(caption="")
+ self.chunk_size = StringEditor(edit_text="4K", caption="")
+ self.selected_disks = []
body = [
Padding.center_50(self._build_disk_selection()),
Padding.line_break(""),
@@ -40,12 +43,32 @@ class RaidView(ViewPolicy):
super().__init__(ListBox(body))
def _build_disk_selection(self):
+ log.debug('raid: _build_disk_selection')
items = [
Text("DISK SELECTION")
]
+ avail_disks = self.model.get_available_disks()
+ if len(avail_disks) == 0:
+ self.installable = False
+ return items.append(
+ [Color.info_minor(Text("No available disks."))])
+
+ for dname in avail_disks:
+ disk = self.model.get_disk_info(dname)
+ #device = self.model.get_disk(dname)
+ disk_sz = _humanize_size(disk.size)
+ disk_string = "{} {}, {}".format(disk.name,
+ disk_sz,
+ disk.model)
+ log.debug('raid: disk_string={}'.format(disk_string))
+ self.selected_disks.append(CheckBox(disk_string))
+
+ items += self.selected_disks
+
return Pile(items)
def _build_raid_configuration(self):
+ log.debug('raid: _build_raid_config')
items = [
Text("RAID CONFIGURATION"),
Columns(
@@ -80,6 +103,7 @@ class RaidView(ViewPolicy):
return Pile(items)
def _build_buttons(self):
+ log.debug('raid: _build_buttons')
cancel = cancel_btn(on_press=self.cancel)
done = done_btn(on_press=self.done)
@@ -90,7 +114,15 @@ class RaidView(ViewPolicy):
return Pile(buttons)
def done(self, result):
- self.signal.emit_signal('filesystem:show')
+ result = {
+ 'devices': [x.get_label() for x in self.selected_disks if x.state],
+ 'raid_level': self.raid_level.value,
+ 'hot_spares': self.hot_spares.value,
+ 'chunk_size': self.chunk_size.value,
+ }
+ log.debug('raid_done: result = {}'.format(result))
+ self.signal.emit_signal('filesystem:add-raid-dev', result)
def cancel(self, button):
+ log.debug('raid: button_cancel')
self.signal.emit_signal("quit")