# Access permanent data

## Create the filesystem

gokrazy provides a handy way to create the permanent data filesystem on the fourth partition of your gokrazy installation. The gokrazy/mkfs program will create the filesystem. To actually access the permanent data partition from your own program, gokrazy will mount the partition under `/perm` directory during the startup.

You can add the `gokrazy/mkfs` program to your gokrazy instance:

    gok add github.com/gokrazy/mkfs

…or, if you want to run it only once without otherwise including it in your installation, you can use `gok run`:

    git clone https://github.com/gokrazy/mkfs
    cd mkfs
    gok -i bakery run

## Permanent data in action

The Go program demonstrates the functionality of the permanent data mount:

    package main

    import (
    	"encoding/json"
    	"errors"
    	"fmt"
    	"io/fs"
    	"io/ioutil"
    	"os"
    )

    const config = "/perm/my-example/config.json"

    type Config struct {
    	FilesToCreate int `json:"files_to_create"`
    }

    func main() {
    	_, err := os.Stat(config)
    	if err != nil {
    		fsErr := &fs.ErrNotExist
    		if !errors.As(err, fsErr) {
    			panic(err)
    		}

    		content, err := json.Marshal(&Config{FilesToCreate: 4})
    		if err != nil {
    			panic(err)
    		}

    		if err = ioutil.WriteFile(config, content, 0600); err != nil {
    			panic(err)
    		}
    	}

    	content, err := ioutil.ReadFile(config)
    	if err != nil {
    		panic(err)
    	}

    	var c Config
    	if err := json.Unmarshal(content, &c); err != nil {
    		panic(err)
    	}

    	for i := 0; i < c.FilesToCreate; i++ {
    		if err := ioutil.WriteFile(fmt.Sprintf("/perm/my-example/%d.txt", i), []byte("gokrazy rocks"), 0600); err != nil {
    			panic(err)
    		}
    	}
    }

## Manual inspection/modification

You can inspect and modify the data on the permanent data filesystem manually. This can be handy if you need e.g. to pass a configuration file for your application. To access the filesystem put the SD card into your PC/notebook. Your OS will likely mount the filesystem automatically. Copy the file to the permanent data filesystem.

    mkdir /path/to-mounted/filesystem/my-example
    sudo cp config.json /path/to-mounted/filesystem/my-example

If you want to access files on the permanent data filesystem you may need the sudo capability.

## Notes about macOS

In macOS, to identify what device file maps to the mini sd card use:

    $ diskutil list

If you want to create an ext4 filesystem from macOS, use the ext2/3/4 utilities. The easiest way to install them is via homebrew.

With the utilities installed you can run (replace X and Y based on the `diskutil list` output):

    $ sudo `brew --prefix e2fsprogs`/sbin/mkfs.ext4 /dev/diskXsY