File: initramfs20dirs.go

package info (click to toggle)
snapd 2.72-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 80,412 kB
  • sloc: sh: 16,506; ansic: 16,211; python: 11,213; makefile: 1,919; exp: 190; awk: 58; xml: 22
file content (143 lines) | stat: -rw-r--r-- 5,333 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// -*- Mode: Go; indent-tabs-mode: t -*-

/*
 * Copyright (C) 2020 Canonical Ltd
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3 as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package boot

import (
	"path/filepath"

	"github.com/snapcore/snapd/dirs"
	"github.com/snapcore/snapd/gadget"
)

var (
	// InitramfsRunMntDir is the directory where ubuntu partitions are mounted
	// during the initramfs.
	InitramfsRunMntDir string

	// InitramfsDataDir is the location of system-data role partition
	// (typically a partition labeled "ubuntu-data") during the initramfs.
	InitramfsDataDir string

	// InitramfsHostUbuntuDataDir is the location of the host ubuntu-data
	// during the initramfs, typically used in recover mode.
	InitramfsHostUbuntuDataDir string

	// InitramfsUbuntuBootDir is the location of ubuntu-boot during the
	// initramfs.
	InitramfsUbuntuBootDir string

	// InitramfsUbuntuSeedDir is the location of ubuntu-seed during the
	// initramfs.
	InitramfsUbuntuSeedDir string

	// InitramfsUbuntuSaveDir is the location of ubuntu-save during the
	// initramfs.
	InitramfsUbuntuSaveDir string

	// InstallHostFDESaveDir is the directory of the FDE data on the
	// ubuntu-save partition during install mode. For other modes,
	// use dirs.SnapSaveFDEDirUnder().
	InstallHostFDESaveDir string

	// InstallHostSaveDir is the directory of device data on ubuntu-save during
	// install mode. For other modes use dirs.SnapDeviceSaveDir
	InstallHostDeviceSaveDir string

	// InitramfsSeedEncryptionKeyDir is the location of the encrypted partition
	// keys during the initramfs on ubuntu-seed.
	InitramfsSeedEncryptionKeyDir string

	// InitramfsBootEncryptionKeyDir is the location of the encrypted partition
	// keys during the initramfs on ubuntu-boot.
	InitramfsBootEncryptionKeyDir string

	// InstallUbuntuDataDir is the location of the data partition during
	// install mode. This should always be on a physical partition.
	InstallUbuntuDataDir string

	// snapBootFlagsFile is the location of the file that is used
	// internally for saving the current boot flags active for this boot.
	snapBootFlagsFile string
)

// InstallHostWritableDir is the location of the writable partition of the
// installed host during install mode. This should always be on a physical
// partition.
func InstallHostWritableDir(mod gadget.Model) string {
	if mod.Classic() {
		return InstallUbuntuDataDir
	}
	return filepath.Join(InstallUbuntuDataDir, "system-data")
}

// InitramfsHostWritableDir is the location of the host writable
// partition during the initramfs, typically used in recover mode.
func InitramfsHostWritableDir(mod gadget.Model) string {
	if mod.Classic() {
		return InitramfsHostUbuntuDataDir
	}
	return filepath.Join(InitramfsHostUbuntuDataDir, "system-data")
}

// InitramfsWritableDir is the location of the writable partition during the
// initramfs. Note that this may refer to a temporary filesystem or a
// physical partition depending on what system mode the system is in.
//
// This needs the "isRunMode" in the future for when we implement a
// recovery system on "classic+modes". In this scenario in "run" mode
// we have the debian based rootfs in /run/mnt/ubuntu-data *but* in
// "recover" mode the rootfs comes from a base snap like "core22" so
// we need to generate "ubuntu-core" like paths.
func InitramfsWritableDir(mod gadget.Model, isRunMode bool) string {
	if mod.Classic() && isRunMode {
		return InitramfsDataDir
	}
	return filepath.Join(InitramfsDataDir, "system-data")
}

// InstallHostFDEDataDir is the location of the FDE data during install mode.
func InstallHostFDEDataDir(mod gadget.Model) string {
	return dirs.SnapFDEDirUnder(InstallHostWritableDir(mod))
}

func setInitramfsDirVars(rootdir string) {
	InitramfsRunMntDir = filepath.Join(rootdir, "run/mnt")
	InitramfsDataDir = filepath.Join(InitramfsRunMntDir, "data")
	InitramfsHostUbuntuDataDir = filepath.Join(InitramfsRunMntDir, "host", "ubuntu-data")
	InitramfsUbuntuBootDir = filepath.Join(InitramfsRunMntDir, "ubuntu-boot")
	InitramfsUbuntuSeedDir = filepath.Join(InitramfsRunMntDir, "ubuntu-seed")
	InitramfsUbuntuSaveDir = filepath.Join(InitramfsRunMntDir, "ubuntu-save")

	InstallHostDeviceSaveDir = filepath.Join(InitramfsUbuntuSaveDir, "device")
	InstallHostFDESaveDir = filepath.Join(InstallHostDeviceSaveDir, "fde")
	InitramfsSeedEncryptionKeyDir = filepath.Join(InitramfsUbuntuSeedDir, "device/fde")
	InitramfsBootEncryptionKeyDir = filepath.Join(InitramfsUbuntuBootDir, "device/fde")

	InstallUbuntuDataDir = filepath.Join(InitramfsRunMntDir, "ubuntu-data")

	snapBootFlagsFile = filepath.Join(dirs.SnapRunDir, "boot-flags")
}

func init() {
	setInitramfsDirVars(dirs.GlobalRootDir)
	// register to change the values of Initramfs* dir values when the global
	// root dir changes
	dirs.AddRootDirCallback(setInitramfsDirVars)
}