On Thu, Jul 06, 2017 at 01:44:27AM +0800, Aron Xu wrote: > It's not advisable to grow a pool by increasing the vdev size, but rather > you can add more vdevs to the pool to grow it in capacity, and it would be > safer for your underlying data.
you can add vdevs and you can also replace the devices in a vdev with larger devices. Adding vdevs is faster and less work but it needs to be understood that vdevs can never be removed once added, you will have permanently changed the structure of your pool. Replacing the devices within a vdev requires each drive to be replaced individually and is slow, tedious work with a lot of time spent waiting for one resilver to finish before you can proceed with the next. To increase the size of a vdev you have to replace ALL of its block devices (disks, partitions, logical volumes, files, etc) with larger ones using the 'zpool replace' command. When all devices in a vdev have been replaced with larger devices, the vdev and thus the zpool will increase in size. e.g. to increase a raid-z made up of 4x1TB drives to 4x2TB drives, you have to replace each drive, **one at a time**. The zpool will only gain the extra storage capacity when ALL drives in a vdev have been replaced. The same is true for, e.g., a 2-drive mirror vdev. the same is true for a single-drive vdev with no redundancy, but it only has one device so only one has to be replaced of course. i.e. If have a 2x1TB mirror vdev and only replace one of the drives with a 2TB drive, the vdev will still be only 1TB in size. It won't become a 2TB vdev (or increase in size at all) until you replace the 2nd 1TB drive with another 2TB or larger drive. To enlarge a vdev that has a single 20GB device to one with 40GB, you have to use 'zpool replace' to replace the original 20GB device with a new 40GB device. Note that if you simply 'zpool add' a new 40GB device to the pool you will end up with what is effectively a RAID-0 of two vdevs, a 20GB vdev and a 40GB vdev...you do not want to do this. from the zpool man page: zpool replace [-f] [-o property=value] pool old_device [new_device] Replaces old_device with new_device. This is equivalent to attaching new_device, waiting for it to resilver, and then detaching old_device. The size of new_device must be greater than or equal to the minimum size of all the devices in a mirror or raidz con‐ figuration. new_device is required if the pool is not redundant. If new_device is not specified, it defaults to old_device. This form of replacement is useful after an existing disk has failed and has been physically replaced. In this case, the new disk may have the same /dev path as the old device, even though it is actually a different disk. ZFS recognizes this. -f Forces use of new_device, even if its appears to be in use. Not all devices can be overridden in this manner. -o property=value Sets the given pool properties. See the "Properties" section for a list of valid properties that can be set. The only property supported at the moment is ashift. Do note that some properties (among them ashift) are not inherited from a previous vdev. They are vdev specific, not pool specific. Note that for large pools with lots of drives it is faster and simpler and less prone to human error (and disk failures while resilvering) to create a completely new, larger, zpool, use 'zfs send' to transfer the contents of the old pool, and then retire the old one. craig -- craig sanders <c...@taz.net.au>