Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

My /home partition consists of an entire physical disk. It is formatted as btrfs. I want to snapshot it. I'm confused regarding subvolume naming, in particular.

I am aware that there are similar questions, but each similar question seems to be asking something different from what I'm asking (and they are older, which means probably outdated, given the rapid development of btrfs). For example, the answer to this question is apparently not the answer to my question because my /home partition is a separate volume and the man page for btrfs shows a different command for creating snapshots now.

another similar problem, no solid solution.
someone else as confused as me on the naming issues

My question:

Starting simple: is this the correct command to take a simple snapshot of my home partition?

btrfs subvolume snapshot /home/@home /home/@home_snapshot_20120421

I got really brave and tested it and it does not work. The error is error accessing /home/@home. As shown below, @home is listed.

I'm obviously confused on subvolume names. Do I need to use them in creating snapshots? Some examples show taking snapshots of home using /home as the source parameter, but based on examples of root volumes, it seems to me that I need to use /home/@home.

Would this command work? And if not, why?

btrfs subvolume snapshot /home /home/@home_snapshot_20120421

Is the @ just a naming convention? Is it meaningful at all?

Here's some output that may be relevant:

btrfs subvolume list /home
ID 256 top level 5 path @home

I'm not sure what that means, exactly. When I try btrfs device scan it gives an error (e.g. unable to scan the device /dev/sda1). My file system doesn't have any errors. Everything is fine.

Here are my partitions. In response to one reply, no /home is not my only btrfs partition.

/dev/sda1: (boot partition) TYPE="ext2"  
/dev/sda2: (root partition) TYPE="btrfs"  
/dev/sdb1: (home partition) TYPE="btrfs"  
/dev/sdc1: (shared partition) TYPE="btrfs"  
/dev/sdc2: TYPE="swap"  
share|improve this question
    
the community will decide about repo... –  One Zero Jun 16 '12 at 12:05
add comment

3 Answers

up vote 8 down vote accepted

What is the correct command to create a snapshot of my home partition on Ubuntu 12.04?

Given the fact that home is on a btrfs partition and it is mounted as /home, the correct command is:

sudo btrfs subvolume snapshot /home/ /home/<any_name_you_choose_for_the_snapshot>

Here are my results:

Before running the command today:
btrfs subvolume list /home
ID 256 top level 5 path @home
ID 257 top level 5 path @home/@snapshot_20120521_1936

The command:
sudo btrfs subvolume snapshot /home/ /home/@snapshot_20120611_1307
Create a snapshot of '/home/' in '/home/@snapshot_20120611_1307'

After running the command today:
btrfs subvolume list /home
ID 256 top level 5 path @home
ID 257 top level 5 path @home/@snapshot_20120521_1936
ID 258 top level 5 path @home/@snapshot_20120611_1307

The only issue with this method is that snapshots show up when you ls (list) /home.

The Ubuntu community Wiki has been updated with a solution for this. Here it is:

How to work with snaphots in Ubuntu's layout

In order to work with snapshots of / or /home in the Ubuntu layout it is very convenient to mount the btrfs filesystem at a separate location, and work from the top of the btrfs tree, rather than from the mounted subvolumes. <-- that is the solution. Unfortunately, it is not convenient.

sudo mount /dev/sdX# /mnt

To create a snapshot use the same syntax I used above:

sudo btrfs subvolume snapshot /mnt/@ /mnt/@_snapshot

This will create a snapshot of the @ subvolume named @_snapshot located also in the top of the btrfs tree. Since it is in the top of the tree, it will not show up when listing files in a mounted volume.

To roll back to a snapshot, you simply need to change its name to the name that ubuntu mounts and reboot. Here's how to change the name:

sudo mv /mnt/@ /mnt/@_badroot
sudo mv /mnt/@_snapshot /mnt/@

To delete a snapshot use:

sudo btrfs subvolume delete /mnt/@_badroot

btrfs snapshots are subvolumes in themselves, and self-contained, deleting the old @ subvolume like this is fine, provided we have a replacement.

NOTE: The btrfs-tools command ''set-default'' will break Ubuntu's layout

share|improve this answer
    
So you're there right? Now you should be able to mount your snapshots. –  turbo Jun 11 '12 at 19:56
    
I actually haven't tried mounting them yet. And I just saw psusi's answer about the apt-btrfs-snapshot package. That looks interesting, right? –  MountainX Jun 11 '12 at 22:36
    
Yeah I mentioned it in the third point too. Sorry had to point it out ;) –  turbo Jun 12 '12 at 0:58
    
I suggest you mark your solution as answer then. –  turbo Jun 13 '12 at 17:18
    
There is a solution to the snapshots showing up when you ls /home. I'm editing my answer with the info now. –  MountainX Aug 28 '12 at 0:04
add comment

Ok first things first:

  • The name of the subvolume you are looking at is @home as shown by btrfs subvolume list /home. It's mounted in /home. @home is the name of the subvolume also it has the ID 256 so most likely only your /home is formated as btrfs.

  • Now to create a snapshot of @home you have to issue: sudo btrfs subvolume snapshot /home/ /home/@home_snapshot_20120421

  • The subvolume can have any name. The @ is Ubuntu's convention at install time. (If you use apt-btrfs-snapshot the root subvolume has to be named @ btw.) The community wiki strongly recommends keeping @ as root and @home as home since it is mounted that way. This is especially important if you want to roll back: You should NOT use btrfs subvolume set-default (not syntax highlited by purpose).

  • For btrfs device scan you have to use sudo.

  • To delete a subvolume you can use sudo btrfs subvolume delete @home_snapshot_20120421

All btrfs commands can be abbreviated as long as they are unambiguous, so for example sudo btrfs device scan can be truncated to sudo btrfs d s, sudo btrfs dev sc or anything in between.

I hope that answered your questions. There are some tools out there to take regular backups, btrfs-snapshot-rotation is one example. Use those with caution since none of them are really mature or gained enough traction, i.e. they may very well contain bugs.

share|improve this answer
    
I get an error: $ sudo btrfs subvolume snapshot @home home/@snapshot_20120611_1257 ERROR: error accessing '@home' –  MountainX Jun 11 '12 at 16:58
    
Thankyou for updating ... –  One Zero Jun 11 '12 at 17:09
    
Also, I didn't have success with btrfs device scan yet. Any variant, including using sudo gives the error "ERROR: unable to scan the device '/dev/sdX'" where X is any valid name such as a, a1, b, etc. –  MountainX Jun 11 '12 at 17:19
    
@OneZero: I don't have all the answers yet, but I did figure out the correct command to create a snapshot of my home partition on Ubuntu 12.04 and I provided that info as an answer below. –  MountainX Jun 11 '12 at 17:20
    
that is indeed strange. I checked with my btrfs partition btrfs sub snap @ /mnt/random and it worked for me. Then again I was in /mnt where @ was mounted. Sorry for the confusion –  turbo Jun 11 '12 at 17:42
show 1 more comment

Install the apt-btrfs-snapshot package, and use its subcommands list, snapshot, delete and set-default.

This is a script that wraps the lower level btrfs commands. It works by first mounting the btrfs root filesystem somewhere. By that I mean the real root, as opposed to the /@ subvolume that is normally mounted as /. In other words, you need to run mount /dev/sda1 /mnt so you can view the subvolumes that will be listed as /mnt/@, /mnt/@home, and any others you have created. From there you can btrfs subvolume snapshot /mnt/@home @snapshot-today, which will create a snapshot of /@home named /@snapshot-today. Compare this with running btrfs subvolume snapshot /home /home/@snapshot_today, which instead creates the snapshot as a child of /@home, hence it shows up when you ls /home and its real name is /@home/@snapshot-today.

Rolling back a snapshot is just a simple rename operation: mv /mnt/@home @backup ; mv /mnt/@snapshot-today @home. The next time you boot, when it goes to mount /@home in /home, it will find the snapshot.

It's a bit tricky to wrap your head around because you have to keep in mind the difference between how btrfs sees things vs how the kernel sees things, which is influenced by the mount options ( the subvol= argument specifically ).

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.