Tuesday, 10 August 2021

Creating File system with Linux LVM

Creating File system with Linux LVM

Adding new disk to Linux vm and creating LVM File system

I am planning to perform following action.
Add 1GB disk to a Linux vm from VMware workstation.
Create a LVM disk with the added 1GB disk
Mount it as additional data disk to linux vm.

Environment description
Guest VM Name: nfs server 
Guest OS: CentOS Linux release 8.4.2105
VMware® Workstation 16 Pro 16.1.2 build-17966106

Current VM hardware:

Guest Linux Details:

[root@nfsserver ~]# date
Tue Aug 10 14:46:35 IST 2021
[root@nfsserver ~]# df -h
Filesystem                Size  Used Avail Use% Mounted on
devtmpfs                  877M     0  877M   0% /dev
tmpfs                     896M     0  896M   0% /dev/shm
tmpfs                     896M  8.7M  887M   1% /run
tmpfs                     896M     0  896M   0% /sys/fs/cgroup
/dev/mapper/cl_test-root   37G  1.7G   36G   5% /
/dev/sda1                1014M  195M  820M  20% /boot
tmpfs                     180M     0  180M   0% /run/user/0
[root@nfsserver ~]# cat /etc/redhat-release
CentOS Linux release 8.4.2105
[root@nfsserver ~]# hostname
nfsserver.jk.com
[root@nfsserver ~]#


Adding new disk in Workstation.
From the Workstation Vm  -> Go to settings 
From Virtual machine settings Click on ADD at the bottom



I am going to use ISCSI, so i can add disks without powering off the vm machine.

I am creating a new virtual disk .vmdk file will be created. You can choose to use existing virtual disk files also.


I am creating 1GB and storing it as a single file.
You can also choose to store it as multiple files but if you need more performance we can go for single virtual files also maintaining multiple file disk becomes complex.

You can opt to save this disk file in separate location or with the vm also and name it on your style. I am going with default name and location which is with the vm.




Once completed you can click ok and proceed.


We have now successfully added the 1GB disk onto the server and we need to login to guest vm and make it visible inside guest os to use it. 

Login to the server and scan the scsi host adapters to refresh and list the attached devices. 
If you have added the disks with vm power off state then you will not require to scan as it will be scanned when server is powered on.

Scanning SCSI Disk from Linux vm

My server has 3 host adapters host{0,1,2} So i will scan for 3 adapters to see which adapter has the disk.
Host adapters will be listed under /sys/class/scsi_host/

[root@nfsserver ~]# ls /sys/class/scsi_host/
host0  host1  host2
[root@nfsserver ~]#

I will be executing below commands to scan the newly added disks
echo "- - -" > /sys/class/scsi_host/host0/scan
echo "- - -" > /sys/class/scsi_host/host1/scan
echo "- - -" > /sys/class/scsi_host/host2/scan



For me new disk was attached to host2. Once scan is done - you can see newly added disk with lsblk command.

Partitioning the Disk

I am using fdisk -l command to create disk partition table and mark it as LVM as i am familiar with it. 
You can also use parted. 

Execute fdisk -l /dev/sdb to see details of the disk.
Here you can see there is no partition table created and it is 1GB in size which is what i have added from workstation. 

[root@nfsserver scsi_host]# fdisk -l /dev/sdb
Disk /dev/sdb: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
[root@nfsserver scsi_host]#

Execute fdisk /dev/sdb to create partition table
Once in the fdisk console 
To create GPT disk label issue "g"
To Print the created table issue "p"
To create new partition issue "n" 
You will need to provide partition number, First sector and Last sector. I am providing defaults and 
Partition number (1-128, default 1):
First sector (2048-2097118, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-2097118, default 2097118):

To mark the partition type issue "t"
To mark the partition as LVM issue "31" -- This might vary in older release of centos it was 8e
To save created partition and exit console issue "w"

[root@nfsserver ~]# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help):  g
Created a new GPT disklabel (GUID: 696462B2-DD16-384D-8745-D4E2514F3B7F).

Command (m for help): p
Disk /dev/sdb: 1 GiB, 1073741824 bytes, 2097152 sectors
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: 696462B2-DD16-384D-8745-D4E2514F3B7F

Command (m for help): n
Partition number (1-128, default 1):
First sector (2048-2097118, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-2097118, default 2097118):

Created a new partition 1 of type 'Linux filesystem' and of size 1023 MiB.

Command (m for help): p
Disk /dev/sdb: 1 GiB, 1073741824 bytes, 2097152 sectors
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: 696462B2-DD16-384D-8745-D4E2514F3B7F

Device     Start     End Sectors  Size Type
/dev/sdb1   2048 2097118 2095071 1023M Linux filesystem

Command (m for help): 

Command (m for help): t
Selected partition 1
Partition type (type L to list all types): 31
Changed type of partition 'Linux filesystem' to 'Linux LVM'.

Command (m for help): p
Disk /dev/sdb: 1 GiB, 1073741824 bytes, 2097152 sectors
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: 696462B2-DD16-384D-8745-D4E2514F3B7F

Device     Start     End Sectors  Size Type
/dev/sdb1   2048 2097118 2095071 1023M Linux LVM

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

[root@nfsserver ~]#

Issue lsblk to see the partition created

[root@nfsserver ~]# lsblk
NAME             MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                8:0    0   40G  0 disk
├─sda1             8:1    0    1G  0 part /boot
└─sda2             8:2    0   39G  0 part
  ├─cl_test-root 253:0    0   37G  0 lvm  /
  └─cl_test-swap 253:1    0    2G  0 lvm  [SWAP]
sdb                8:16   0    1G  0 disk
└─sdb1             8:17   0 1023M  0 part
sr0               11:0    1  723M  0 rom
[root@nfsserver ~]#

Still you dont have a filesystem mounted df -h will not list you the newly created partition.

[root@nfsserver ~]# df -h
Filesystem                Size  Used Avail Use% Mounted on
devtmpfs                  877M     0  877M   0% /dev
tmpfs                     896M     0  896M   0% /dev/shm
tmpfs                     896M  8.7M  887M   1% /run
tmpfs                     896M     0  896M   0% /sys/fs/cgroup
/dev/mapper/cl_test-root   37G  1.7G   36G   5% /
/dev/sda1                1014M  195M  820M  20% /boot
tmpfs                     180M     0  180M   0% /run/user/0
[root@nfsserver ~]#

Creating Logical volume 

First we need to create a physical volume command syntax is 
Syntax: pvcreate partition_name
partition_name=/dev/sdb1

Once created you can list it using pvdisplay comand 
[root@nfsserver ~]# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created.
[root@nfsserver ~]#

[root@nfsserver ~]# pvdisplay /dev/sdb1
  "/dev/sdb1" is a new physical volume of "1022.98 MiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name
  PV Size               1022.98 MiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               WZrfHl-fR33-W1sX-La0W-ZDRH-gXQS-HEYwTk

[root@nfsserver ~]#

Once PV is created we can create a Volume group on top of it. 
Syntax: vgcreate vg_name pv_name
vg_name=vgdata
pv_name=/dev/sdb1

[root@nfsserver ~]# vgcreate vgdata /dev/sdb1
  Volume group "vgdata" successfully created
[root@nfsserver ~]#

[root@nfsserver ~]# vgdisplay vgdata
  --- Volume group ---
  VG Name               vgdata
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               1020.00 MiB
  PE Size               4.00 MiB
  Total PE              255
  Alloc PE / Size       0 / 0
  Free  PE / Size       255 / 1020.00 MiB
  VG UUID               1ErkXI-EhVp-224p-KHT7-7opk-fjlV-N9X4HD

[root@nfsserver ~]#

Now we have a PV and VG on top of it, Lets create a LV now
syntax: lvcreate --size size --name lv_name vg_name
lv_name=lvdata
vg_name=vgdata
size=1020MiB

[root@nfsserver ~]# lvcreate --size 1020MiB --name lvdata vgdata
  Logical volume "lvdata" created.
[root@nfsserver ~]#  lvdisplay /dev/vgdata/lvdata
  --- Logical volume ---
  LV Path                /dev/vgdata/lvdata
  LV Name                lvdata
  VG Name                vgdata
  LV UUID                vPPTZN-MTPO-AiAP-Osfg-yzls-lRwR-Zw7wot
  LV Write Access        read/write
  LV Creation host, time nfsserver.jk.com, 2021-08-10 15:12:19 +0530
  LV Status              available
  # open                 0
  LV Size                1020.00 MiB
  Current LE             255
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2

[root@nfsserver ~]#

Once we have created LV we can create a filesystem like ext2/3/4, xfs whatever we require from there. 

I am using XFS filesystem.
syntax: mkfs.xfs lv_name
lv_name=  /dev/vgdata/lvdata

[root@nfsserver ~]# mkfs.xfs /dev/vgdata/lvdata
meta-data=/dev/vgdata/lvdata     isize=512    agcount=4, agsize=65280 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=261120, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=1566, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@nfsserver ~]#

Mounting LV
Create a new directory where you want to mount this newly create filesystem.
Directory name = /datanew
Mount syntax: mount lv_name directory_name
lv_name = /dev/vgdata/lvdata
directory_name = /datanew


[root@nfsserver ~]# mkdir /datanew
[root@nfsserver ~]# mount /dev/vgdata/lvdata /datanew/
[root@nfsserver ~]#

Once mounted you can see the filesystem with df -h 

[root@nfsserver ~]# df -h /datanew/
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/vgdata-lvdata 1014M   40M  975M   4% /datanew
[root@nfsserver ~]#

Set Mount to be persistent after reboot.
Add the mount entry to /etc/fstab
You can provide the lv name or its UUID in the fstab file.
I prefer to use UUID 

syntax: UUID="ID" mount_directory Filesystem_type defaults 0 0 
mount_directory=/datanew
UUID= cd8f30ed-d938-4deb-8eec-0e72ed4c9810
You can get UUID number of a lv using blkid as below
 
[root@nfsserver ~]# blkid /dev/mapper/vgdata-lvdata
/dev/mapper/vgdata-lvdata: UUID="cd8f30ed-d938-4deb-8eec-0e72ed4c9810" BLOCK_SIZE="512" TYPE="xfs"
[root@nfsserver ~]#


[root@nfsserver ~]# cat /etc/fstab | grep datanew
UUID=cd8f30ed-d938-4deb-8eec-0e72ed4c9810       /datanew        xfs     defaults        0 0
[root@nfsserver ~]#
[root@nfsserver ~]# mount -a
[root@nfsserver ~]# df -h /datanew/
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/vgdata-lvdata 1014M   40M  975M   4% /datanew
[root@nfsserver ~]#

We have successfully added 1GB disk and mounted it as a xfs filesystem with LVM.
Next time i will try to extend this LVM disk with another 1GB in another blog.




1 comment: