In this guide, we’ll learn how to create a non-boot persistent disk, attach it to a VM, and prepare it for use. This is a very common use case when you want to store application data separately from your VM’s boot disk.
🔹 Step 01: Introduction
We will perform the following tasks:
- Create a non-boot persistent disk using Compute Engine → Storage → Disks.
- Attach this disk to a VM instance.
- Mount the disk inside the VM.
- Create some test files and verify the disk.
👉 Before starting, make sure you have your startup script file (webserver-install.sh) uploaded into Cloud Shell.
Here’s the script we’ll use to install Nginx and prepare a demo web page:
#!/bin/bash sudo apt install -y telnet sudo apt install -y nginx sudo systemctl enable nginx sudo chmod -R 755 /var/www/html HOSTNAME=$(hostname) sudo echo "<!DOCTYPE html> <html> <body style='background-color:rgb(250, 210, 210);'> <h1>Welcome to Latchu@DevOps - WebVM App1 </h1> <p><strong>VM Hostname:</strong> $HOSTNAME</p> <p><strong>VM IP Address:</strong> $(hostname -I)</p> <p><strong>Application Version:</strong> V1</p> <p>Google Cloud Platform - Demos</p> </body></html>" | sudo tee /var/www/html/index.html
🔹 Step 02: Create a New VM Instance
Now let’s create a VM instance that will act as our application server.
gcloud compute instances create demo7-vm \ --zone=us-central1-a \ --machine-type=e2-micro \ --network-interface=subnet=default \ --tags=http-server \ --metadata-from-file=startup-script=webserver-install.sh # List all compute instances gcloud compute instances list
This will provision a new VM (demo7-vm) with our webserver startup script pre-installed.
🔹 Step 03: Create a Persistent Disk (Non-Boot Disk)
You can create a disk from the Google Cloud Console:
- Go to: Compute Engine → Storage → Disks → Create Disk
- Name: mydisk1
- Description: mydisk1
- Location: Single Zone
- Region: us-central1
- Zone: us-central1-a
- Disk type: Balanced Persistent Disk (pd-balanced)
- Size: 15GB
- Encryption: Use default Google-managed encryption OR your own CMEK (KMS Key)
- Add Label: environment=dev
- Click Create
Now disk is available to attach to the VM
👉 Alternatively, you can also create the disk using gcloud CLI:
# Create a Blank Disk gcloud compute disks create mydisk1 \ --project=gcplearn9 \ --type=pd-balanced \ --description=mydisk1 \ --size=15GB \ --zone=us-central1-a
If you want to use a Customer Managed Encryption Key (CMEK) from Cloud KMS:
gcloud compute disks create mydisk1 \ --project=gcplearn9 \ --type=pd-balanced \ --description=mydisk1 \ --size=15GB \ --zone=us-central1-a \ --kms-key=projects/gcp-zero-to-hero-468909/locations/us-central1/keyRings/my-keyring1/cryptoKeys/my-symkey-1/cryptoKeyVersions/1
🔹 Step 04: Attach the Disk to the VM
Once the disk is created, let’s attach it to our VM.
Using Google Cloud Console:
- Navigate to Compute Engine → VM Instances → demo7-vm → Edit.
- Scroll down to Additional Disks → Click Attach existing disk.
- Select mydisk1.
- Mode: Read/Write
- Deletion Rule: Keep disk
- Device Name: Auto-filled based on disk name.
- Click Save.
Now, the disk is attached to your VM but not yet mounted.
🔹 Step 05: List and Mount Disks on the VM
Now that we have attached the persistent disk to our VM, let’s verify and mount it.
SSH into the VM:
# Connect to VM instance using Cloud Shell gcloud compute ssh --zone "us-central1-a" "demo7-vm" --project "gcpdemos"
List attached disks:
ls -l /dev/disk/by-id/google-*
👉 You’ll notice a new device, for example /dev/sdb. This is our blank persistent disk.
Sample Output:
devops_samira@demo7-vm:~$ ls -lh /dev/disk/by-id/google-* lrwxrwxrwx 1 root root 9 Aug 26 08:44 /dev/disk/by-id/google-mydisk1 -> ../../sda lrwxrwxrwx 1 root root 9 Aug 26 08:44 /dev/disk/by-id/google-persistent-disk-0 -> ../../sdb lrwxrwxrwx 1 root root 10 Aug 26 08:44 /dev/disk/by-id/google-persistent-disk-0-part1 -> ../../sdb1 lrwxrwxrwx 1 root root 11 Aug 26 08:44 /dev/disk/by-id/google-persistent-disk-0-part14 -> ../../sdb14 lrwxrwxrwx 1 root root 11 Aug 26 08:44 /dev/disk/by-id/google-persistent-disk-0-part15 -> ../../sdb15
Format the disk:
sudo mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sda
Create a mount directory and mount the disk:
sudo mkdir -p /mnt/disks/myapp1 sudo mount -o discard,defaults /dev/sda /mnt/disks/myapp1
Set permissions:
sudo chmod a+w /mnt/disks/myapp1
Verify the mount point:
df -h
Sample Output:
devops_samira@demo7-vm:~$ df -h Filesystem Size Used Avail Use% Mounted on udev 474M 0 474M 0% /dev tmpfs 97M 460K 97M 1% /run /dev/sdb1 9.7G 2.2G 7.0G 24% / tmpfs 485M 0 485M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock /dev/sdb15 124M 12M 113M 10% /boot/efi tmpfs 97M 0 97M 0% /run/user/1000 /dev/sda 15G 24K 15G 1% /mnt/disks/myapp1
Test by creating a file:
echo "New disk attached" >> /mnt/disks/myapp1/newdisk.txt cat /mnt/disks/myapp1/newdisk.txt
🔹 Step 06: Configure Automatic Mounting on VM Restart
By default, the new disk won’t automatically mount after a reboot. To fix this, we’ll configure /etc/fstab.
Backup fstab:
sudo cp /etc/fstab /etc/fstab.backup
Get the UUID of the new disk:
sudo blkid /dev/sdb
Sample Output:
devops_samira@demo7-vm:~$ sudo blkid /dev/sdb /dev/sdb: PTUUID="eb1122e4-9c88-1e40-a53a-a48aad3822fa" PTTYPE="gpt"
Update /etc/fstab with the UUID:
echo UUID=eb1122e4-9c88-1e40-a53a-a48aad3822fa /mnt/disks/myapp1 ext4 discard,defaults,nofail 0 2 | sudo tee -a /etc/fstab
Verify the fstab entry:
cat /etc/fstab
Run mount check:
sudo mount -a sudo systemctl daemon-reload
If there are no errors, the disk will now auto-mount after every reboot.
🔹 Step 07: Stop and Start VM to Verify Persistence
Let’s test our setup by stopping and starting the VM.
# Stop VM gcloud compute instances stop demo7-vm --zone=us-central1-a # Start VM gcloud compute instances start demo7-vm --zone=us-central1-a
Now SSH back into the VM and verify:
gcloud compute ssh --zone "us-central1-a" "demo7-vm" --project "gcpdemos" # Check disk mount df -h # Verify file persists cat /mnt/disks/myapp1/newdisk.txt # Create new file to confirm echo "my new file 101" >> /mnt/disks/myapp1/mynewfile.txt ls /mnt/disks/myapp1/ cat /mnt/disks/myapp1/mynewfile.txt
✅ If everything looks good, your persistent disk is successfully attached and auto-mounted even after VM restarts.
🔹 Resizing Boot & Non-Boot Disks in Google Compute Engine
In this section, we’ll learn how to resize both boot and non-boot persistent disks attached to a VM instance in GCP.
👉 Best Practice: Always take snapshots of your disks before resizing in production. Snapshots can be used to restore your VM or data if anything goes wrong. In this demo, we’ll skip snapshots for simplicity.
🔹 Step 01: Introduction
Boot Disk Resize
- If you are using GCP-provided public images (like Debian, Ubuntu, CentOS), the root partition and file system will auto-resize after increasing the boot disk size and restarting the VM.
- If using custom images, you may need to manually resize the root partition.
Non-Boot Disk Resize
- After resizing the non-boot disk, you must extend the file system manually inside the VM.
🔹 Step 02: Stop the VM
Before resizing, stop the VM.
# Stop VM Instance gcloud compute instances stop demo7-vm --zone=us-central1-a # Verify status gcloud compute instances list --filter='name:demo7-vm'
🔹 Step 03: Resize Boot Disk
- Navigate to Compute Engine → Storage → Disks → demo7-vm → Edit
- Current size: 10GB
- New size: 20GB
- Click Save
🔹 Step 04: Resize Non-Boot Disk
- Navigate to Compute Engine → Storage → Disks → mydisk1 → Edit
- Current size: 15GB
- New size: 25GB
- Click Save
🔹 Step 05: Start VM and Verify Root Disk
# Start VM Instance gcloud compute instances start demo7-vm --zone=us-central1-a # Connect to VM gcloud compute ssh --zone "us-central1-a" "demo7-vm" --project "gcpdemos" # Verify Root Disk Size sudo df -Th
Sample Output:
devops_samira@demo7-vm:~$ df -h Filesystem Size Used Avail Use% Mounted on udev 474M 0 474M 0% /dev tmpfs 97M 464K 97M 1% /run /dev/sda1 20G 2.2G 17G 12% / tmpfs 485M 0 485M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock /dev/sda15 124M 12M 113M 10% /boot/efi /dev/sdb 15G 32K 15G 1% /mnt/disks/myapp1 tmpfs 97M 0 97M 0% /run/user/1000
👉 As expected, the boot disk auto-resized to 20GB because Debian supports it. Non-boot disk still shows 15GB.
🔹 Step 06: Resize Non-Boot Disk Inside VM
Check attached devices
sudo lsblk
Sample Output:
devops_samira@demo7-vm:~$ sudo lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 20G 0 disk ├─sda1 8:1 0 19.9G 0 part / ├─sda14 8:14 0 3M 0 part └─sda15 8:15 0 124M 0 part /boot/efi sdb 8:16 0 25G 0 disk /mnt/disks/myapp1
Extend the filesystem
sudo resize2fs /dev/sdb
Sample Output:
devops_samira@demo7-vm:~$ sudo resize2fs /dev/sdb resize2fs 1.47.0 (5-Feb-2023) Filesystem at /dev/sdb is mounted on /mnt/disks/myapp1; on-line resizing required old_desc_blocks = 2, new_desc_blocks = 4 The filesystem on /dev/sdb is now 6553600 (4k) blocks long.
Verify new size
sudo df -Th
Sample Output:
devops_samira@demo7-vm:~$ sudo df -Th Filesystem Type Size Used Avail Use% Mounted on udev devtmpfs 474M 0 474M 0% /dev tmpfs tmpfs 97M 464K 97M 1% /run /dev/sda1 ext4 20G 2.2G 17G 12% / tmpfs tmpfs 485M 0 485M 0% /dev/shm tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock /dev/sda15 vfat 124M 12M 113M 10% /boot/efi /dev/sdb ext4 25G 32K 25G 1% /mnt/disks/myapp1 tmpfs tmpfs 97M 0 97M 0% /run/user/1000
✅ Now both boot disk (20GB) and non-boot disk (25GB) are resized successfully.
🔹 Step 07: Cleanup (Stop/Delete VM and Disk)
To avoid unnecessary charges in your demo environment:
# Stop VM gcloud compute instances stop demo7-vm --zone=us-central1-a # Delete VM gcloud compute instances delete demo7-vm --zone=us-central1-a # Delete Disk gcloud compute disks delete mydisk1 --zone=us-central1-a
Top comments (0)