LVM Basic Operations: Difference between revisions
Line 122: | Line 122: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* <code>-a|</code>, <code class="noTypo">--activate y|n|ay</code> - Change the active state of LVs. An active LV can be used through a block device, allowing data on the LV to be accessed. <code>'''y'''</code> makes LVs active, or available. <code>'''n'''</code> makes LVs inactive, or unavailable. The block device for the LV is added or removed from the system using device-mapper in the kernel. A symbolic link <code>/dev/VGName/LVName</code> pointing to the device node is also added/removed. | * <code>-a|</code>, <code class="noTypo">--activate y|n|ay</code> - Change the active state of LVs. An active LV can be used through a block device, allowing data on the LV to be accessed. <code>'''y'''</code> makes LVs active, or available. <code>'''n'''</code> makes LVs inactive, or unavailable. | ||
<syntaxhighlight lang="shell" line="1" class="mlw-continue mlw-shell-gray"> | ** The block device for the LV is added or removed from the system using device-mapper in the kernel. A symbolic link <code>/dev/VGName/LVName</code> pointing to the device node is also added/removed. | ||
** All software and scripts should access the device through the symbolic link and present this as the name of the device. The location and name of the underlying device node may depend on the distribution, configuration (e.g. <code>udev</code>), or release version. | |||
** <code>ay</code> specifies auto-activation, which is used by system-generated activation commands. By default, LVs are auto-activated. An auto activation property can be set on a VG or LV to disable auto-activation, see <code class="noTypo">--setautoactivation y|n</code> in <code>vgchange</code>, <code>lvchange</code>, <code>vgcreate</code>, and <code>lvcreate</code>. Display the property with <code>vgs</code> or <code>lvs "-o autoactivation"</code>. | |||
** The ''<code>lvm.conf(5)</code>'' <code>auto_activation_volume_list</code> includes names of VGs or LVs that should be auto-activated, and anything not listed is not auto-activated. When <code>auto_activation_volume_list</code> is undefined (the default), it has no effect. If <code>auto_activation_volume_list</code> is defined and empty, no LVs are auto activated. Items included by <code>auto_activation_volume_list</code> will not be auto-activated if the activation property has been disabled. See ''<code>lvmlockd(8)</code>'' for more information about activation options <code>ey</code> and <code>sy</code> for shared VGs. | |||
<syntaxhighlight lang="shell" line="1" class="mlw-continue"> | |||
sudo mount -a # remount via /etc/fstab | |||
</syntaxhighlight><syntaxhighlight lang="shell" line="1" class="mlw-continue mlw-shell-gray"> | |||
df -h # list the mounted devices | |||
</syntaxhighlight><syntaxhighlight lang="shell"> | </syntaxhighlight><syntaxhighlight lang="shell"> | ||
Line 131: | Line 137: | ||
# Deactivate and reactivate the logical volume | # Deactivate and reactivate the logical volume | ||
# -- | # -- |
Revision as of 09:53, 12 September 2022
#### https://www.youtube.com/watch?v=MeltFN-bXrQ&t=2090s
# `pvdisplay` Display various attributes of physical volume(s). Shows the attributes of PVs, like size, physical extent size, space used for the VG descriptor area, etc.
# `pvs` is a preferred alternative that shows the same information and more, using a more compact and configurable output format.
sudo pvdisplay
# `lvdisplay` - Display information about a logical volume. Shows the attributes of LVs, like size, read/write status, snapshot information, etc.
# `lvs` is a preferred alternative that shows the same information and more, using a more compact and configurable output format.
## Extend VG which is located on /dev/sda to encompass also /dev/sdb
lsblk # check the devices
sudo pvcreat /dev/sdb # create phisical volume at /dev/sdb
sudo pvdisplay # check
sudo vgextend vg_name /dev/sdb # extend the existing volume group
df -hT # check
sudo vgdisplay # check
# At this point you can create a new logical volume or extend an existing one
## Extend logical volume - note there mus have enoug free space in the volume group where the existing LV is located
sudo lvextend -L +10G /dev/mapper/lv_name
sudo rsize2fs /dev/mapper/lv_name
df -h
### for swap file sudo mkswap /dev/mapper/xxxx-swap_1
### then edit /etc/fstab and chenge the UUID if it is mounted by it...
## Exten to all available space and resize the FS in the same time
sudo lvextend --reziefs -l +100%FREE /dev/mapper/lv_name
df -h
# Shrink logical volume
1 lsblk
2 sudo apt update
3 sudo apt install gnome-disk-utility
4 ll
5 lsblk
6 ll /dev/kali-x-vg
7 ll /dev/kali-x-vg/root
8 ll /dev/dm-0
9 sudo lvreduce --resizefs -L 60G kali-x-vg/root
10 lsblk
11 df -h
## Create a new volume group on newly attached block device /dev/sdc
lsblk # check
sudo pvcreat /dev/sdbc # crrate phisical volume
sudo vgcreate vg_name /dev/sdbc # create volume group
sudo vgdisplay # check
## Create a new logical volume
sudo lvcreate vg_name -L 5G -n lv_name # create 5GB logical volume
sudo lvdisplay # check
sudo mkfs.ext4 /dev/mapper/vg_name-lv_name # format the logical folume as Ext4
# mount the new logical volume
sudo mkdir -p /mnt/volume # create mount point
sudo mount /dev/mapper/vg_name-lv_name /mnt/volume # mount the volume
df -h # check
# mount it permanently via /etc/fstab (we can munt it by using the mapped path, but it is preferable to use UUID)
sudo blkid /dev/mapper/vg_name-lv_name # get the UUID (universal unique identifier) of the logical volume
> /dev/mapper/vg_name-lv_name: UUID="b6ddc49d-...-...c90" BLOCK_SIZE="4096" TYPE="ext4"
sudo cp /etc/fstab{,.bak} # backup the fstab file
sudo umount /mnt/volume # unmount the nel volume
df -h # check
sudo nano /etc/fstab
># <file system> <mount point> <type> <options> <dump> <pass>
> UUID=b6ddc49d-...-...c90 /mnt/volume ext4 defaults 0 2
# Test /etc/fsstab for errors, by remount everything listed inside
sudo mount -a # no output means everything is correctly mounted
df -h # check
Snapshots of Logical Volumes
Create a Snapshot
Create 5GB snapshot of a logical volume named lv_name
from volume group named vg_name
.
sudo lvcreate /dev/mapper/vg_name-lv_name -L 5G -s -n lv_name_ss_at_date_$(date +%y%m%d)
sudo lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv_name vg_name owi-aos--- 60.00g
lv_name_ss_at_date_220908 vg_name swi-a-s--- 5.00g lv_name 0.01
Mount a Snapshot
The snapshot could be mounted in order to fetch files in their snapshot state. In this case it is good to mount them in read only mode.
sudo mkdir /mnt/snapshot
sudo mount -r /dev/mapper/vg_name-lv_name_ss_at_date_220908 /mnt/snapshot
You can use a mounted snapshot (of the root filesystem) to create a backup while the OS is running.
Restore a Snapshot
Note after the restoring of a snapshot with merge option in use the snapshot will be removed, so you must create another snapshot for a later use of the same state of the logical volume.
Convert-merge the snapshot with the source LV
If it is a root filesystem we need to boot in live Linux session in order to perform the steps, because it must be unmounted. It it is not a root filesystem, we need to unmount the logical volume first.
sudo umount /lv_name-mountpoint
sudo lvconvert --merge /dev/mapper/vg_name-lv_name_ss_at_date_220908
--merge
– An alias for--mergethin
,--mergemirrors
, or--mergesnapshot
, depending on the type of LV.--mergesnapshot
– Merge COW snapshot LV into its origin. When merging a snapshot, if both the origin and snapshot LVs are not open, the merge will start immediately. Otherwise, the merge will start the first time either the origin or snapshot LV are activated and both are closed. Merging a snapshot into an origin that cannot be closed, for example a root filesystem, is deferred until the next time the origin volume is activated. When merging starts, the resulting LV will have the origin's name, minor number and UUID. While the merge is in progress, reads or writes to the origin appear as being directed to the snapshot being merged. When the merge finishes, the merged snapshot is removed. Multiple snapshots may be specified on the command line or a @tag may be used to specify multiple snapshots be merged to their respective origin.
Deactivate, reactivate and remount the LV
If we are working within a live Linux session – i.e. we are restoring a root filesystem, – these steps will be performed at the next reboot. Otherwise we need to run the following steps in order to apply the changes without reboot.
sudo lvchange -an /dev/mapper/vg_name-lv_name
sudo lvchange -ay /dev/mapper/vg_name-lv_name
-a|
,--activate y|n|ay
– Change the active state of LVs. An active LV can be used through a block device, allowing data on the LV to be accessed.y
makes LVs active, or available.n
makes LVs inactive, or unavailable.- The block device for the LV is added or removed from the system using device-mapper in the kernel. A symbolic link
/dev/VGName/LVName
pointing to the device node is also added/removed. - All software and scripts should access the device through the symbolic link and present this as the name of the device. The location and name of the underlying device node may depend on the distribution, configuration (e.g.
udev
), or release version. ay
specifies auto-activation, which is used by system-generated activation commands. By default, LVs are auto-activated. An auto activation property can be set on a VG or LV to disable auto-activation, see--setautoactivation y|n
invgchange
,lvchange
,vgcreate
, andlvcreate
. Display the property withvgs
orlvs "-o autoactivation"
.- The
lvm.conf(5)
auto_activation_volume_list
includes names of VGs or LVs that should be auto-activated, and anything not listed is not auto-activated. Whenauto_activation_volume_list
is undefined (the default), it has no effect. Ifauto_activation_volume_list
is defined and empty, no LVs are auto activated. Items included byauto_activation_volume_list
will not be auto-activated if the activation property has been disabled. Seelvmlockd(8)
for more information about activation optionsey
andsy
for shared VGs.
- The block device for the LV is added or removed from the system using device-mapper in the kernel. A symbolic link
sudo mount -a # remount via /etc/fstab
df -h # list the mounted devices
# Deactivate and reactivate the logical volume
# --
# Remove snapshots
sudo lvremove /dev/kali-x-vg/root_at_20220822
References
- Red Hat Docs: Red Hat > [9] > Configuring and managing logical volumes
- Learn Linux TV at YouTube: Linux Logical Volume Manager (LVM) Deep Dive Tutorial
- Learn Linux TV: Linux Logical Volume Manager (LVM) Deep Dive Tutorial
- Linux Hint: LVM: How to List and Selectively Remove Snapshots
Assuming we want to create LVM and we want to occupy the entire disk space at /dev/sdb
. You can fdisk
or gdisk
to create a new GPT partition table that will wipe all partitions and create new partitions you need:
- If the device
/dev/sdb
will be used used as boot device you can create two partitions one for/boot
– Linux ext4 and one for the root fs/
– Linux LVM. - If the device
/dev/sdb
won't be used as boot device you can create only one for LVM.
Create partition table:
sudo fdisk /dev/sdb
# create a new empty GPT partition table
Command (m for help): g
# add a new partition
Command (m for help): n
Partition number (1-128, default 1): 1
First sector (2048-488397134, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-488397134, default 488397134): +1G
Created a new partition 1 of type 'Linux filesystem' and of size 1 GiB.
# add a new partition
Command (m for help): n
Partition number (2-128, default 2):
First sector (2099200-488397134, default 2099200):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2099200-488397134, default 488397134):
Created a new partition 2 of type 'Linux filesystem' and of size 231.9 GiB.
# change a partition type
Command (m for help): t
Partition number (1,2, default 2): 2
Partition type (type L to list all types): 31
Changed type of partition 'Linux filesystem' to 'Linux LVM'.
# print the partition table
Command (m for help): p
Disk /dev/sdb: 232.91 GiB, 250059350016 bytes, 488397168 sectors
Disk model: CT250MX500SSD1
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 005499CA-7834-434B-9C36-5306537C8CF1
Device Start End Sectors Size Type
/dev/sdb1 2048 2099199 2097152 1G Linux filesystem
/dev/sdb2 2099200 488397134 486297935 231.9G Linux LVM
Filesystem/RAID signature on partition 1 will be wiped.
# verify the partition table
Command (m for help): v
No errors detected.
Header version: 1.0
Using 2 out of 128 partitions.
A total of 0 free sectors is available in 0 segments (the largest is (null)).
# write table to disk and exit
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
Format the first partition /dev/sdb1
to ext4:
sudo mkfs.ext4 /dev/sdb1
mke2fs 1.45.5 (07-Jan-2020)
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: a6a72cfe-46f1-4caa-b114-6bf03f1efe7f
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
Create LVM physicals volume at the second partition /dev/sdb1
:
sudo pvcreate /dev/sdb2
Physical volume "/dev/sdb2" successfully created.
Create LVM volume group at /dev/sdb1
:
sudo vgcreate lvm-vm-group /dev/sdb2
Physical volume "/dev/sdb2" successfully created.
lvm-vm-group
is the name of the group, it is mater of your choice.
Create LVM logical volume at lvm-vm-group
:
sudo lvcreate -n vm-win-01 -L 60g lvm-vm-group
Logical volume "vm-win-01" created.
vm-win-01
is the name of the logical device, it is mater of your choice.
Check the result:
lsblk | grep -P 'sdb|lvm'
├─sdb1 8:17 0 1G 0 part
└─sdb2 8:18 0 231.9G 0 part
└─lvm--vm--group-vm--win--01 253:0 0 60G 0 lvm
References:
- DigitalOcean: How To Use LVM To Manage Storage Devices on Ubuntu 18.04
- Ubuntu Community Wiki: Ubuntu Desktop LVM
- SleepLessBeastie's notes: How to fix device excluded by a filter