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)