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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
|
.\" Automatically generated by Pandoc 2.14.0.3
.\"
.TH "mkosi" "1" "2016-" "" ""
.hy
.SH NAME
.PP
mkosi \[em] Build Bespoke OS Images
.SH SYNOPSIS
.PP
\f[C]mkosi [options\&...] build\f[R]
.PP
\f[C]mkosi [options\&...] clean\f[R]
.PP
\f[C]mkosi [options\&...] summary\f[R]
.PP
\f[C]mkosi [options\&...] shell [command line\&...]\f[R]
.PP
\f[C]mkosi [options\&...] boot [nspawn settings\&...]\f[R]
.PP
\f[C]mkosi [options\&...] qemu\f[R]
.PP
\f[C]mkosi [options\&...] ssh\f[R]
.PP
\f[C]mkosi [options\&...] serve\f[R]
.PP
\f[C]mkosi [options\&...] bump\f[R]
.PP
\f[C]mkosi [options\&...] genkey\f[R]
.PP
\f[C]mkosi [options\&...] help\f[R]
.SH DESCRIPTION
.PP
\f[C]mkosi\f[R] is a tool for easily building customized OS images.
It\[cq]s a fancy wrapper around \f[C]dnf --installroot\f[R],
\f[C]debootstrap\f[R], \f[C]pacstrap\f[R] and \f[C]zypper\f[R] that may
generate disk images with a number of bells and whistles.
.SS Command Line Verbs
.PP
The following command line verbs are known:
.TP
\f[B]\f[CB]build\f[B]\f[R]
This builds the image, based on the settings passed in on the command
line or read from a \f[C]mkosi.default\f[R] file.
This verb is the default if no verb is explicitly specified.
This command must be executed as \f[C]root\f[R].
Any arguments passed after \f[C]build\f[R] are passed as arguments to
the build script (if there is one).
.TP
\f[B]\f[CB]clean\f[B]\f[R]
Remove build artifacts generated on a previous build.
If combined with \f[C]-f\f[R], also removes incremental build cache
images.
If \f[C]-f\f[R] is specified twice, also removes any package cache.
.TP
\f[B]\f[CB]summary\f[B]\f[R]
Outputs a human-readable summary of all options used for building an
image.
This will parse the command line and \f[C]mkosi.default\f[R] file as it
would do on \f[C]build\f[R], but only output what it is configured for
and not actually build anything.\[ga]
.TP
\f[B]\f[CB]shell\f[B]\f[R]
This builds the image if it is not built yet, and then invokes
\f[C]systemd-nspawn\f[R] to acquire an interactive shell prompt in it.
If this verb is used an optional command line may be specified which is
then invoked in place of the shell in the container.
Combine this with \f[C]-f\f[R] in order to rebuild the image
unconditionally before acquiring the shell, see below.
This command must be executed as \f[C]root\f[R].
.TP
\f[B]\f[CB]boot\f[B]\f[R]
Similar to \f[C]shell\f[R] but boots the image up using
\f[C]systemd-nspawn\f[R].
If this verb is used an optional command line may be specified which is
passed as \[lq]kernel command line\[rq] to the init system in the image.
.TP
\f[B]\f[CB]qemu\f[B]\f[R]
Similar to \f[C]boot\f[R] but uses \f[C]qemu\f[R] to boot up the image,
i.e.\ instead of container virtualization VM virtualization is used.
This verb is only supported on images that contain a boot loader,
i.e.\ those built with \f[C]Bootable=yes\f[R] (see below).
This command must be executed as \f[C]root\f[R] unless the image already
exists and \f[C]-f\f[R] is not specified.
.TP
\f[B]\f[CB]ssh\f[B]\f[R]
When the image is built with the \f[C]Ssh=yes\f[R] option, this command
connects to a booted (\f[C]boot\f[R], \f[C]qemu\f[R] verbs) container/VM
via SSH.
Make sure to run \f[C]mkosi ssh\f[R] with the same config as
\f[C]mkosi build\f[R] was run with so that it has the necessary
information available to connect to the running container/VM via SSH.
.TP
\f[B]\f[CB]serve\f[B]\f[R]
This builds the image if it is not built yet, and then serves the output
directory (i.e.\ usually \f[C]mkosi.output/\f[R], see below) via a small
embedded HTTP server, listening on port 8081.
Combine with \f[C]-f\f[R] in order to rebuild the image unconditionally
before serving it.
This command is useful for testing network based acquisition of OS
images, for example via \f[C]machinectl pull-raw \&...\f[R] and
\f[C]machinectl pull-tar \&...\f[R].
.TP
\f[B]\f[CB]bump\f[B]\f[R]
Determines the current image version string (as configured with
\f[C]ImageVersion=\f[R]/\f[C]--image-version=\f[R]), increases its last
dot-separated component by one and writes the resulting version string
to \f[C]mkosi.version\f[R].
This is useful for implementing a simple versioning scheme: each time
this verb is called the version is bumped in preparation for the
subsequent build.
Note that \f[C]--auto-bump\f[R]/\f[C]-B\f[R] may be used to
automatically bump the version after each successful build.
.TP
\f[B]\f[CB]genkey\f[B]\f[R]
Generate a pair of SecureBoot keys for usage with the
\f[C]SecureBootKey=\f[R]/\f[C]--secure-boot-key=\f[R] and
\f[C]SecureBootCertificate=\f[R]/\f[C]--secure-boot-certificate=\f[R]
options.
.TP
\f[B]\f[CB]help\f[B]\f[R]
This verb is equivalent to the \f[C]--help\f[R] switch documented below:
it shows a brief usage explanation.
.SS Execution flow
.PP
Execution flow for \f[C]mkosi build\f[R].
Columns represent the execution context.
Default values/calls are shown in parentheses.
When building with \f[C]--incremental\f[R] mkosi creates a cache of the
distribution installation for both images if not already existing and
replaces the distribution installation in consecutive runs with data
from the cached one.
.IP
.nf
\f[C]
HOST . BUILD . FINAL
. IMAGE . IMAGE
. .
start . .
| . .
v . .
build script? -------exists-----> copy .
| . skeleton trees .
| . (mkosi.skeleton/) .
none . | .
| . v .
v . install .
skip . distribution, .
build image . packages and .
| . build packages, .
| . run .
| . prepare script .
| . (mkosi.prepare build) .
| . or if incremental .
| . use cached build image .
| . | .
| . v .
| . copy .
| . build sources .
| . (./) .
| . | .
| . v .
| . copy .
| . extra trees .
| . (mkosi.extra/) .
| . | .
| . v .
| . run .
| . postinstall script .
| . (mkosi.postinst build) .
| . | .
| .-------------------------\[aq] .
| | . .
| v . .
| run . .
| finalize script . .
|(mkosi.finalize build). .
| | . .
| \[aq]-------------------------. .
| . | .
| . v .
| . run .
| . build script .
| . (mkosi.build) .
| . | .
\[aq]-----------------------------------+------------------------.
. . |
. . v
. . copy
. . skeleton trees
. . (mkosi.skeleton/)
. . |
. . v
. . install
. . distribution
. . and packages,
. . run
. . prepare script
. . (mkosi.prepare final)
. . or if incremental
. . use cached final image
. . |
. . v
. . copy
. . build results
. . |
. . v
. . copy
. . extra trees
. . (mkosi.extra/)
. . |
. . v
. . run
. . postinstall script
. . (mkosi.postinst final)
. . |
. . v
. . |
. . perform cleanup
. . (remove files, packages,
. . package metadata)
. . |
.--------------------------------------------------\[aq]
| . .
v . .
run . .
finalize script . .
(mkosi.finalize final) . .
| . .
.---------\[aq] . .
| . .
v . .
end . .
. .
HOST . BUILD . FINAL
. IMAGE . IMAGE
. .
\f[R]
.fi
.SS Supported output formats
.PP
The following output formats are supported:
.IP \[bu] 2
Raw \f[I]GPT\f[R] disk image, with ext4 as root (\f[I]gpt_ext4\f[R])
.IP \[bu] 2
Raw \f[I]GPT\f[R] disk image, with xfs as root (\f[I]gpt_xfs\f[R])
.IP \[bu] 2
Raw \f[I]GPT\f[R] disk image, with btrfs as root (\f[I]gpt_btrfs\f[R])
.IP \[bu] 2
Raw \f[I]GPT\f[R] disk image, with squashfs as read-only root
(\f[I]gpt_squashfs\f[R])
.IP \[bu] 2
Plain squashfs image, without partition table, as read-only root
(\f[I]plain_squashfs\f[R])
.IP \[bu] 2
Plain directory, containing the OS tree (\f[I]directory\f[R])
.IP \[bu] 2
btrfs subvolume, with separate subvolumes for \f[C]/var\f[R],
\f[C]/home\f[R], \f[C]/srv\f[R], \f[C]/var/tmp\f[R]
(\f[I]subvolume\f[R])
.IP \[bu] 2
Tar archive (\f[I]tar\f[R])
.IP \[bu] 2
CPIO archive (\f[I]cpio\f[R]) in the format appropriate for a kernel
initrd
.PP
When a \f[I]GPT\f[R] disk image is created, the following additional
options are available:
.IP \[bu] 2
A swap partition may be added in
.IP \[bu] 2
The image may be made bootable on \f[I]EFI\f[R] and \f[I]BIOS\f[R]
systems
.IP \[bu] 2
Separate partitions for \f[C]/srv\f[R] and \f[C]/home\f[R] may be added
in
.IP \[bu] 2
The root, \f[C]/srv\f[R] and \f[C]/home\f[R] partitions may optionally
be encrypted with LUKS.
.IP \[bu] 2
A dm-verity partition may be added in that adds runtime integrity data
for the root partition
.SS Configuration Settings
.PP
The following settings can be set through configuration files (the
syntax with \f[C]SomeSetting=value\f[R]) and on the command line (the
syntax with \f[C]--some-setting=value\f[R]).
For some command line parameters, a single-letter shortcut is also
allowed.
In the configuration files, the setting must be in the appropriate
section, so the settings are grouped by section below.
.PP
Command line options that take no argument are shown without \[lq]=\[rq]
in their long version.
In the config files, they should be specified with a boolean argument:
either \[lq]1\[rq], \[lq]yes\[rq], or \[lq]true\[rq] to enable, or
\[lq]0\[rq], \[lq]no\[rq], \[lq]false\[rq] to disable.
.SS [Distribution] Section
.TP
\f[B]\f[CB]Distribution=\f[B]\f[R], \f[B]\f[CB]--distribution=\f[B]\f[R], \f[B]\f[CB]-d\f[B]\f[R]
The distribution to install in the image.
Takes one of the following arguments: \f[C]fedora\f[R],
\f[C]debian\f[R], \f[C]ubuntu\f[R], \f[C]arch\f[R], \f[C]opensuse\f[R],
\f[C]mageia\f[R], \f[C]centos\f[R], \f[C]centos_epel\f[R],
\f[C]clear\f[R], \f[C]photon\f[R], \f[C]openmandriva\f[R],
\f[C]rocky\f[R], \f[C]rocky_epel\f[R], \f[C]alma\f[R],
\f[C]alma_epel\f[R].
If not specified, defaults to the distribution of the host.
.TP
\f[B]\f[CB]Release=\f[B]\f[R], \f[B]\f[CB]--release=\f[B]\f[R], \f[B]\f[CB]-r\f[B]\f[R]
The release of the distribution to install in the image.
The precise syntax of the argument this takes depends on the
distribution used, and is either a numeric string (in case of Fedora
Linux, CentOS, \&..., e.g.\ \f[C]29\f[R]), or a distribution version
name (in case of Debian, Ubuntu, \&..., e.g.\ \f[C]artful\f[R]).
If neither this option, nor \f[C]Distribution=\f[R] is specified,
defaults to the distribution version of the host.
If the distribution is specified, defaults to a recent version of it.
.TP
\f[B]\f[CB]Mirror=\f[B]\f[R], \f[B]\f[CB]--mirror=\f[B]\f[R], \f[B]\f[CB]-m\f[B]\f[R]
The mirror to use for downloading the distribution packages.
Expects a mirror URL as argument.
.TP
\f[B]\f[CB]Repositories=\f[B]\f[R], \f[B]\f[CB]--repositories=\f[B]\f[R]
Additional package repositories to use during installation.
Expects one or more URLs as argument, separated by commas.
This option may be used multiple times, in which case the list of
repositories to use is combined.
Use \[lq]!*\[rq] to remove all repositories from to the list or use
e.g.\ \[lq]!repo-url\[rq] to remove just one specific repository.
For Arch Linux, additional repositories must be passed in the form
\f[C]<name>::<url>\f[R] (e.g.\ \f[C]myrepo::https://myrepo.net\f[R]).
.TP
\f[B]\f[CB]UseHostRepositories=\f[B]\f[R], \f[B]\f[CB]--use-host-repositories\f[B]\f[R]
This option is only applicable for RPM-based distributions:
\f[I]CentOS\f[R], \f[I]Fedora Linux\f[R], \f[I]Mageia\f[R],
\f[I]Photon\f[R], \f[I]Rocky Linux\f[R], \f[I]Alma Linux\f[R] and
\f[I]OpenMandriva\f[R].
Allows use of the host\[cq]s existing RPM repositories.
By default, a hardcoded set of default RPM repositories is generated and
used.
Use \f[C]--repositories=\f[R] to identify a custom set of repositories
to be enabled and used for the build.
.TP
\f[B]\f[CB]RepositoryDirectory\f[B]\f[R], \f[B]\f[CB]--repository-directory\f[B]\f[R]
This option can (for now) only be used with RPM-based istributions and
Arch Linux.
It identifies a directory containing extra repository definitions that
will be used when installing packages.
The files are passed directly to the corresponding package manager and
should be written in the format expected by the package manager of the
image\[cq]s distro.
.TP
\f[B]\f[CB]Architecture=\f[B]\f[R], \f[B]\f[CB]--architecture=\f[B]\f[R]
The architecture to build the image for.
Note that this currently only works for architectures compatible with
the host\[cq]s architecture.
.SS [Output] Section
.TP
\f[B]\f[CB]Format=\f[B]\f[R], \f[B]\f[CB]--format=\f[B]\f[R], \f[B]\f[CB]-t\f[B]\f[R]
The image format type to generate.
One of \f[C]directory\f[R] (for generating OS images inside a local
directory), \f[C]subvolume\f[R] (similar, but as a btrfs subvolume),
\f[C]tar\f[R] (similar, but a tarball of the image is generated),
\f[C]cpio\f[R] (similar, but a cpio archive is generated),
\f[C]gpt_ext4\f[R] (a block device image with an ext4 file system inside
a GPT partition table), \f[C]gpt_xfs\f[R] (similar, but with an xfs file
system), \f[C]gpt_btrfs\f[R] (similar, but with an btrfs file system),
\f[C]gpt_squashfs\f[R] (similar, but with a squashfs file system),
\f[C]plain_squashfs\f[R] (a plain squashfs file system without a
partition table).
.TP
\f[B]\f[CB]ManifestFormat=\f[B]\f[R], \f[B]\f[CB]--manifest-format=\f[B]\f[R]
The manifest format type or types to generate.
A comma-delimited list consisting of \f[C]json\f[R] (the standard JSON
output format that describes the packages installed),
\f[C]changelog\f[R] (a human-readable text format designed for diffing).
Defaults to \f[C]json\f[R].
.TP
\f[B]\f[CB]Output=\f[B]\f[R], \f[B]\f[CB]--output=\f[B]\f[R], \f[B]\f[CB]-o\f[B]\f[R]
Path for the output image file to generate.
Takes a relative or absolute path where the generated image will be
placed.
If neither this option nor \f[C]OutputDirectory=\f[R] is used, the image
is generated under the name \f[C]image\f[R], but its name suffixed with
an appropriate file suffix (e.g.\ \f[C]image.raw.xz\f[R] in case
\f[C]gpt_ext4\f[R] is used in combination with \f[C]xz\f[R]
compression).
If the \f[C]ImageId=\f[R] option is configured it is used instead of
\f[C]image\f[R] in the default output name.
If an image version is specified via \f[C]ImageVersion=\f[R], it is
included in the default name, e.g.\ a specified image version of
\f[C]7.8\f[R] might result in an image file name of
\f[C]image_7.8.raw.xz\f[R].
.TP
\f[B]\f[CB]OutputSplitRoot=\f[B]\f[R], \f[B]\f[CB]--output-split-root=\f[B]\f[R], \f[B]\f[CB]OutputSplitVerify=\f[B]\f[R], \f[B]\f[CB]--output-split-verity=\f[B]\f[R], \f[B]\f[CB]OutputSplitKernel=\f[B]\f[R], \f[B]\f[CB]--output-split-kernel=\f[B]\f[R]
Paths for the split-out output image files, when
\f[C]SplitArtifacts=yes\f[R] is used.
If unspecified, the relevant split artifact files will be named like the
main image, but with \f[C].root\f[R], \f[C].verity\f[R], and
\f[C].efi\f[R] suffixes inserted (and in turn possibly suffixed by
compression suffix, if compression is enabled).
.TP
\f[B]\f[CB]OutputDirectory=\f[B]\f[R], \f[B]\f[CB]--output-dir=\f[B]\f[R], \f[B]\f[CB]-O\f[B]\f[R]
Path to a directory where to place all generated artifacts (i.e.\ the
generated image when an output path is not given, \f[C]SHA256SUMS\f[R]
file, etc.).
If this is not specified and the directory \f[C]mkosi.output/\f[R]
exists in the local directory, it is automatically used for this
purpose.
If the setting is not used and \f[C]mkosi.output/\f[R] does not exist,
all output artifacts are placed adjacent to the output image file.
.TP
\f[B]\f[CB]WorkspaceDirectory=\f[B]\f[R], \f[B]\f[CB]--workspace-dir=\f[B]\f[R]
Path to a directory where to store data required temporarily while
building the image.
This directory should have enough space to store the full OS image,
though in most modes the actually used disk space is smaller.
If not specified, and \f[C]mkosi.workspace/\f[R] exists in the local
directory, it is used for this purpose.
Otherwise, a subdirectory in the temporary storage area is used
(\f[C]$TMPDIR\f[R] if set, \f[C]/var/tmp/\f[R] otherwise).
The data in this directory is removed automatically after each build.
It\[cq]s safe to manually remove the contents of this directory should
an \f[C]mkosi\f[R] invocation be aborted abnormally (for example, due to
reboot/power failure).
If the \f[C]btrfs\f[R] output modes are selected this directory must be
backed by \f[C]btrfs\f[R] too.
.TP
\f[B]\f[CB]Force=\f[B]\f[R], \f[B]\f[CB]--force\f[B]\f[R], \f[B]\f[CB]-f\f[B]\f[R]
Replace the output file if it already exists, when building an image.
By default when building an image and an output artifact already exists
\f[C]mkosi\f[R] will refuse operation.
Specify this option once to delete all build artifacts from a previous
run before re-building the image.
If incremental builds are enabled, specifying this option twice will
ensure the intermediary cache files are removed, too, before the
re-build is initiated.
If a package cache is used (also see the \[lq]Files\[rq] section below),
specifying this option thrice will ensure the package cache is removed
too, before the re-build is initiated.
For the \f[C]clean\f[R] operation this option has a slightly different
effect: by default the verb will only remove build artifacts from a
previous run, when specified once the incremental cache files are
deleted too, and when specified twice the package cache is also removed.
.PP
.TP
\f[B]\f[CB]GPTFirstLBA=\f[B]\f[R], \f[B]\f[CB]--gpt-first-lba=\f[B]\f[R]
Override the first usable LBA (Logical Block Address) within the GPT
header.
This defaults to \f[C]2048\f[R], which is actually the desired value.
However, some tools, e.g.\ the \f[C]prl_disk_tool\f[R] utility from the
Parallels virtualization suite require this to be set to \f[C]34\f[R],
otherwise they might fail to resize the disk image and/or partitions
inside it.
.TP
\f[B]\f[CB]Bootable=\f[B]\f[R], \f[B]\f[CB]--bootable\f[B]\f[R], \f[B]\f[CB]-b\f[B]\f[R]
Generate a bootable image.
By default this will generate an image bootable on UEFI systems.
Use \f[C]BootProtocols=\f[R] to select support for a different boot
protocol.
.TP
\f[B]\f[CB]BootProtocols=\f[B]\f[R], \f[B]\f[CB]--boot-protocols=\f[B]\f[R]
Pick one or more boot protocols to support when generating a bootable
image, as enabled with \f[C]Bootable=\f[R].
Takes a comma-separated list of \f[C]uefi\f[R] or \f[C]bios\f[R].
May be specified more than once in which case the specified lists are
merged.
If \f[C]uefi\f[R] is specified the \f[C]sd-boot\f[R] UEFI boot loader is
used, if \f[C]bios\f[R] is specified the GNU Grub boot loader is used.
Use \[lq]!*\[rq] to remove all previously added protocols or
\[lq]!protocol\[rq] to remove one protocol.
.TP
\f[B]\f[CB]KernelCommandLine=\f[B]\f[R], \f[B]\f[CB]--kernel-command-line=\f[B]\f[R]
Use the specified kernel command line when building bootable images.
By default command line arguments get appended.
To remove all arguments from the current list pass \[lq]!*\[rq].
To remove specific arguments add a space separated list of \[lq]!\[rq]
prefixed arguments.
For example adding \[lq]!* console=ttyS0 rw\[rq] to a
\f[C]mkosi.default\f[R] file or the command line arguments passes
\[lq]console=ttyS0 rw\[rq] to the kernel in any case.
Just adding \[lq]console=ttyS0 rw\[rq] would append these two arguments
to the kernel command line created by lower priority configuration files
or previous \f[C]KernelCommandLine=\f[R] command line arguments.
.TP
\f[B]\f[CB]SecureBoot=\f[B]\f[R], \f[B]\f[CB]--secure-boot\f[B]\f[R]
Sign the resulting kernel/initrd image for UEFI SecureBoot.
.TP
\f[B]\f[CB]SecureBootKey=\f[B]\f[R], \f[B]\f[CB]--secure-boot-key=\f[B]\f[R]
Path to the PEM file containing the secret key for signing the UEFI
kernel image, if \f[C]SecureBoot=\f[R] is used.
.TP
\f[B]\f[CB]SecureBootCertificate=\f[B]\f[R], \f[B]\f[CB]--secure-boot-certificate=\f[B]\f[R]
Path to the X.509 file containing the certificate for the signed UEFI
kernel image, if \f[C]SecureBoot=\f[R] is used.
.TP
\f[B]\f[CB]SecureBootCommonName=\f[B]\f[R], \f[B]\f[CB]--secure-boot-common-name=\f[B]\f[R]
Common name to be used when generating SecureBoot keys via mkosi\[cq]s
\f[C]genkey\f[R] command.
Defaults to \f[C]mkosi of %u\f[R], where \f[C]%u\f[R] expands to the
username of the user invoking mkosi.
.TP
\f[B]\f[CB]SecureBootValidDays=\f[B]\f[R], \f[B]\f[CB]--secure-boot-valid-days=\f[B]\f[R]
Number of days that the keys should remain valid when generating
SecureBoot keys via mkosi\[cq]s \f[C]genkey\f[R] command.
Defaults to two years (730 days).
.TP
\f[B]\f[CB]ReadOnly=\f[B]\f[R], \f[B]\f[CB]--read-only\f[B]\f[R]
Set the read-only flag on the root partition in the partition table.
Only applies to \f[C]gpt_ext4\f[R], \f[C]gpt_xfs\f[R],
\f[C]gpt_btrfs\f[R], \f[C]subvolume\f[R] output formats, and is implied
on \f[C]gpt_squashfs\f[R] and \f[C]plain_squashfs\f[R].
The read-only flag is essentially a hint to tools using the image (see
https://systemd.io/DISCOVERABLE_PARTITIONS/).
In particular, all systemd tools like \f[C]systemd-nspawn\f[R] and
\f[C]systemd-gpt-auto-generator\f[R] will mount such partitions
read-only, but tools from other project may ignore the flag.
.TP
\f[B]\f[CB]Minimize=\f[B]\f[R], \f[B]\f[CB]--minimize\f[B]\f[R]
Attempt to make the resulting root file system as small as possible by
removing free space from the file system.
Only supported for \f[C]gpt_ext4\f[R] and \f[C]gpt_btrfs\f[R].
For ext4 this relies on \f[C]resize2fs -M\f[R], which reduces the free
disk space but is not perfect and generally leaves some free space.
For btrfs the results are optimal and no free space is left.
.TP
\f[B]\f[CB]Encrypt=\f[B]\f[R], \f[B]\f[CB]--encrypt\f[B]\f[R]
Encrypt all partitions in the file system or just the root file system.
Takes either \f[C]all\f[R] or \f[C]data\f[R] as argument.
If \f[C]all\f[R], the root, \f[C]/home\f[R] and \f[C]/srv\f[R] file
systems will be encrypted using dm-crypt/LUKS (with its default
settings).
If \f[C]data\f[R], the root file system will be left unencrypted, but
\f[C]/home\f[R] and \f[C]/srv\f[R] will be encrypted.
The passphrase to use is read from the \f[C]mkosi.passphrase\f[R] file
in the current working directory.
Note that the UEFI System Partition (ESP) containing the boot loader and
kernel to boot is never encrypted since it needs to be accessible by the
firmware.
.TP
\f[B]\f[CB]Verity=\f[B]\f[R], \f[B]\f[CB]--verity\f[B]\f[R]
Add a \[lq]Verity\[rq] integrity partition to the image.
Takes a boolean or the special value \f[C]signed\f[R], and defaults to
disabled.
If enabled, the root partition (or \f[C]/usr/\f[R] partition, in case
\f[C]UsrOnly=\f[R] is enabled) is protected with \f[C]dm-verity\f[R]
against offline modification, the verification data is placed in an
additional GPT partition.
Implies \f[C]ReadOnly=yes\f[R].
If this is enabled, the Verity root hash is written to an output file
with \f[C].roothash\f[R] or \f[C].usrhash\f[R] suffix.
If set to \f[C]signed\f[R], Verity is also enabled, but the resulting
root hash is then also signed (in PKCS#7 format) with the signature key
configured with \f[C]SecureBootKey=\f[R].
Or in other words: the SecureBoot key pair is then used to both sign the
kernel, if that is enabled, and the root/\f[C]/usr/\f[R] file system.
This signature is then stored in an additional output file with the
\f[C].roothash.p7s\f[R] or \f[C].usrhash.p7s\f[R] suffix in DER format.
It is also written to an additional partition in the image.
The latter allows generating self-contained signed disk images,
implementing the Verity provisions described in the Discoverable
Partitions Specification (https://systemd.io/DISCOVERABLE_PARTITIONS).
.TP
\f[B]\f[CB]CompressFs=\f[B]\f[R], \f[B]\f[CB]--compress-fs=\f[B]\f[R]
Enable or disable internal compression in the file system.
Only applies to output formats with squashfs or btrfs.
Takes one of \f[C]zlib\f[R], \f[C]lzo\f[R], \f[C]zstd\f[R],
\f[C]lz4\f[R], \f[C]xz\f[R] or a boolean value as argument.
If the latter is used compression is enabled/disabled and the default
algorithm is used.
In case of the \f[C]squashfs\f[R] output formats compression is implied,
but this option may be used to select the algorithm.
.TP
\f[B]\f[CB]CompressOutput=\f[B]\f[R], \f[B]\f[CB]--compress-output=\f[B]\f[R]
Configure compression for the resulting image or archive.
The argument can be either a boolean or a compression algorithm
(\f[C]xz\f[R], \f[C]zstd\f[R]).
\f[C]xz\f[R] compression is used by default.
Note that when applied to block device image types this means the image
cannot be started directly but needs to be decompressed first.
This also means that the \f[C]shell\f[R], \f[C]boot\f[R], \f[C]qemu\f[R]
verbs are not available when this option is used.
Implied for \f[C]tar\f[R] and \f[C]cpio\f[R].
.TP
\f[B]\f[CB]Compress=\f[B]\f[R], \f[B]\f[CB]--compress=\f[B]\f[R]
Enable compression.
Using this option is equivalent to either \f[C]CompressFs=\f[R] or
\f[C]CompressOutput=\f[R]; the appropriate type of compression is
selected automatically.
.TP
\f[B]\f[CB]Mksquashfs=\f[B]\f[R], \f[B]\f[CB]--mksquashfs=\f[B]\f[R]
Set the path to the \f[C]mksquashfs\f[R] executable to use.
This is useful in case the parameters for the tool shall be augmented,
as the tool may be replaced by a script invoking it with the right
parameters, this way.
.TP
\f[B]\f[CB]QCow2=\f[B]\f[R], \f[B]\f[CB]--qcow2\f[B]\f[R]
Encode the resulting image as QEMU QCOW2 image.
This only applies to \f[C]gpt_ext4\f[R], \f[C]gpt_xfs\f[R],
\f[C]gpt_btrfs\f[R], \f[C]gpt_squashfs\f[R].
QCOW2 images can be read natively by \f[C]qemu\f[R], but not by the
Linux kernel.
This means the \f[C]shell\f[R] and \f[C]boot\f[R] verbs are not
available when this option is used, however \f[C]qemu\f[R] will work.
.TP
\f[B]\f[CB]Hostname=\f[B]\f[R], \f[B]\f[CB]--hostname=\f[B]\f[R]
Set the image\[cq]s hostname to the specified name.
.TP
\f[B]\f[CB]ImageVersion=\f[B]\f[R], \f[B]\f[CB]--image-version=\f[B]\f[R]
Configure the image version.
This accepts any string, but it is recommended to specify a series of
dot separated components.
The version may also be configured in a file \f[C]mkosi.version\f[R] in
which case it may be conveniently managed via the \f[C]bump\f[R] verb or
the \f[C]--auto-bump\f[R] switch.
When specified the image version is included in the default output file
name, i.e.\ instead of \f[C]image.raw\f[R] the default will be
\f[C]image_0.1.raw\f[R] for version \f[C]0.1\f[R] of the image, and
similar.
The version is also passed via the \f[C]$IMAGE_VERSION\f[R] to any build
scripts invoked (which may be useful to patch it into
\f[C]/etc/os-release\f[R] or similar, in particular the
\f[C]IMAGE_VERSION=\f[R] field of it).
.TP
\f[B]\f[CB]ImageId=\f[B]\f[R], \f[B]\f[CB]--image-id=\f[B]\f[R]
Configure the image identifier.
This accepts a freeform string that shall be used to identify the image
with.
If set the default output file will be named after it (possibly suffixed
with the version).
If this option is used the root, \f[C]/usr/\f[R] and Verity partitions
in the image will have their labels set to this (possibly suffixed by
the image version).
The identifier is also passed via the \f[C]$IMAGE_ID\f[R] to any build
scripts invoked (which may be useful to patch it into
\f[C]/etc/os-release\f[R] or similar, in particular the
\f[C]IMAGE_ID=\f[R] field of it).
.TP
\f[B]\f[CB]WithUnifiedKernelImages=\f[B]\f[R], \f[B]\f[CB]--without-unified-kernel-images\f[B]\f[R]
If specified, mkosi does not build unified kernel images and instead
installs kernels with a separate initrd and boot loader config to the
efi or bootloader partition.
.TP
\f[B]\f[CB]HostonlyInitrd=\f[B]\f[R], \f[B]\f[CB]--hostonly-initrd\f[B]\f[R]
If specified, mkosi will run the tool to create the initrd such that a
non-generic initrd is created that will only be able to run on the
system mkosi is run on.
Currently mkosi uses dracut for all supported distributions except Clear
Linux and this option translates to enabling dracut\[cq]s hostonly
option.
.TP
\f[B]\f[CB]UsrOnly=\f[B]\f[R], \f[B]\f[CB]--usr-only\f[B]\f[R]
If specified, \f[C]mkosi\f[R] will only add the \f[C]/usr/\f[R]
directory tree (instead of the whole root file system) to the image.
This is useful for fully stateless systems that come up pristine on
every single boot, where \f[C]/etc/\f[R] and \f[C]/var/\f[R] are
populated by \f[C]systemd-tmpfiles\f[R]/\f[C]systemd-sysusers\f[R] and
related calls, or systems that are originally shipped without a root
file system, but where \f[C]systemd-repart\f[R] adds one on the first
boot.
.TP
\f[B]\f[CB]SplitArtifacts=\f[B]\f[R], \f[B]\f[CB]--split-artifacts\f[B]\f[R]
If specified and building an image with a partition table, also write
out the root file system partition, its Verity partition (if configured)
and the generated unified kernel (if configured) into separate output
files.
This is useful in A/B update scenarios where an existing disk image
shall be augmented with a new version of a root or \f[C]/usr\f[R]
partition along with its Verity partition and unified kernel.
.TP
\f[B]\f[CB]NoChown=\f[B]\f[R], \f[B]\f[CB]--no-chown\f[B]\f[R]
By default, if \f[C]mkosi\f[R] is run inside a \f[C]sudo\f[R]
environment all generated artifacts have their UNIX user/group ownership
changed to the user which invoked \f[C]sudo\f[R].
With this option this may be turned off and all generated files are
owned by \f[C]root\f[R].
.TP
\f[B]\f[CB]TarStripSELinuxContext=\f[B]\f[R], \f[B]\f[CB]--tar-strip-selinux-context\f[B]\f[R]
If running on a SELinux-enabled system (Fedora Linux, CentOS, Rocky
Linux, Alma Linux), files inside the container are tagged with SELinux
context extended attributes (\f[C]xattrs\f[R]), which may interfere with
host SELinux rules in building or further container import stages.
This option strips SELinux context attributes from the resulting tar
archive.
.TP
\f[B]\f[CB]MachineID=\f[B]\f[R], \f[B]\f[CB]--machine-id\f[B]\f[R]
Set the machine\[cq]s ID to the specified value.
If unused, a random ID will be used while building the image and the
final image will be shipped without a machine ID.
.SS [Content] Section
.TP
\f[B]\f[CB]BasePackages=\f[B]\f[R], \f[B]\f[CB]--base-packages\f[B]\f[R]
Takes a boolean or the special value \f[C]conditional\f[R].
If true, automatically install packages to ensure basic functionality,
as appropriate for the given image type.
For example, \f[C]systemd\f[R] is always included,
\f[C]systemd-udev\f[R] and \f[C]dracut\f[R] if the image is bootable,
and so on.
If false, only packages specified with \f[C]Packages=\f[R] will be
installed.
If \f[C]conditional\f[R], the list of packages to install will be
extended with boolean dependencies (c.f.
https://rpm.org/user_doc/boolean_dependencies.html), to install specific
packages when \f[I]other\f[R] packages are in the list.
For example, \f[C]systemd-udev\f[R] may be automatically included if the
image is bootable and \f[C]systemd\f[R] is installed.
With this, various \[lq]base\[rq] packages still need to be specified if
they should be included, but the corresponding \[lq]extension\[rq]
packages will be added automatically when appropriate.
This feature depends on support in the package manager, so it is not
implemented for all distributions.
.TP
\f[B]\f[CB]Packages=\f[B]\f[R], \f[B]\f[CB]--package=\f[B]\f[R], \f[B]\f[CB]-p\f[B]\f[R]
Install the specified distribution packages (i.e.\ RPM, DEB, \&...) in
the image.
Takes a comma separated list of package specifications.
This option may be used multiple times in which case the specified
package lists are combined.
Packages specified this way will be installed both in the development
and the final image.
Use \f[C]BuildPackages=\f[R] to specify packages that shall only be used
for the image generated in the build image, but that shall not appear in
the final image.
The types and syntax of \[lq]package specifications\[rq] that are
allowed depend on the package installer (e.g.\ \f[C]dnf\f[R] or
\f[C]yum\f[R] for \f[C]rpm\f[R]-based distros or \f[C]apt\f[R] for
\f[C]deb\f[R]-based distros), but may include package names, package
names with version and/or architecture, package name globs, paths to
packages in the file system, package groups, and virtual provides,
including file paths.
To remove a package e.g.\ added by a \f[C]mkosi.default\f[R]
configuration file prepend the package name with \f[C]!\f[R].
For example -p \[lq]!apache2\[rq] would remove the apache2 package.
To replace the apache2 package by the httpd package just add -p
\[lq]!apache2,httpd\[rq] to the command line arguments.
To remove all packages use \[lq]!*\[rq].
Example: when using an distro that uses \f[C]dnf\f[R],
\f[C]Packages=meson libfdisk-devel.i686 git-* prebuilt/rpms/systemd-249-rc1.local.rpm /usr/bin/ld \[at]development-tools python3dist(mypy)\f[R]
would install the \f[C]meson\f[R] package (in the latest version), the
32-bit version of the \f[C]libfdisk-devel\f[R] package, all available
packages that start with the \f[C]git-\f[R] prefix, a \f[C]systemd\f[R]
rpm from the local file system, one of the packages that provides
\f[C]/usr/bin/ld\f[R], the packages in the \[lq]Development Tools\[rq]
group, and the package that contains the \f[C]mypy\f[R] python module.
.TP
\f[B]\f[CB]WithDocs=\f[B]\f[R], \f[B]\f[CB]--with-docs\f[B]\f[R]
Include documentation in the image built.
By default if the underlying distribution package manager supports it
documentation is not included in the image built.
The \f[C]$WITH_DOCS\f[R] environment variable passed to the
\f[C]mkosi.build\f[R] script indicates whether this option was used or
not.
.TP
\f[B]\f[CB]WithTests=\f[B]\f[R], \f[B]\f[CB]--without-tests\f[B]\f[R], \f[B]\f[CB]-T\f[B]\f[R]
If set to false (or when the command-line option is used), the
\f[C]$WITH_TESTS\f[R] environment variable is set to \f[C]0\f[R] when
the \f[C]mkosi.build\f[R] script is invoked.
This is supposed to be used by the build script to bypass any unit or
integration tests that are normally run during the source build process.
Note that this option has no effect unless the \f[C]mkosi.build\f[R]
build script honors it.
.TP
\f[B]\f[CB]Cache=\f[B]\f[R], \f[B]\f[CB]--cache=\f[B]\f[R]
Takes a path to a directory to use as package cache for the distribution
package manager used.
If this option is not used, but a \f[C]mkosi.cache/\f[R] directory is
found in the local directory it is automatically used for this purpose.
The directory configured this way is mounted into both the development
and the final image while the package manager is running.
.TP
\f[B]\f[CB]SkeletonTree=\f[B]\f[R], \f[B]\f[CB]--skeleton-tree=\f[B]\f[R]
Takes a path to a directory to copy into the OS tree before invoking the
package manager.
Use this to insert files and directories into the OS tree before the
package manager installs any packages.
If this option is not used, but the \f[C]mkosi.skeleton/\f[R] directory
is found in the local directory it is automatically used for this
purpose (also see the \[lq]Files\[rq] section below).
Instead of a directory, a tar file may be provided.
In this case it is unpacked into the OS tree before the package manager
is invoked.
This mode of operation allows setting permissions and file ownership
explicitly, in particular for projects stored in a version control
system such as \f[C]git\f[R] which retain full file ownership and access
mode metadata for committed files.
If the tar file \f[C]mkosi.skeleton.tar\f[R] is found in the local
directory it will be automatically used for this purpose.
.TP
\f[B]\f[CB]ExtraTree=\f[B]\f[R], \f[B]\f[CB]--extra-tree=\f[B]\f[R]
Takes a path to a directory to copy on top of the OS tree the package
manager generated.
Use this to override any default configuration files shipped with the
distribution.
If this option is not used, but the \f[C]mkosi.extra/\f[R] directory is
found in the local directory it is automatically used for this purpose
(also see the \[lq]Files\[rq] section below).
As with the skeleton tree logic above, instead of a directory, a tar
file may be provided too.
\f[C]mkosi.skeleton.tar\f[R] will be automatically used if found in the
local directory.
.TP
\f[B]\f[CB]CleanPackageMetadata=\f[B]\f[R], \f[B]\f[CB]--clean-package-metadata=\f[B]\f[R]
Enable/disable removal of package manager databases, caches, and logs at
the end of installation.
Can be specified as true, false, or \[lq]\f[C]auto\f[R]\[rq] (the
default).
With \[lq]\f[C]auto\f[R]\[rq], files will be removed if the respective
package manager executable is \f[I]not\f[R] present at the end of the
installation.
.TP
\f[B]\f[CB]RemoveFiles=\f[B]\f[R], \f[B]\f[CB]--remove-files=\f[B]\f[R]
Takes a comma-separated list of globs.
Files in the image matching the globs will be purged at the end.
.TP
\f[B]\f[CB]RemovePackages=\f[B]\f[R], \f[B]\f[CB]--remove-package=\f[B]\f[R]
Takes a comma-separated list of package specifications for removal, in
the same format as \f[C]Packages=\f[R].
The removal will be performed as one of the last steps.
This step is skipped if \f[C]CleanPackageMetadata=no\f[R] is used.
This option is currently only implemented for distributions using
\f[C]dnf\f[R].
.TP
\f[B]\f[CB]Environment=\f[B]\f[R], \f[B]\f[CB]--environment=\f[B]\f[R]
Adds variables to the environment that the
build/prepare/postinstall/finalize scripts are executed with.
Takes a space-separated list of variable assignments or just variable
names.
In the latter case, the values of those variables will be passed through
from the environment in which \f[C]mkosi\f[R] was invoked.
This option may be specified more than once, in which case all listed
variables will be set.
If the same variable is set twice, the later setting overrides the
earlier one.
.TP
\f[B]\f[CB]BuildSources=\f[B]\f[R], \f[B]\f[CB]--build-sources=\f[B]\f[R]
Takes a path to a source tree to copy into the development image, if the
build script is used.
This only applies if a build script is used, and defaults to the local
directory.
Use \f[C]SourceFileTransfer=\f[R] to configure how the files are
transferred from the host to the container image.
.TP
\f[B]\f[CB]BuildDirectory=\f[B]\f[R], \f[B]\f[CB]--build-dir=\f[B]\f[R]
Takes a path of a directory to use as build directory for build systems
that support out-of-tree builds (such as Meson).
The directory used this way is shared between repeated builds, and
allows the build system to reuse artifacts (such as object files,
executable, \&...) generated on previous invocations.
This directory is mounted into the development image when the build
script is invoked.
The build script can find the path to this directory in the
\f[C]$BUILDDIR\f[R] environment variable.
If this option is not specified, but a directory
\f[C]mkosi.builddir/\f[R] exists in the local directory it is
automatically used for this purpose (also see the \[lq]Files\[rq]
section below).
.TP
\f[B]\f[CB]IncludeDirectory=\f[B]\f[R], \f[B]\f[CB]--include-directory=\f[B]\f[R]
Takes a path of a directory to use as the include directory.
This directory is mounted at \f[C]/usr/include\f[R] when building the
build image and running the build script.
This means all include files installed to \f[C]/usr/include\f[R] will be
stored in this directory.
This is useful to make include files available on the host system for
use by language servers to provide code completion.
If this option is not specified, but a directory
\f[C]mkosi.includedir/\f[R] exists in the local directory, it is
automatically used for this purpose (also see the \[lq]Files\[rq]
section below).
.TP
\f[B]\f[CB]InstallDirectory=\f[B]\f[R], \f[B]\f[CB]--install-directory=\f[B]\f[R]
Takes a path of a directory to use as the install directory.
The directory used this way is shared between builds and allows the
build system to not have to reinstall files that were already installed
by a previous build and didn\[cq]t change.
The build script can find the path to this directory in the
\f[C]$DESTDIR\f[R] environment variable.
If this option is not specified, but a directory
\f[C]mkosi.installdir\f[R] exists in the local directory, it is
automatically used for this purpose (also see the \[lq]Files\[rq]
section below).
.TP
\f[B]\f[CB]BuildPackages=\f[B]\f[R], \f[B]\f[CB]--build-package=\f[B]\f[R]
Similar to \f[C]Packages=\f[R], but configures packages to install only
in the first phase of the build, into the development image.
This option should be used to list packages containing header files,
compilers, build systems, linkers and other build tools the
\f[C]mkosi.build\f[R] script requires to operate.
Note that packages listed here are only included in the image created
during the first phase of the build, and are absent in the final image.
Use \f[C]Packages=\f[R] to list packages that shall be included in both.
Packages are appended to the list.
Packages prefixed with \[lq]!\[rq] are removed from the list.
\[lq]!*\[rq] removes all packages from the list.
.TP
\f[B]\f[CB]Password=\f[B]\f[R], \f[B]\f[CB]--password=\f[B]\f[R]
Set the password of the \f[C]root\f[R] user.
By default the \f[C]root\f[R] account is locked.
If this option is not used, but a file \f[C]mkosi.rootpw\f[R] exists in
the local directory, the root password is automatically read from it.
.TP
\f[B]\f[CB]PasswordIsHashed=\f[B]\f[R], \f[B]\f[CB]--password-is-hashed\f[B]\f[R]
Indicate that the password supplied for the \f[C]root\f[R] user has
already been hashed, so that the string supplied with
\f[C]Password=\f[R] or \f[C]mkosi.rootpw\f[R] will be written to
\f[C]/etc/shadow\f[R] literally.
.TP
\f[B]\f[CB]Autologin=\f[B]\f[R], \f[B]\f[CB]--autologin\f[B]\f[R]
Enable autologin for the \f[C]root\f[R] user on \f[C]/dev/pts/0\f[R]
(nspawn), \f[C]/dev/tty1\f[R] (QEMU) and \f[C]/dev/ttyS0\f[R] (QEMU with
\f[C]QemuHeadless=yes\f[R]) by patching \f[C]/etc/pam.d/login\f[R].
.TP
\f[B]\f[CB]SkipFinalPhase=\f[B]\f[R], \f[B]\f[CB]--skip-final-phase=\f[B]\f[R]
Causes the (second) final image build stage to be skipped.
This is useful in combination with a build script, for when you care
about the artifacts that were created locally in \f[C]$BUILDDIR\f[R],
but ultimately plan to discard the final image.
.TP
\f[B]\f[CB]BuildScript=\f[B]\f[R], \f[B]\f[CB]--build-script=\f[B]\f[R]
Takes a path to an executable that is used as build script for this
image.
If this option is used the build process will be two-phased instead of
single-phased.
The specified script is copied onto the development image and executed
inside an \f[C]systemd-nspawn\f[R] container environment.
If this option is not used, but the \f[C]mkosi.build\f[R] file found in
the local directory it is automatically used for this purpose (also see
the \[lq]Files\[rq] section below).
Specify an empty value to disable automatic detection.
.TP
\f[B]\f[CB]PrepareScript=\f[B]\f[R], \f[B]\f[CB]--prepare-script=\f[B]\f[R]
Takes a path to an executable that is invoked inside the image right
after installing the software packages.
It is the last step before the image is cached (if incremental mode is
enabled).
This script is invoked inside a \f[C]systemd-nspawn\f[R] container
environment, and thus does not have access to host resources.
If this option is not used, but an executable script
\f[C]mkosi.prepare\f[R] is found in the local directory, it is
automatically used for this purpose.
Specify an empty value to disable automatic detection.
.TP
\f[B]\f[CB]PostInstallationScript=\f[B]\f[R], \f[B]\f[CB]--postinst-script=\f[B]\f[R]
Takes a path to an executable that is invoked inside the final image
right after copying in the build artifacts generated in the first phase
of the build.
This script is invoked inside a \f[C]systemd-nspawn\f[R] container
environment, and thus does not have access to host resources.
If this option is not used, but an executable \f[C]mkosi.postinst\f[R]
is found in the local directory, it is automatically used for this
purpose.
Specify an empty value to disable automatic detection.
.TP
\f[B]\f[CB]FinalizeScript=\f[B]\f[R], \f[B]\f[CB]--finalize-script=\f[B]\f[R]
Takes a path to an executable that is invoked outside the final image
right after copying in the build artifacts generated in the first phase
of the build, and after having executed the \f[C]mkosi.postinst\f[R]
script (see \f[C]PostInstallationScript=\f[R]).
This script is invoked directly in the host environment, and hence has
full access to the host\[cq]s resources.
If this option is not used, but an executable \f[C]mkosi.finalize\f[R]
is found in the local directory, it is automatically used for this
purpose.
Specify an empty value to disable automatic detection.
.TP
\f[B]\f[CB]SourceFileTransfer=\f[B]\f[R], \f[B]\f[CB]--source-file-transfer=\f[B]\f[R]
Configures how the source file tree (as configured with
\f[C]BuildSources=\f[R]) is transferred into the container image during
the first phase of the build.
Takes one of \f[C]copy-all\f[R] (to copy all files from the source
tree), \f[C]copy-git-cached\f[R] (to copy only those files
\f[C]git ls-files --cached\f[R] lists), \f[C]copy-git-others\f[R] (to
copy only those files \f[C]git ls-files --others\f[R] lists),
\f[C]mount\f[R] to bind mount the source tree directly.
Defaults to \f[C]copy-git-cached\f[R] if a \f[C]git\f[R] source tree is
detected, otherwise \f[C]copy-all\f[R].
When you specify \f[C]copy-git-more\f[R], it is the same as
\f[C]copy-git-cached\f[R], except it also includes the \f[C].git/\f[R]
directory.
.TP
\f[B]\f[CB]SourceFileTransferFinal=\f[B]\f[R], \f[B]\f[CB]--source-file-transfer-final=\f[B]\f[R]
Same as \f[C]SourceFileTransfer=\f[R], but for the final image instead
of the build image.
Takes the same values as \f[C]SourceFileFransfer=\f[R] except
\f[C]mount\f[R].
By default, sources are not copied into the final image.
.TP
\f[B]\f[CB]SourceResolveSymlinks=\f[B]\f[R], \f[B]\f[CB]--source-resolve-symlinks\f[B]\f[R]
If given, any symbolic links in the source file tree are resolved and
the file contents are copied to the build image.
If not given, they are left as symbolic links.
This only applies if \f[C]SourceFileTransfer=\f[R] is
\f[C]copy-all\f[R].
Defaults to leaving them as symbolic links.
.TP
\f[B]\f[CB]SourceResolveSymlinksFinal=\f[B]\f[R], \f[B]\f[CB]--source-resolve-symlinks-final\f[B]\f[R]
Same as \f[C]SourceResolveSymlinks=\f[R], but for the final image
instead of the build image.
.TP
\f[B]\f[CB]WithNetwork=\f[B]\f[R], \f[B]\f[CB]--with-network\f[B]\f[R]
When true, enables network connectivity while the build script
\f[C]mkosi.build\f[R] is invoked.
By default, the build script runs with networking turned off.
The \f[C]$WITH_NETWORK\f[R] environment variable is passed to the
\f[C]mkosi.build\f[R] build script indicating whether the build is done
with or without network.
If specified as \f[C]never\f[R], the package manager is instructed not
to contact the network for updating package data.
This provides a minimal level of reproducibility, as long as the package
data cache is already fully populated.
.TP
\f[B]\f[CB]Settings=\f[B]\f[R], \f[B]\f[CB]--settings=\f[B]\f[R]
Specifies a \f[C].nspawn\f[R] settings file for \f[C]systemd-nspawn\f[R]
to use in the \f[C]boot\f[R] and \f[C]shell\f[R] verbs, and to place
next to the generated image file.
This is useful to configure the \f[C]systemd-nspawn\f[R] environment
when the image is run.
If this setting is not used but an \f[C]mkosi.nspawn\f[R] file found in
the local directory it is automatically used for this purpose.
.SS [Partitions] Section
.TP
\f[B]\f[CB]BaseImage=\f[B]\f[R], \f[B]\f[CB]--base-image=\f[B]\f[R]
Use the specified directory or file system image as the base image, and
create the output image that consists only of changes from this base.
The base image is attached as the lower file system in an overlayfs
structure, and the output filesystem becomes the upper layer, initially
empty.
Thus files that are not modified compared to the base image are not
present in the output image.
This option may be used to create systemd \[lq]system extensions\[rq] or
portable services.
See https://systemd.io/PORTABLE_SERVICES/#extension-images for more
information.
.TP
\f[B]\f[CB]RootSize=\f[B]\f[R], \f[B]\f[CB]--root-size=\f[B]\f[R]
Takes a size in bytes for the root file system.
The specified numeric value may be suffixed with \f[C]K\f[R],
\f[C]M\f[R], \f[C]G\f[R] to indicate kilo-, mega- and gigabytes (all to
the base of 1024).
This applies to output formats \f[C]gpt_ext4\f[R], \f[C]gpt_xfs\f[R],
\f[C]gpt_btrfs\f[R].
Defaults to 3G.
.TP
\f[B]\f[CB]ESPSize=\f[B]\f[R], \f[B]\f[CB]--esp-size=\f[B]\f[R]
Similar to \f[C]RootSize=\f[R], configures the size of the UEFI System
Partition (ESP).
This is only relevant if the \f[C]Bootable=\f[R] option is used to
generate a bootable image.
Defaults to 256 MB.
.TP
\f[B]\f[CB]SwapSize=\f[B]\f[R], \f[B]\f[CB]--swap-size=\f[B]\f[R]
Similar to \f[C]RootSize=\f[R], configures the size of a swap partition
on the image.
If omitted, no swap partition is created.
.TP
\f[B]\f[CB]HomeSize=\f[B]\f[R], \f[B]\f[CB]--home-size=\f[B]\f[R]
Similar to \f[C]RootSize=\f[R], configures the size of the
\f[C]/home\f[R] partition.
If omitted, no separate \f[C]/home\f[R] partition is created.
.TP
\f[B]\f[CB]SrvSize=\f[B]\f[R], \f[B]\f[CB]--srv-size=\f[B]\f[R]
Similar to \f[C]RootSize=\f[R], configures the size of the
\f[C]/srv\f[R] partition.
If omitted, no separate \f[C]/srv\f[R] partition is created.
.SS [Validation] Section
.TP
\f[B]\f[CB]Checksum=\f[B]\f[R], \f[B]\f[CB]--checksum\f[B]\f[R]
Generate a \f[C]SHA256SUMS\f[R] file of all generated artifacts after
the build is complete.
.TP
\f[B]\f[CB]Sign=\f[B]\f[R], \f[B]\f[CB]--sign\f[B]\f[R]
Sign the generated \f[C]SHA256SUMS\f[R] using \f[C]gpg\f[R] after
completion.
.TP
\f[B]\f[CB]Key=\f[B]\f[R], \f[B]\f[CB]--key=\f[B]\f[R]
Select the \f[C]gpg\f[R] key to use for signing \f[C]SHA256SUMS\f[R].
This key must be already present in the \f[C]gpg\f[R] keyring.
.TP
\f[B]\f[CB]BMap=\f[B]\f[R], \f[B]\f[CB]--bmap\f[B]\f[R]
Generate a \f[C]bmap\f[R] file for usage with \f[C]bmaptool\f[R] from
the generated image file.
.SS [Host] Section
.TP
\f[B]\f[CB]ExtraSearchPaths=\f[B]\f[R], \f[B]\f[CB]--extra-search-paths=\f[B]\f[R]
List of colon-separated paths to look for tools in, before using the
regular \f[C]$PATH\f[R] search path.
.TP
\f[B]\f[CB]QemuHeadless=\f[B]\f[R], \f[B]\f[CB]--qemu-headless=\f[B]\f[R]
When used with the \f[C]build\f[R] verb, this option adds
\f[C]console=ttyS0\f[R] to the image\[cq]s kernel command line and sets
the terminal type of the serial console in the image to the terminal
type of the host (more specifically, the value of the \f[C]$TERM\f[R]
environment variable passed to mkosi).
This makes sure that all terminal features such as colors and shortcuts
still work as expected when connecting to the qemu VM over the serial
console (for example via \f[C]-nographic\f[R]).
When used with the \f[C]qemu\f[R] verb, this option adds the
\f[C]-nographic\f[R] option to \f[C]qemu\f[R]\[cq]s command line so qemu
starts a headless vm and connects to its serial console from the current
terminal instead of launching the VM in a separate window.
.TP
\f[B]\f[CB]QemuSmp=\f[B]\f[R], \f[B]\f[CB]--qemu-smp=\f[B]\f[R]
When used with the \f[C]qemu\f[R] verb, this options sets
\f[C]qemu\f[R]\[cq]s \f[C]-smp\f[R] argument which controls the number
of guest\[cq]s CPUs.
Defaults to \f[C]2\f[R].
.TP
\f[B]\f[CB]QemuMem=\f[B]\f[R], \f[B]\f[CB]--qemu-mem=\f[B]\f[R]
When used with the \f[C]qemu\f[R] verb, this options sets
\f[C]qemu\f[R]\[cq]s \f[C]-m\f[R] argument which controls the amount of
guest\[cq]s RAM.
Defaults to \f[C]1G\f[R].
.TP
\f[B]\f[CB]QemuKvm=\f[B]\f[R], \f[B]\f[CB]--qemu-kvm=\f[B]\f[R]
When used with the \f[C]qemu\f[R] verb, this option specifies whether
QEMU should use KVM acceleration.
Defaults to yes if the host machine supports KVM acceleration, no
otherwise.
.TP
\f[B]\f[CB]NspawnKeepUnit=\f[B]\f[R], \f[B]\f[CB]--nspawn-keep-unit\f[B]\f[R]
When used, this option instructs underlying calls of systemd-nspawn to
use the current unit scope, instead of creating a dedicated transcient
scope unit for the containers.
This option should be used when mkosi is run by a service unit.
.TP
\f[B]\f[CB]Netdev=\f[B]\f[R], \f[B]\f[CB]--netdev\f[B]\f[R]
When used with the boot or qemu verbs, this option creates a virtual
ethernet link between the host and the container/VM.
The host interface is automatically picked up by systemd-networkd as
documented in systemd-nspawn\[cq]s man page:
https://www.freedesktop.org/software/systemd/man/systemd-nspawn.html#-n
.TP
\f[B]\f[CB]Ephemeral=\f[B]\f[R], \f[B]\f[CB]--ephemeral\f[B]\f[R]
When used with the \f[C]shell\f[R], \f[C]boot\f[R], or \f[C]qemu\f[R]
verbs, this option runs the specified verb on a temporary snapshot of
the output image that is removed immediately when the container
terminates.
Taking the temporary snapshot is more efficient on file systems that
support subvolume snapshots or `reflinks' natively (\[lq]btrfs\[rq] or
new \[lq]xfs\[rq]) than on more traditional file systems that do not
(\[lq]ext4\[rq]).
.TP
\f[B]\f[CB]Ssh=\f[B]\f[R], \f[B]\f[CB]--ssh\f[B]\f[R]
If specified, installs and enables \f[C]sshd\f[R] in the final image and
generates a SSH keypair and adds the public key to root\[cq]s
\f[C]authorized_keys\f[R] in the final image.
The private key is stored in mkosi\[cq]s output directory.
When building with this option and running the image using
\f[C]mkosi boot\f[R] or \f[C]mkosi qemu\f[R], the \f[C]mkosi ssh\f[R]
command can be used to connect to the container/VM via SSH.
.TP
\f[B]\f[CB]SshKey=\f[B]\f[R], \f[B]\f[CB]--ssh-key=\f[B]\f[R]
If specified, use the given private key when connecting to the guest
machine via \f[C]mkosi ssh\f[R].
This requires the public key counterpart to be present in the same
location, suffixed with \f[C].pub\f[R] (as done by
\f[C]ssh-keygen\f[R]).
If this option is not present, \f[C]mkosi\f[R] generates a new key pair
automatically.
.TP
\f[B]\f[CB]SshAgent=\f[B]\f[R], \f[B]\f[CB]--ssh-agent=\f[B]\f[R]
If specified as a path, use the given socket to connect to the ssh agent
when building an image and when connecting via \f[C]mkosi ssh\f[R]
instead of hard-coding a key.
If specified as \f[C]true\f[R], \f[C]$SSH_AUTH_SOCK\f[R] will be parsed
instead (hint: use \f[C]sudo\f[R] with \f[C]-E\f[R]).
The keys listed by \f[C]ssh-add -L\f[R] will be installed as authorized
keys in the built image.
The \f[C]ssh\f[R] invocation done by \f[C]mkosi ssh\f[R] will inherit
\f[C]$SSH_AUTH_SOCK\f[R] for authentication purposes.
.TP
\f[B]\f[CB]SshPort=\f[B]\f[R], \f[B]\f[CB]--ssh-port=\f[B]\f[R]
In the image, sshd will be configured to listen on this port.
\f[C]mkosi ssh\f[R] will connect to this port.
.TP
\f[B]\f[CB]SshTimeout=\f[B]\f[R], \f[B]\f[CB]--ssh-timeout=\f[B]\f[R]
When used with the \f[C]ssh\f[R] verb, \f[C]mkosi\f[R] will attempt to
retry the SSH connection up to given timeout (in seconds) in case it
fails.
This option is useful mainly in scripted environments where the
\f[C]qemu\f[R] and \f[C]ssh\f[R] verbs are used in a quick succession
and the virtual device might not get enough time to configure itself.
.SS Commandline-only Options
.PP
Those settings cannot be configured in the configuration files.
.TP
\f[B]\f[CB]--directory=\f[B]\f[R], \f[B]\f[CB]-C\f[B]\f[R]
Takes a path to a directory.
\f[C]mkosi\f[R] switches to this directory before doing anything.
Note that the various \f[C]mkosi.*\f[R] files are searched for only
after changing to this directory, hence using this option is an
effective way to build a project located in a specific directory.
.TP
\f[B]\f[CB]--default=\f[B]\f[R]
Loads additional settings from the specified settings file.
Most command line options may also be configured in a settings file.
See the table below to see which command line options match which
settings file option.
If this option is not used, but a file \f[C]mkosi.default\f[R] is found
in the local directory it is automatically used for this purpose.
If a setting is configured both on the command line and in the settings
file, the command line generally wins, except for options taking lists
in which case both lists are combined.
.TP
\f[B]\f[CB]--all\f[B]\f[R], \f[B]\f[CB]-a\f[B]\f[R]
Iterate through all files \f[C]mkosi.*\f[R] in the
\f[C]mkosi.files/\f[R] subdirectory, and build each as if
\f[C]--default=mkosi.files/mkosi.\&...\f[R] was invoked.
This is a quick way to build a large number of images in one go.
Any additional specified command line arguments override the relevant
options in all files processed this way.
.TP
\f[B]\f[CB]--all-directory=\f[B]\f[R]
If specified, overrides the directory the \f[C]--all\f[R] logic
described above looks for settings files in.
If unspecified, defaults to \f[C]mkosi.files/\f[R] in the current
working directory.
.TP
\f[B]\f[CB]--incremental\f[B]\f[R], \f[B]\f[CB]-i\f[B]\f[R]
Enable incremental build mode.
This only applies if the two-phase \f[C]mkosi.build\f[R] build script
logic is used.
In this mode, a copy of the OS image is created immediately after all OS
packages are unpacked but before the \f[C]mkosi.build\f[R] script is
invoked in the development container.
Similarly, a copy of the final image is created immediately before the
build artifacts from the \f[C]mkosi.build\f[R] script are copied in.
On subsequent invocations of \f[C]mkosi\f[R] with the \f[C]-i\f[R]
switch these cached images may be used to skip the OS package unpacking,
thus drastically speeding up repetitive build times.
Note that when this is used and a pair of cached incremental images
exists they are not automatically regenerated, even if options such as
\f[C]Packages=\f[R] are modified.
In order to force rebuilding of these cached images, combine
\f[C]-i\f[R] with \f[C]-ff\f[R] to ensure cached images are first
removed and then re-created.
.TP
\f[B]\f[CB]--debug=\f[B]\f[R]
Enable additional debugging output.
Takes a comma-separated list of arguments specifying the area of
interest.
Pass any invalid value (e.g.\ empty) to list currently accepted values.
.TP
\f[B]\f[CB]--version\f[B]\f[R]
Show package version.
.TP
\f[B]\f[CB]--help\f[B]\f[R], \f[B]\f[CB]-h\f[B]\f[R]
Show brief usage information.
.TP
\f[B]\f[CB]--auto-bump\f[B]\f[R], \f[B]\f[CB]-B\f[B]\f[R]
If specified, after each successful build the the version is bumped in a
fashion equivalent to the \f[C]bump\f[R] verb, in preparation for the
next build.
This is useful for simple, linear version management: each build in a
series will have a version number one higher then the previous one.
.SS Supported distributions
.PP
Images may be created containing installations of the following
operating systems:
.IP \[bu] 2
\f[I]Fedora Linux\f[R]
.IP \[bu] 2
\f[I]Debian\f[R]
.IP \[bu] 2
\f[I]Ubuntu\f[R]
.IP \[bu] 2
\f[I]Arch Linux\f[R]
.IP \[bu] 2
\f[I]openSUSE\f[R]
.IP \[bu] 2
\f[I]Mageia\f[R]
.IP \[bu] 2
\f[I]CentOS\f[R]
.IP \[bu] 2
\f[I]Clear Linux\f[R]
.IP \[bu] 2
\f[I]Photon\f[R]
.IP \[bu] 2
\f[I]OpenMandriva\f[R]
.IP \[bu] 2
\f[I]Rocky Linux\f[R]
.IP \[bu] 2
\f[I]Alma Linux\f[R]
.IP \[bu] 2
\f[I]Gentoo\f[R]
.PP
In theory, any distribution may be used on the host for building images
containing any other distribution, as long as the necessary tools are
available.
Specifically, any distribution that packages \f[C]debootstrap\f[R] may
be used to build \f[I]Debian\f[R] or \f[I]Ubuntu\f[R] images.
Any distribution that packages \f[C]dnf\f[R] may be used to build
\f[I]Fedora Linux\f[R], \f[I]Mageia\f[R] or \f[I]OpenMandriva\f[R]
images.
Any distro that packages \f[C]pacstrap\f[R] may be used to build
\f[I]Arch Linux\f[R] images.
Any distribution that packages \f[C]zypper\f[R] may be used to build
\f[I]openSUSE\f[R] images.
Any distribution that packages \f[C]yum\f[R] (or the newer replacement
\f[C]dnf\f[R]) may be used to build \f[I]CentOS\f[R], \f[I]Rocky
Linux\f[R], or \f[I]Alma Linux\f[R] images.
Any distribution that packages \f[C]emerge\f[R] may be used to build
\f[I]Gentoo\f[R] images.
.PP
Currently, \f[I]Fedora Linux\f[R] packages all relevant tools as of
Fedora 28.
.SS Compatibility
.PP
Legacy concepts are avoided: generated images use \f[I]GPT\f[R] disk
labels (and no \f[I]MBR\f[R] labels), and only systemd-based images may
be generated.
.PP
All generated \f[I]GPT\f[R] disk images may be booted in a local
container directly with:
.IP
.nf
\f[C]
systemd-nspawn -bi image.raw
\f[R]
.fi
.PP
Additionally, bootable \f[I]GPT\f[R] disk images (as created with the
\f[C]--bootable\f[R] flag) work when booted directly by \f[I]EFI\f[R]
and \f[I]BIOS\f[R] systems, for example in \f[I]KVM\f[R] via:
.IP
.nf
\f[C]
qemu-kvm -m 512 -smp 2 -bios /usr/share/edk2/ovmf/OVMF_CODE.fd -drive format=raw,file=image.raw
\f[R]
.fi
.PP
\f[I]EFI\f[R] bootable \f[I]GPT\f[R] images are larger than plain
\f[I]GPT\f[R] images, as they additionally carry an \f[I]EFI\f[R] system
partition containing a boot loader, as well as a kernel, kernel modules,
udev and more.
.PP
All directory or btrfs subvolume images may be booted directly with:
.IP
.nf
\f[C]
systemd-nspawn -bD image
\f[R]
.fi
.SH Files
.PP
To make it easy to build images for development versions of your
projects, mkosi can read configuration data from the local directory,
under the assumption that it is invoked from a \f[I]source\f[R] tree.
Specifically, the following files are used if they exist in the local
directory:
.IP \[bu] 2
The \f[B]\f[CB]mkosi.default\f[B]\f[R] file provides the default
configuration for the image building process.
For example, it may specify the distribution to use (\f[C]fedora\f[R],
\f[C]ubuntu\f[R], \f[C]debian\f[R], \f[C]arch\f[R], \f[C]opensuse\f[R],
\f[C]mageia\f[R], \f[C]openmandriva\f[R], \f[C]gentoo\f[R]) for the
image, or additional distribution packages to install.
Note that all options encoded in this configuration file may also be set
on the command line, and this file is hence little more than a way to
make sure invoking \f[C]mkosi\f[R] without further parameters in your
\f[I]source\f[R] tree is enough to get the right image of your choice
set up.
.RS 2
.PP
Additionally, if a \f[I]\f[CI]mkosi.default.d/\f[I]\f[R] directory
exists, each file in it is loaded in the same manner adding/overriding
the values specified in \f[C]mkosi.default\f[R].
If \f[C]mkosi.default.d/\f[R] contains a directory named after the
distribution being built, each file in that directory is also processed.
.PP
The file format is inspired by Windows \f[C].ini\f[R] files and supports
multi-line assignments: any line with initial whitespace is considered a
continuation line of the line before.
Command-line arguments, as shown in the help description, have to be
included in a configuration block (e.g.\ \[lq]\f[C][Content]\f[R]\[rq])
corresponding to the argument group (e.g.\ \[lq]\f[C]Content\f[R]\[rq]),
and the argument gets converted as follows:
\[lq]\f[C]--with-network\f[R]\[rq] becomes
\[lq]\f[C]WithNetwork=yes\f[R]\[rq].
For further details see the table above.
.RE
.IP \[bu] 2
The \f[B]\f[CB]mkosi.skeleton/\f[B]\f[R] directory or
\f[B]\f[CB]mkosi.skeleton.tar\f[B]\f[R] archive may be used to insert
files into the image.
The files are copied \f[I]before\f[R] the distribution packages are
installed into the image.
This allows creation of files that need to be provided early, for
example to configure the package manager or set systemd presets.
.RS 2
.PP
When using the directory, file ownership is not preserved: all files
copied will be owned by root.
To preserve ownership, use a tar archive.
.RE
.IP \[bu] 2
The \f[B]\f[CB]mkosi.extra/\f[B]\f[R] directory or
\f[B]\f[CB]mkosi.extra.tar\f[B]\f[R] archive may be used to insert
additional files into the image, on top of what the distribution
includes in its packages.
They are similar to \f[C]mkosi.skeleton/\f[R] and
\f[C]mkosi.skeleton.tar\f[R], but the files are copied into the
directory tree of the image \f[I]after\f[R] the OS was installed.
.RS 2
.PP
When using the directory, file ownership is not preserved: all files
copied will be owned by root.
To preserve ownership, use a tar archive.
.RE
.IP \[bu] 2
\f[B]\f[CB]mkosi.build\f[B]\f[R] may be an executable script.
If it exists, the image will be built twice: the first iteration will be
the \f[I]development\f[R] image, the second iteration will be the
\f[I]final\f[R] image.
The \f[I]development\f[R] image is used to build the project in the
current working directory (the \f[I]source\f[R] tree).
For that the whole directory is copied into the image, along with the
\f[C]mkosi.build\f[R] script.
The script is then invoked inside the image (via
\f[C]systemd-nspawn\f[R]), with \f[C]$SRCDIR\f[R] pointing to the
\f[I]source\f[R] tree.
\f[C]$DESTDIR\f[R] points to a directory where the script should place
any files generated it would like to end up in the \f[I]final\f[R]
image.
Note that \f[C]make\f[R]/\f[C]automake\f[R]/\f[C]meson\f[R] based build
systems generally honor \f[C]$DESTDIR\f[R], thus making it very natural
to build \f[I]source\f[R] trees from the build script.
After the \f[I]development\f[R] image was built and the build script ran
inside of it, it is removed again.
After that the \f[I]final\f[R] image is built, without any
\f[I]source\f[R] tree or build script copied in.
However, this time the contents of \f[C]$DESTDIR\f[R] are added into the
image.
.RS 2
.PP
When the source tree is copied into the \f[I]build\f[R] image, all files
are copied, except for \f[C]mkosi.builddir/\f[R], \f[C]mkosi.cache/\f[R]
and \f[C]mkosi.output/\f[R].
That said, \f[C].gitignore\f[R] is respected if the source tree is a
\f[C]git\f[R] checkout.
If multiple different images shall be built from the same source tree it
is essential to exclude their output files from this copy operation, as
otherwise a version of an image built earlier might be included in a
later build, which is usually not intended.
An alternative to excluding these built images via \f[C].gitignore\f[R]
entries is to use the \f[C]mkosi.output/\f[R] directory, which is an
easy way to exclude all build artifacts.
.PP
The \f[C]$MKOSI_DEFAULT\f[R] environment variable will be set inside of
this script so that you know which \f[C]mkosi.default\f[R] (if any) was
passed in.
.RE
.IP \[bu] 2
The \f[B]\f[CB]mkosi.prepare\f[B]\f[R] script is invoked directly after
the software packages are installed, from within the image context, if
it exists.
It is once called for the \f[I]development\f[R] image (if this is
enabled, see above) with the \[lq]build\[rq] command line parameter,
right before copying the extra tree.
It is called a second time for the \f[I]final\f[R] image with the
\[lq]final\[rq] command line parameter.
This script has network access and may be used to install packages from
other sources than the distro\[cq]s package manager
(e.g.\ \f[C]pip\f[R], \f[C]npm\f[R], \&...), after all software packages
are installed but before the image is cached (if incremental mode is
enabled).
This script is executed within \f[C]$SRCDIR\f[R].
In contrast to a general purpose installation, it is safe to install
packages to the system (\f[C]pip install\f[R],
\f[C]npm install -g\f[R]) instead of in \f[C]$SRCDIR\f[R] itself
because the build image is only used for a single project and can easily
be thrown away and rebuilt so there\[cq]s no risk of conflicting
dependencies and no risk of polluting the host system.
.IP \[bu] 2
The \f[B]\f[CB]mkosi.postinst\f[B]\f[R] script is invoked as the
penultimate step of preparing an image, from within the image context,
if it exists.
It is called first for the \f[I]development\f[R] image (if this is
enabled, see above) with the \[lq]build\[rq] command line parameter,
right before invoking the build script.
It is called a second time for the \f[I]final\f[R] image with the
\[lq]final\[rq] command line parameter, right before the image is
considered complete.
This script may be used to alter the images without any restrictions,
after all software packages and built sources have been installed.
Note that this script is executed directly in the image context with the
final root directory in place, without any
\f[C]$SRCDIR\f[R]/\f[C]$DESTDIR\f[R] setup.
.IP \[bu] 2
The \f[B]\f[CB]mkosi.finalize\f[B]\f[R] script, if it exists, is invoked
as last step of preparing an image, from the host system.
It is once called for the \f[I]development\f[R] image (if this is
enabled, see above) with the \[lq]build\[rq] command line parameter, as
the last step before invoking the build script, after the
\f[C]mkosi.postinst\f[R] script is invoked.
It is called the second time with the \[lq]final\[rq] command line
parameter as the last step before the image is considered complete.
The environment variable \f[C]$BUILDROOT\f[R] points to the root
directory of the installation image.
Additional verbs may be added in the future, the script should be
prepared for that.
This script may be used to alter the images without any restrictions,
after all software packages and built sources have been installed.
This script is more flexible than \f[C]mkosi.postinst\f[R] in two
regards: it has access to the host file system so it\[cq]s easier to
copy in additional files or to modify the image based on external
configuration, and the script is run in the host, so it can be used even
without emulation even if the image has a foreign architecture.
.IP \[bu] 2
The \f[B]\f[CB]mkosi.mksquashfs-tool\f[B]\f[R] script, if it exists,
will be called wherever \f[C]mksquashfs\f[R] would be called.
.IP \[bu] 2
The \f[B]\f[CB]mkosi.nspawn\f[B]\f[R] nspawn settings file will be
copied into the same place as the output image file, if it exists.
This is useful since nspawn looks for settings files next to image files
it boots, for additional container runtime settings.
.IP \[bu] 2
The \f[B]\f[CB]mkosi.cache/\f[B]\f[R] directory, if it exists, is
automatically used as package download cache, in order to speed repeated
runs of the tool.
.IP \[bu] 2
The \f[B]\f[CB]mkosi.builddir/\f[B]\f[R] directory, if it exists, is
automatically used as out-of-tree build directory, if the build commands
in the \f[C]mkosi.build\f[R] script support it.
Specifically, this directory will be mounted into the build container,
and the \f[C]$BUILDDIR\f[R] environment variable will be set to it when
the build script is invoked.
The build script may then use this directory as build directory, for
automake-style or ninja-style out-of-tree builds.
This speeds up builds considerably, in particular when \f[C]mkosi\f[R]
is used in incremental mode (\f[C]-i\f[R]): not only the disk images,
but also the build tree is reused between subsequent invocations.
Note that if this directory does not exist the \f[C]$BUILDDIR\f[R]
environment variable is not set, and it is up to build script to decide
whether to do in in-tree or an out-of-tree build, and which build
directory to use.
.IP \[bu] 2
The \f[B]\f[CB]mkosi.includedir/\f[B]\f[R] directory, if it exists, is
automatically used as an out-of-tree include directory for header files.
Specifically, it will be mounted in the build container at
\f[C]/usr/include/\f[R] when building the build image and when running
the build script.
After building the (cached) build image, this directory will contain all
the files installed to \f[C]/usr/include\f[R].
Language servers or other tools can use these files to provide a better
editing experience for developers working on a project.
.IP \[bu] 2
The \f[B]\f[CB]mkosi.installdir/\f[B]\f[R] directory, if it exists, is
automatically used as the install directory.
Specifically, this directory will be mounted into the container at
\f[C]/root/dest\f[R] when running the build script.
After running the build script, the contents of this directory are
installed into the final image.
This is useful to cache the install step of the build.
If used, subsequent builds will only have to reinstall files that have
changed since the previous build.
.IP \[bu] 2
The \f[B]\f[CB]mkosi.rootpw\f[B]\f[R] file can be used to provide the
password or hashed password (if \f[C]--password-is-hashed\f[R] is set)
for the root user of the image.
The password may optionally be followed by a newline character which is
implicitly removed.
The file must have an access mode of 0600 or less.
If this file does not exist, the distribution\[cq]s default root
password is set (which usually means access to the root user is
blocked).
.IP \[bu] 2
The \f[B]\f[CB]mkosi.passphrase\f[B]\f[R] file provides the passphrase
to use when LUKS encryption is selected.
It should contain the passphrase literally, and not end in a newline
character (i.e.\ in the same format as cryptsetup and
\f[C]/etc/crypttab\f[R] expect the passphrase files).
The file must have an access mode of 0600 or less.
If this file does not exist and encryption is requested, the user is
queried instead.
.IP \[bu] 2
The \f[B]\f[CB]mkosi.secure-boot.crt\f[B]\f[R] and
\f[B]\f[CB]mkosi.secure-boot.key\f[B]\f[R] files contain an X.509
certificate and PEM private key to use when UEFI SecureBoot support is
enabled.
All EFI binaries included in the image\[cq]s ESP are signed with this
key, as a late step in the build process.
.IP \[bu] 2
The \f[B]\f[CB]mkosi.output/\f[B]\f[R] directory will be used for all
build artifacts, if the image output path is not configured (i.e.\ no
\f[C]--output=\f[R] setting specified), or configured to a filename
(i.e.\ a path containing no \f[C]/\f[R] character).
This includes the image itself, the root hash file in case Verity is
used, the checksum and its signature if that\[cq]s enabled, and the
nspawn settings file if there is any.
Note that this directory is not used if the image output path contains
at least one slash, and has no effect in that case.
This setting is particularly useful if multiple different images shall
be built from the same working directory, as otherwise the build result
of a preceding run might be copied into a build image as part of the
source tree (see above).
.IP \[bu] 2
The \f[B]\f[CB]mkosi.reposdir/\f[B]\f[R] directory, if it exists, is
automatically used as the repository directory for extra repository
files.
See the \f[C]RepositoryDirectory\f[R] option for more information.
.PP
All these files are optional.
.PP
Note that the location of all these files may also be configured during
invocation via command line switches, and as settings in
\f[C]mkosi.default\f[R], in case the default settings are not acceptable
for a project.
.SH BUILD PHASES
.PP
If no build script \f[C]mkosi.build\f[R] (see above) is used the build
consists of a single phase only: the final image is generated as the
combination of \f[C]mkosi.skeleton/\f[R] (see above), the unpacked
distribution packages and \f[C]mkosi.extra/\f[R].
.PP
If a build script \f[C]mkosi.build\f[R] is used the build consists of
two phases: in the the first \f[C]development\f[R] phase an image that
includes necessary build tools (i.e.\ the combination of
\f[C]Packages=\f[R] and \f[C]BuildPackages=\f[R] is installed) is
generated (i.e.\ the combination of \f[C]mkosi.skeleton/\f[R] and
unpacked distribution packages).
Into this image the source tree is copied and \f[C]mkosi.build\f[R]
executed.
The artifacts the \f[C]mkosi.build\f[R] generates are saved.
Then, the second \f[C]final\f[R] phase starts: an image that excludes
the build tools (i.e.\ only \f[C]Packages=\f[R] is installed,
\f[C]BuildPackages=\f[R] is not) is generated.
This time the build artifacts saved from the first phase are copied in,
and \f[C]mkosi.extra\f[R] copied on top, thus generating the final
image.
.PP
The two-phased approach ensures that source tree is executed in a clean
and comprehensive environment, while at the same the final image remains
minimal and contains only those packages necessary at runtime, but
avoiding those necessary at build-time.
.PP
Note that only the package cache \f[C]mkosi.cache/\f[R] is shared
between the two phases.
The distribution package manager is executed exactly once in each phase,
always starting from a directory tree that is populated with
\f[C]mkosi.skeleton\f[R] but nothing else.
.SH CACHING
.PP
\f[C]mkosi\f[R] supports three different caches for speeding up
repetitive re-building of images.
Specifically:
.IP "1." 3
The package cache of the distribution package manager may be cached
between builds.
This is configured with the \f[C]--cache=\f[R] option or the
\f[C]mkosi.cache/\f[R] directory.
This form of caching relies on the distribution\[cq]s package manager,
and caches distribution packages (RPM, DEB, \&...) after they are
downloaded, but before they are unpacked.
.IP "2." 3
If an \f[C]mkosi.build\f[R] script is used, by enabling incremental
build mode with \f[C]--incremental\f[R], a cached copy of the
development and final images can be made immediately before the build
sources are copied in (for the development image) or the artifacts
generated by \f[C]mkosi.build\f[R] are copied in (in case of the final
image).
This form of caching allows bypassing the time-consuming package
unpacking step of the distribution package managers, but is only
effective if the list of packages to use remains stable, but the build
sources and its scripts change regularly.
Note that this cache requires manual flushing: whenever the package list
is modified the cached images need to be explicitly removed before the
next re-build, using the \f[C]-f\f[R] switch.
.IP "3." 3
Finally, between multiple builds the build artifact directory may be
shared, using the \f[C]mkosi.builddir/\f[R] directory.
This directory allows build systems such as Meson to reuse already
compiled sources from a previous built, thus speeding up the build
process of the \f[C]mkosi.build\f[R] build script.
.PP
The package cache (i.e.\ the first item above) is unconditionally
useful.
The latter two caches only apply to uses of \f[C]mkosi\f[R] with a
source tree and build script.
When all three are enabled together turn-around times for complete image
builds are minimal, as only changed source files need to be recompiled:
an OS image rebuilt will be almost as quick to build the source tree
only.
.SH ENVIRONMENT VARIABLES
.PP
The build script \f[C]mkosi.build\f[R] receives the following
environment variables:
.IP \[bu] 2
\f[C]$SRCDIR\f[R] contains the path to the sources to build.
.IP \[bu] 2
\f[C]$DESTDIR\f[R] is a directory into which any artifacts generated by
the build script shall be placed.
.IP \[bu] 2
\f[C]$BUILDDIR\f[R] is only defined if \f[C]mkosi.builddir\f[R] and
points to the build directory to use.
This is useful for all build systems that support out-of-tree builds to
reuse already built artifacts from previous runs.
.IP \[bu] 2
\f[C]$WITH_DOCS\f[R] is either \f[C]0\f[R] or \f[C]1\f[R] depending on
whether a build without or with installed documentation was requested
(\f[C]WithDocs=yes\f[R]).
The build script should suppress installation of any package
documentation to \f[C]$DESTDIR\f[R] in case \f[C]$WITH_DOCS\f[R] is set
to \f[C]0\f[R].
.IP \[bu] 2
\f[C]$WITH_TESTS\f[R] is either \f[C]0\f[R]or \f[C]1\f[R] depending on
whether a build without or with running the test suite was requested
(\f[C]WithTests=no\f[R]).
The build script should avoid running any unit or integration tests in
case \f[C]$WITH_TESTS\f[R] is \f[C]0\f[R].
.IP \[bu] 2
\f[C]$WITH_NETWORK\f[R] is either \f[C]0\f[R]or \f[C]1\f[R] depending on
whether a build without or with networking is being executed
(\f[C]WithNetwork=no\f[R]).
The build script should avoid any network communication in case
\f[C]$WITH_NETWORK\f[R] is \f[C]0\f[R].
.SH EXAMPLES
.PP
Create and run a raw \f[I]GPT\f[R] image with \f[I]ext4\f[R], as
\f[C]image.raw\f[R]:
.IP
.nf
\f[C]
# mkosi --bootable --incremental boot
\f[R]
.fi
.PP
Create and run a bootable btrfs \f[I]GPT\f[R] image, as
\f[C]foobar.raw\f[R]:
.IP
.nf
\f[C]
# mkosi --format gpt_btrfs --bootable -o foobar.raw
# mkosi --output foobar.raw boot
# mkosi --output foobar.raw qemu
\f[R]
.fi
.PP
Create and run a \f[I]Fedora Linux\f[R] image into a plain directory:
.IP
.nf
\f[C]
# mkosi --distribution fedora --format directory boot
\f[R]
.fi
.PP
Create a compressed image \f[C]image.raw.xz\f[R] and add a checksum
file, and install \f[I]SSH\f[R] into it:
.IP
.nf
\f[C]
# mkosi --distribution fedora --format gpt_squashfs --checksum --compress --package=openssh-clients
\f[R]
.fi
.PP
Inside the source directory of an \f[C]automake\f[R]-based project,
configure \f[I]mkosi\f[R] so that simply invoking \f[C]mkosi\f[R]
without any parameters builds an OS image containing a built version of
the project in its current state:
.IP
.nf
\f[C]
# cat >mkosi.default <<EOF
[Distribution]
Distribution=fedora
Release=24
[Output]
Format=gpt_btrfs
Bootable=yes
[Content]
Packages=openssh-clients,httpd
BuildPackages=make,gcc,libcurl-devel
EOF
# cat >mkosi.build <<EOF
#!/bin/sh
cd $SRCDIR
\&./autogen.sh
\&./configure --prefix=/usr
make -j \[ga]nproc\[ga]
make install
EOF
# chmod +x mkosi.build
# mkosi --bootable --incremental boot
# systemd-nspawn -bi image.raw
\f[R]
.fi
.PP
To create a \f[I]Fedora Linux\f[R] image with hostname:
.IP
.nf
\f[C]
# mkosi --distribution fedora --hostname image
\f[R]
.fi
.PP
Also you could set hostname in configuration file:
.IP
.nf
\f[C]
# cat mkosi.default
\&...
[Output]
Hostname=image
\&...
\f[R]
.fi
.SH REQUIREMENTS
.PP
mkosi is packaged for various distributions: Debian, Ubuntu, Arch Linux,
Fedora Linux, OpenMandriva, Gentoo.
It is usually easiest to use the distribution package.
.PP
The current version requires systemd 233 (or actually, systemd-nspawn of
it).
.PP
When not using distribution packages make sure to install the necessary
dependencies.
For example, on \f[I]Fedora Linux\f[R] you need:
.IP
.nf
\f[C]
dnf install arch-install-scripts btrfs-progs debootstrap dosfstools edk2-ovmf e2fsprogs squashfs-tools gnupg python3 tar veritysetup xfsprogs xz zypper sbsigntools
\f[R]
.fi
.PP
On Debian/Ubuntu it might be necessary to install the
\f[C]ubuntu-keyring\f[R], \f[C]ubuntu-archive-keyring\f[R] and/or
\f[C]debian-archive-keyring\f[R] packages explicitly, in addition to
\f[C]debootstrap\f[R], depending on what kind of distribution images you
want to build.
\f[C]debootstrap\f[R] on Debian only pulls in the Debian keyring on its
own, and the version on Ubuntu only the one from Ubuntu.
.PP
Note that the minimum required Python version is 3.7.
.SH REFERENCES
.IP \[bu] 2
Primary mkosi git repository on
GitHub (https://github.com/systemd/mkosi/)
.IP \[bu] 2
mkosi \[em] A Tool for Generating OS
Images (http://0pointer.net/blog/mkosi-a-tool-for-generating-os-images.html)
introductory blog post by Lennart Poettering
.IP \[bu] 2
The mkosi OS generation tool (https://lwn.net/Articles/726655/) story on
LWN
.SH SEE ALSO
.PP
\f[C]systemd-nspawn(1)\f[R], \f[C]dnf(8)\f[R], \f[C]debootstrap(8)\f[R]
.SH AUTHORS
The mkosi Authors.
|