# Filesystem & Mounts

Guest code sees a virtual Linux filesystem, never the host's. `node:fs` works as
usual, and whatever the code writes is discarded with the VM. A one-shot call
discards it when the call ends. On a [VM](/secure-exec/docs/vms) you created,
files last until you dispose it.

To exchange individual files with a VM, use
[`vm.filesystem`](/secure-exec/docs/vms). To share a whole directory with the
guest, mount it. `mounts` is a VM option.

## Mount a host directory

secure-exec/examples/mounts/src/index.ts:

```ts
// Project one host directory into the VM, read-only. The guest sees only the
// mounted subtree, never the rest of the host.
const hostData = fileURLToPath(new URL("../host-data", import.meta.url));

const read = await execute(
	`
	import { readFileSync } from "node:fs";
	console.log(readFileSync("/mnt/data/greeting.txt", "utf8").trim());
	`,
	{
		mounts: [hostDirMount("/mnt/data", hostData)],
		output: { capture: "all" },
	},
);
console.log(read.stdout?.trim()); // hello from the host
```

## Mount node_modules

secure-exec/examples/mounts/src/index.ts:

```ts
// Mount a host directory of packages as the guest's node_modules, so code can
// import packages you already have with no network and no install step. Point it
// at your project's `node_modules` in a real app.
const hostModules = fileURLToPath(new URL("../host-modules", import.meta.url));

const imported = await execute(
	`
	import { greet } from "greet";
	console.log(greet("secure-exec"));
	`,
	{
		mounts: [nodeModulesMount(hostModules)],
		output: { capture: "all" },
	},
);
console.log(imported.stdout?.trim()); // hello, secure-exec
```

## More filesystems

Secure Exec accepts agentOS `mounts` and `rootFilesystem` unchanged, including
in-memory, S3, and custom backends. Read the
[agentOS filesystem docs](/agentos/docs/filesystem) for the details.
