diff --git a/src/libstore/store.cc b/src/libstore/store.cc
index 9c68c3392b4f991d2f4d0bccfa6903e09b8d756e..25e2d6e360093f68f14536d10a5d64adfbd0e984 100644
--- a/src/libstore/store.cc
+++ b/src/libstore/store.cc
@@ -76,10 +76,24 @@ static void upgradeStore07();
 static void upgradeStore09();
 
 
-void openDB()
+void openDB(bool reserveSpace)
 {
     if (readOnlyMode) return;
 
+    try {
+        Path reservedPath = nixDBPath + "/reserved";
+        off_t reservedSize = 1024 * 1024;
+        if (reserveSpace) {
+            struct stat st;
+            if (stat(reservedPath.c_str(), &st) == -1 ||
+                st.st_size != reservedSize)
+                writeFile(reservedPath, string(1024 * 1024, 'X'));
+        }
+        else
+            deletePath(reservedPath);
+    } catch (SysError & e) { /* don't care about errors */
+    }
+
     try {
         nixDB.open(nixDBPath);
     } catch (DbNoPermission & e) {
diff --git a/src/libstore/store.hh b/src/libstore/store.hh
index 2d8018d5fabcadb73a5f412be7639deeafe57c9f..c617585bab962945fd79be3fb14635e1de4e4cf2 100644
--- a/src/libstore/store.hh
+++ b/src/libstore/store.hh
@@ -37,8 +37,14 @@ struct Substitute
 typedef list<Substitute> Substitutes;
 
 
-/* Open the database environment. */
-void openDB();
+/* Open the database environment.  If `reserveSpace' is true, make
+   sure that a big empty file exists in /nix/var/nix/db/reserved.  If
+   `reserveSpace' is false, delete this file if it exists.  The idea
+   is that on normal operation, the file exists; but when we run the
+   garbage collector, it is deleted.  This is to ensure that the
+   garbage collector has a small amount of disk space available, which
+   is required to open the Berkeley DB environment. */
+void openDB(bool reserveSpace = true);
 
 /* Create the required database tables. */
 void initDB();
diff --git a/src/nix-store/main.cc b/src/nix-store/main.cc
index 88e6720c020a612a4b162775675c6dc808789b7d..0ee7b0a7e95521e0e681c6eba51406a9d45dd184 100644
--- a/src/nix-store/main.cc
+++ b/src/nix-store/main.cc
@@ -686,7 +686,7 @@ void run(Strings args)
     if (!op) throw UsageError("no operation specified");
 
     if (op != opDump && op != opRestore) /* !!! hack */
-        openDB();
+        openDB(op != opGC);
 
     op(opFlags, opArgs);
 }