Compare commits
998 Commits
Author | SHA1 | Date |
---|---|---|
|
934ffacdd3 | |
|
3bb13330cc | |
|
6a34e59f7b | |
|
68e1eb5382 | |
|
aaf00ca76a | |
|
78b938facf | |
|
539b11bbf4 | |
|
4de41eb836 | |
|
4a11725b1e | |
|
508822fc90 | |
|
6d0a09e831 | |
|
8ebc01bd91 | |
|
ee531af4fb | |
|
a6367ccb78 | |
|
36082437e1 | |
|
808caa1e74 | |
|
bd178bb4c3 | |
|
f6b36c4ec5 | |
|
d912402e32 | |
|
58d7c41998 | |
|
7d7332a1fc | |
|
e4c2c5cf2b | |
|
91e06a64fd | |
|
9f90d46ea1 | |
|
6145f685aa | |
|
3d40baa0e4 | |
|
c6c75e6550 | |
|
0e6be87757 | |
|
517ba94203 | |
|
7ad2308fa3 | |
|
42d81b12bb | |
|
2129abf060 | |
|
0d61c0643e | |
|
89fa572c85 | |
|
45dd058774 | |
|
f25205f451 | |
|
6b51f740a4 | |
|
ed455b17a6 | |
|
727708b1ae | |
|
0c4e257048 | |
|
910d35f80c | |
|
616d10b594 | |
|
40f86c0af1 | |
|
15c0003442 | |
|
f01db134da | |
|
6d5b9231d2 | |
|
9dc70808c5 | |
|
daba59d46c | |
|
4ecf677a74 | |
|
3da9edc995 | |
|
b60ff761e7 | |
|
588e421040 | |
|
f87cc613ab | |
|
70b531c463 | |
|
ae94ac7c16 | |
|
eb0fd03137 | |
|
0c772d5619 | |
|
20b17cb129 | |
|
37190c7b3a | |
|
622ecfd4a4 | |
|
238ec98071 | |
|
eeee8266db | |
|
c2024d2490 | |
|
2a9d455307 | |
|
652708388e | |
|
373f133ac7 | |
|
a305f993c3 | |
|
a905d652e6 | |
|
42c83f7e6a | |
|
6334e82a42 | |
|
2c22f0c31e | |
|
122992112b | |
|
e27aa30804 | |
|
d0ae72a251 | |
|
ec0f276abf | |
|
a09d5128be | |
|
16a43af329 | |
|
17a5971e49 | |
|
3f7bc4a77a | |
|
24e081752d | |
|
8299bfc896 | |
|
70603de2a3 | |
|
20c1fe030d | |
|
1638b7a721 | |
|
9d4b82db20 | |
|
3de28e1e56 | |
|
8eda1e1150 | |
|
66a0af3a92 | |
|
0f8d56d2c8 | |
|
84595dc32f | |
|
002e366552 | |
|
3a20b31b49 | |
|
c915522962 | |
|
17f3cd7eeb | |
|
42ee12d51c | |
|
973e57eefa | |
|
bf3ee94724 | |
|
04be5de7f1 | |
|
4a871fff22 | |
|
37b0f5dd25 | |
|
790484cb7d | |
|
42c90e9771 | |
|
9332ff25cd | |
|
c10ba9aac0 | |
|
0cfeffbc82 | |
|
def912cce3 | |
|
75bd81d1e9 | |
|
1f0dc50194 | |
|
18cdda254b | |
|
35f8e9333d | |
|
070514d449 | |
|
bb103295ea | |
|
bc2858ecbf | |
|
a13d554374 | |
|
a2c3572512 | |
|
885d4a84b2 | |
|
fc43f861b7 | |
|
d3a95c2fe5 | |
|
113bd4d1f5 | |
|
3c50a65df5 | |
|
9276573c02 | |
|
8d9c63ff6c | |
|
aeb14a717b | |
|
00c53fb022 | |
|
ca8f81f7fb | |
|
0b1dbb4b9e | |
|
083ee169dd | |
|
5568e6d4a9 | |
|
b519043ddb | |
|
ec13f369c5 | |
|
e92fbe95a2 | |
|
e305c41118 | |
|
0440ce149b | |
|
8cf007f8eb | |
|
66dfa6451a | |
|
13f98e32d3 | |
|
a931b2fc2c | |
|
ecfafc8125 | |
|
f7861a6e7f | |
|
1cf80e7d81 | |
|
a36d51ac98 | |
|
93ef5b2f12 | |
|
f846d8f9aa | |
|
90e9bf5087 | |
|
6a4705e365 | |
|
e18b7ed591 | |
|
5d1c8dfc4c | |
|
811b48cc4e | |
|
52e50f9815 | |
|
589f2c9a5c | |
|
8c10b20fb7 | |
|
5e90e336fe | |
|
e035121f71 | |
|
14feb27a8c | |
|
88ae2a100e | |
|
e34e3c5169 | |
|
0addc66fb6 | |
|
e0492eac17 | |
|
8265298a7e | |
|
e6543c53bd | |
|
6714e687c3 | |
|
5f164bc53c | |
|
0b3c3048b6 | |
|
e9d3ff2179 | |
|
93557fb61d | |
|
626591bca8 | |
|
17f5932024 | |
|
faccbae06a | |
|
5f8c40f7ab | |
|
ded5971b6e | |
|
1c89f520f2 | |
|
a4860869ee | |
|
24a2a7b413 | |
|
130cd6a811 | |
|
3a07d353b9 | |
|
4b30ea21f4 | |
|
7afab97c63 | |
|
a85bb0897a | |
|
0f616dcf08 | |
|
e0523746fd | |
|
60c140cfe4 | |
|
7ff1c58c69 | |
|
33a5d71dda | |
|
c760932d48 | |
|
ac42e6b492 | |
|
7e0e3e8306 | |
|
b730adf109 | |
|
9572ea6ae9 | |
|
d60c7baa8b | |
|
2c6a050643 | |
|
56ec3c9e47 | |
|
b8aabcb892 | |
|
7e919dac30 | |
|
9303b73ebe | |
|
9b1c28dbe1 | |
|
a7271034cf | |
|
94035a5930 | |
|
271e0eb7d7 | |
|
585814cf87 | |
|
39ffb0b6f2 | |
|
cb97c14f9d | |
|
f4c362eda7 | |
|
d78255b097 | |
|
cf4b63c51d | |
|
b357fcf240 | |
|
9fe835d107 | |
|
1fea6b46c2 | |
|
7bfeb7721e | |
|
143e3574fb | |
|
6e01e38298 | |
|
1e7714a1af | |
|
5e96af3eca | |
|
590bd560cb | |
|
7f250ed1b0 | |
|
dbe9f612fb | |
|
b009e5cef5 | |
|
023a7355db | |
|
1b6cf0ad69 | |
|
3e6acd8c98 | |
|
ff02a7b2cb | |
|
db04a6686a | |
|
4a7f4a4932 | |
|
aaeb413e3e | |
|
8d8c31e136 | |
|
da42a211d6 | |
|
6985a5f135 | |
|
b7ab6f6d36 | |
|
587d218f14 | |
|
62377a77c0 | |
|
d7fe13356c | |
|
5ab447e18e | |
|
98802b4891 | |
|
83c16dad2c | |
|
cefa2556f3 | |
|
8f58d0e07c | |
|
f4fbb7dd29 | |
|
6c07e3acdc | |
|
a4818025d8 | |
|
c3792c61f4 | |
|
085dfea742 | |
|
7e5d26daab | |
|
eb661221ef | |
|
f14eed78ce | |
|
c5b96cfcd5 | |
|
63409682f2 | |
|
6528520d0f | |
|
989ad37d65 | |
|
685b2ef742 | |
|
20684681c6 | |
|
3d83553d62 | |
|
b8c6465581 | |
|
fb103ef072 | |
|
a67386755e | |
|
c194bad2d4 | |
|
79a8f474f7 | |
|
62f6e30c70 | |
|
0e6fe28141 | |
|
2ccfac7ec0 | |
|
4b36aed8c6 | |
|
57019e72dd | |
|
f0b41749f6 | |
|
178619d673 | |
|
6000546e35 | |
|
c30c4612b5 | |
|
e1ee983245 | |
|
c4b2216617 | |
|
aeacc82b32 | |
|
22d6932ce2 | |
|
5515a9e7d7 | |
|
37c89a62f6 | |
|
1158f5a207 | |
|
8f9f7d8aed | |
|
9cfc4f6ed7 | |
|
45470649cb | |
|
542fcbe50e | |
|
304d459ddb | |
|
f6b5d684d4 | |
|
aaf4ae4ff6 | |
|
325dc7f904 | |
|
f17cfe4e78 | |
|
0b892f82a0 | |
|
cbc3c20104 | |
|
124202511a | |
|
cfa131fb9c | |
|
f3b475ec42 | |
|
f850dcb8db | |
|
e29173a16d | |
|
212a5bd6d0 | |
|
94cdce7dd2 | |
|
980fb1f66a | |
|
45191a796e | |
|
44e653a48d | |
|
6d44ca8c2d | |
|
f723ce6196 | |
|
e6fe7602b9 | |
|
8db3100355 | |
|
4ccee8097b | |
|
c83dc45b11 | |
|
96b7e8f991 | |
|
88cc5f0056 | |
|
9cb021b174 | |
|
99ccc0460b | |
|
19d01e2900 | |
|
f83e710bd2 | |
|
5b017a5163 | |
|
f2fb7f0f69 | |
|
58af2d9d9d | |
|
6b052910e8 | |
|
355f0b14ed | |
|
b2012ab641 | |
|
b45926f83c | |
|
398d4e7246 | |
|
a0d33ca42b | |
|
48f74d2cec | |
|
46fb3e60fb | |
|
ef711a0bbc | |
|
b3a1300144 | |
|
622f6046c7 | |
|
054f471f18 | |
|
70055b746e | |
|
90c373f0ab | |
|
bbc57c14e9 | |
|
50111513be | |
|
a628ee687d | |
|
c6eadae173 | |
|
7163384c3c | |
|
faa24eb7f2 | |
|
edcc5a0f43 | |
|
8d2b99bf46 | |
|
4b3cb8ac0d | |
|
10ccf892cd | |
|
49b1397350 | |
|
06a18b0045 | |
|
2d4157f4c1 | |
|
7f877d108b | |
|
116c35a0c6 | |
|
26a904f861 | |
|
41f4c6ae01 | |
|
c69bded135 | |
|
212450765b | |
|
ea92320fe4 | |
|
5edc931726 | |
|
f09a3b740a | |
|
5f9ff30643 | |
|
db1e602cf1 | |
|
a9576fb3a4 | |
|
bc399df328 | |
|
0b5050511b | |
|
493bacc318 | |
|
d2b5ee4b18 | |
|
9dc669b44e | |
|
27ca4a27f0 | |
|
58599a98ab | |
|
1ae4af6244 | |
|
edfafdee5b | |
|
ed1e85fb12 | |
|
eb6e9bf4df | |
|
dc30cc51b1 | |
|
d01011a39c | |
|
bd9d1d8ba4 | |
|
4679d680f0 | |
|
4283c1f507 | |
|
135a08c7b0 | |
|
7b915d691c | |
|
f51697593a | |
|
4dab035d46 | |
|
16e8115e77 | |
|
637f6a9652 | |
|
da01bdf27d | |
|
cd34eed243 | |
|
2fd37d0489 | |
|
9b8ff34e81 | |
|
595d7ca2bb | |
|
ad5ca69aa0 | |
|
87a6cf1887 | |
|
0ead4637bf | |
|
0dfc0b93ab | |
|
32701815f9 | |
|
65f065a327 | |
|
9a79e7a5c6 | |
|
8c59f517c1 | |
|
4b70a341a9 | |
|
aa285f0f6e | |
|
85434103d7 | |
|
eb1f14e742 | |
|
013413ee8c | |
|
16adb86372 | |
|
ef55e74317 | |
|
efea85695b | |
|
42a3476508 | |
|
c727734a08 | |
|
341c44e372 | |
|
b9d0829d5d | |
|
e80cd7aeff | |
|
84c71e9cfc | |
|
aca168be60 | |
|
d45c86996f | |
|
eb08d5a6c6 | |
|
a1417acc7a | |
|
f282e4eb44 | |
|
da6aa9fb2c | |
|
d7cc6e8115 | |
|
6f92a52961 | |
|
69131b2e39 | |
|
dbb43157df | |
|
5e507e645c | |
|
6c2aad8e4d | |
|
80230f8469 | |
|
e005a55268 | |
|
e2b39bf826 | |
|
c84745b49f | |
|
d46482abf9 | |
|
3832fe731c | |
|
4ebb74a993 | |
|
fe2dc839ed | |
|
252f83c076 | |
|
394f955870 | |
|
1596179ca5 | |
|
6ffa1692d6 | |
|
aefc99efce | |
|
3292ce76ea | |
|
9104bdba1d | |
|
7eac685f25 | |
|
7cfdfd0cec | |
|
e52ba1fc60 | |
|
77fe26975d | |
|
ca87ff3b58 | |
|
b342e0ecb7 | |
|
e1a46b9b5a | |
|
46b981728d | |
|
805eae9bd5 | |
|
1e05e7a3b2 | |
|
31de07fb9c | |
|
f618ec3986 | |
|
ca70e88330 | |
|
c981e8b8e5 | |
|
e0e23864c8 | |
|
1637ee7fca | |
|
ef9390d43c | |
|
7e12bac3e6 | |
|
f44222ad6f | |
|
d408e15f51 | |
|
3ca857ace8 | |
|
ffbace0f4a | |
|
bad6ad7cd7 | |
|
b8c3f64c1c | |
|
c452b138d5 | |
|
f95e0e14cc | |
|
9b72928e36 | |
|
0ca8dc6436 | |
|
5b9399ae6d | |
|
ec7d2886e9 | |
|
3f72f6fd47 | |
|
0a7c196dd1 | |
|
87ad07601a | |
|
44f560150a | |
|
cc085f41ee | |
|
391d00eaf4 | |
|
d6e2dca565 | |
|
acde2de95a | |
|
cda1e1b723 | |
|
f3103a6604 | |
|
9eb54db525 | |
|
67893f5cb1 | |
|
19d09556c6 | |
|
4c47a2a3ab | |
|
2acc2f4f40 | |
|
04b37ccf02 | |
|
2e1b556b93 | |
|
c693dc9ba7 | |
|
50817d2dba | |
|
51cbd207fe | |
|
e5468e47c5 | |
|
e4c612118e | |
|
79c0486aad | |
|
182a0c11e7 | |
|
07f6205294 | |
|
f03d830c30 | |
|
2f6ab18812 | |
|
7c892c9dc2 | |
|
945933d5f4 | |
|
dcbfce86d2 | |
|
4abd7231c9 | |
|
19539d7b31 | |
|
5da3942278 | |
|
ed91628c29 | |
|
590bc24347 | |
|
4e2b553972 | |
|
e35f11b25e | |
|
b085bebfbe | |
|
6490d48bf9 | |
|
88d61eae4e | |
|
b7ff9f90db | |
|
9b2eeb6f93 | |
|
88d731895a | |
|
5a07cc5d92 | |
|
9f11bb3d02 | |
|
3b7f50d3d5 | |
|
b2205dfbd8 | |
|
d73d54a688 | |
|
fedfe11190 | |
|
0da48d73b0 | |
|
5026eaef06 | |
|
585dc7e023 | |
|
4defce0b0a | |
|
84c0b79c34 | |
|
7b6026a2f4 | |
|
a7490a3a0c | |
|
cabd4c3e1b | |
|
4ec5818502 | |
|
d21969aace | |
|
694dfb1fcd | |
|
0c95ac28b7 | |
|
6b7c071958 | |
|
49943967a3 | |
|
f5203bec11 | |
|
5290be956b | |
|
b1f9de6ef1 | |
|
b0a5ae91ce | |
|
24c6f62b73 | |
|
eae44aaa70 | |
|
ef1cff7ec8 | |
|
f3fff84952 | |
|
e4691ff6cd | |
|
52a5e5f4ef | |
|
9a09badfe5 | |
|
b61dd9336b | |
|
e935f80928 | |
|
f1ebc0c505 | |
|
95b6d8cf41 | |
|
faee2824a9 | |
|
befe1b8645 | |
|
fe5bdc3e3a | |
|
5493bb6364 | |
|
a488c2a7df | |
|
e9018c0aaf | |
|
ec8073cd1e | |
|
acdb709cc6 | |
|
d79a911d7d | |
|
6aab4a86c2 | |
|
26806f9604 | |
|
ba5bac7a81 | |
|
8a1eb9d5dc | |
|
06fbd84f12 | |
|
54c149aa6f | |
|
4c511a74d7 | |
|
ef68a6be16 | |
|
2460a8d621 | |
|
7b3abf181e | |
|
1d916a96f5 | |
|
3ebcc2297f | |
|
a5c2e0dd6b | |
|
491d071fde | |
|
11dfed7288 | |
|
f994691dad | |
|
7a6b42f8c9 | |
|
a279a50fd0 | |
|
bd11ebdb91 | |
|
c6aece3da5 | |
|
e797d55522 | |
|
4a422b9465 | |
|
a69a28ed4f | |
|
7f3d15f298 | |
|
673c38027e | |
|
0ff9238d85 | |
|
443ac72e2f | |
|
4be78cffb5 | |
|
752afa56f4 | |
|
95365eb5b6 | |
|
be32867ebb | |
|
777f451fe2 | |
|
d214ac5e14 | |
|
ccd6dc32c5 | |
|
e66b92565b | |
|
8fb58acd23 | |
|
af084aeeec | |
|
12b03d0fde | |
|
3099d7e96d | |
|
ade6860696 | |
|
a09be6a976 | |
|
0f3196ad45 | |
|
7ff266466c | |
|
89111cd8de | |
|
cd3f593a7a | |
|
6b95069304 | |
|
d111c44368 | |
|
c8ea62e50a | |
|
0f970a46f8 | |
|
409523d402 | |
|
ea99b9393c | |
|
b69893f48b | |
|
1ea307fff1 | |
|
12c53d4928 | |
|
1d4c8c9cce | |
|
b8387e3446 | |
|
43df80636d | |
|
03ac799287 | |
|
19d8563b79 | |
|
dff278a0dd | |
|
761ae2bdd5 | |
|
f843448218 | |
|
9c0d446de6 | |
|
50d124294c | |
|
346d291f73 | |
|
9cd8938608 | |
|
1765ae8714 | |
|
2ddae45d67 | |
|
358b0ff514 | |
|
b884a6443d | |
|
113bc2a3c9 | |
|
76521b9479 | |
|
5e2351a446 | |
|
02444e74c5 | |
|
0d6a434ecd | |
|
5911d2af41 | |
|
5f6495c871 | |
|
d2b6806e08 | |
|
2f9c60dc6a | |
|
18d76996c5 | |
|
d18fc5ee16 | |
|
987fabef2f | |
|
5b1728481c | |
|
e03487def3 | |
|
daf59c0ab0 | |
|
40301415e4 | |
|
f2e9a81a0a | |
|
2b05eb832c | |
|
956a3caec5 | |
|
f7a6ec0245 | |
|
4efd5f7d93 | |
|
0f69aeae9a | |
|
02b93d9bbe | |
|
9ad1be3ec1 | |
|
d2081b53ac | |
|
f907ddac41 | |
|
47eec2fe15 | |
|
11453885cc | |
|
66aca19437 | |
|
eed65ddc81 | |
|
0057b3fbee | |
|
539731820f | |
|
f555b2a3d9 | |
|
218d8ca3fd | |
|
e49d608473 | |
|
96cc14a322 | |
|
11a13d4342 | |
|
c1964f37aa | |
|
412d59ab4f | |
|
3ea219264b | |
|
a71c9e107b | |
|
0b176ba15d | |
|
675ace38c5 | |
|
b3524d1106 | |
|
4099961577 | |
|
a785c3a7b1 | |
|
75df94154e | |
|
32f573fc36 | |
|
05c7165fbc | |
|
53e7f2b203 | |
|
d72f007b9c | |
|
937f68e01f | |
|
e0d2f8ebe1 | |
|
1f4e89c098 | |
|
b23b1c1459 | |
|
2714661e1b | |
|
b811977464 | |
|
983c6af8a6 | |
|
a885ed5b6f | |
|
08bcac1cf9 | |
|
1f084009df | |
|
370d7d5843 | |
|
c5ec090970 | |
|
9bbfd6dafe | |
|
12a17a82a6 | |
|
ba67f7ff71 | |
|
39d1bff0c2 | |
|
a948ece78d | |
|
7814f74377 | |
|
6ae74a397c | |
|
7a88eab9af | |
|
a2b6250680 | |
|
07b1284d2a | |
|
3d36ea703d | |
|
87c70e10ee | |
|
7cd3e4e669 | |
|
d90b1ac669 | |
|
d7cbf04f47 | |
|
158bbf36c4 | |
|
70984dfda9 | |
|
41b734e23a | |
|
592572345c | |
|
eb78e7780e | |
|
0cd462408a | |
|
f6ce01a09e | |
|
636dc16f7a | |
|
c864de7876 | |
|
c36497a88a | |
|
af7fe35742 | |
|
0596f3b243 | |
|
cf5b404dce | |
|
bc39f15369 | |
|
afb872d9f4 | |
|
41264636ea | |
|
89b2c7412e | |
|
57eea29cb2 | |
|
44d0d10c6e | |
|
5396e86eec | |
|
9e99b08a8c | |
|
4619b71b4e | |
|
86cb0cdf04 | |
|
592b838db6 | |
|
806b1a439f | |
|
c7af18f0f4 | |
|
4eb1b4d09b | |
|
fc96b66ada | |
|
de798af9b0 | |
|
4e891ec52d | |
|
846868d5c1 | |
|
077a9f409b | |
|
ae5c514982 | |
|
3278858050 | |
|
b65e659bf1 | |
|
84fea55597 | |
|
832907a7e2 | |
|
598aaaf78c | |
|
9732081dc5 | |
|
795c84b415 | |
|
8bd89fb30d | |
|
dc40f59a2c | |
|
9eb4d86745 | |
|
a260e9b45d | |
|
dbcbd12c80 | |
|
005f3375cd | |
|
f8ddb4cef3 | |
|
660af25250 | |
|
1b42fbeda3 | |
|
b2bcf036f8 | |
|
a2c58ea3e5 | |
|
0302973278 | |
|
8e87089a34 | |
|
a2c3181191 | |
|
7fb1400c7e | |
|
139601d024 | |
|
8e14a580c4 | |
|
0f22368cfb | |
|
2b3a2997a6 | |
|
03d905435d | |
|
a300b200a4 | |
|
f94e975029 | |
|
5cb578acc6 | |
|
44a7caf1a0 | |
|
22af654167 | |
|
9234765d3a | |
|
97bff52088 | |
|
30b09bc070 | |
|
5b9de101d8 | |
|
cbd03d7824 | |
|
50d6ff045e | |
|
2750b9179f | |
|
729729fd6d | |
|
234cf563d5 | |
|
7984fe2e5e | |
|
ee3d432736 | |
|
2d0eb009eb | |
|
4b0d5e7a56 | |
|
c98cd172a5 | |
|
5cb6baa439 | |
|
6effd819e8 | |
|
3ff9ea5204 | |
|
866fed32c7 | |
|
2274d3d923 | |
|
55a4c85820 | |
|
4a52480fe6 | |
|
e430c3fbe3 | |
|
ec142f6cdc | |
|
b07b5cdec2 | |
|
c071d1dd8d | |
|
75816eb35d | |
|
681ee3a9aa | |
|
b69c62e051 | |
|
2e9b650711 | |
|
f35524f8a3 | |
|
9bf12fee68 | |
|
9de248fbaa | |
|
57b55f5e22 | |
|
5eb4b39c81 | |
|
e726789238 | |
|
8e5ad375f3 | |
|
fc95daed9f | |
|
6c95750fe2 | |
|
8726bf9fad | |
|
de79448b39 | |
|
074796db4c | |
|
1823596fac | |
|
fb6484588c | |
|
de7dca9b90 | |
|
404661abec | |
|
01aa720419 | |
|
86ed099283 | |
|
3b01fb26dd | |
|
30dd6a9cd0 | |
|
297fa080f3 | |
|
b11dcdc0fa | |
|
8f413b0ec9 | |
|
5dd44c6fe5 | |
|
35a80ef6b9 | |
|
568032077b | |
|
789ef5645d | |
|
6662ab1740 | |
|
897aae02ab | |
|
81f0506bf7 | |
|
8f20ae1e5d | |
|
f27882926a | |
|
e9fe08f36a | |
|
00fcd9675b | |
|
da5f3c91d0 | |
|
b5e4891d5c | |
|
00e80c6fd2 | |
|
1a25318d89 | |
|
d0c5d83cbb | |
|
f7c88e12ba | |
|
b2dfb55406 | |
|
46724130ac | |
|
d01855e0ed | |
|
911726aa61 | |
|
1afade4eda | |
|
d3676dcdb6 | |
|
c0a3b0a686 | |
|
3796fa7596 | |
|
f4432af3d9 | |
|
522c266ee7 | |
|
28e1abf6bd | |
|
607afdd004 | |
|
af7eb4ab65 | |
|
873e3b0bcc | |
|
4b1b6f8382 | |
|
e8557d4fd7 | |
|
85936d8128 | |
|
b0a439ceb7 | |
|
f007e06abe | |
|
8a198b0031 | |
|
62064c0c13 | |
|
9665a11e21 | |
|
c39cf208e7 | |
|
f5c805c25c | |
|
a8be31056e | |
|
37959f9933 | |
|
1b7050103c | |
|
e1952d7e56 | |
|
ce39944f43 | |
|
d280a48acd | |
|
6f88ffedbc | |
|
1ed0a4d14e | |
|
f40a90772b | |
|
f0fb2c8f6f | |
|
ea454aea76 | |
|
6e4d7850fb | |
|
92da03aa90 | |
|
36dce7b616 | |
|
c246b3a1d0 | |
|
6b74ef78d7 | |
|
67ddb91915 | |
|
3722b13ecb | |
|
c2778e1b27 | |
|
328a6b5bf6 | |
|
93e0125880 | |
|
60eae62ac7 | |
|
8768283af0 | |
|
7e3515aa06 | |
|
dc81b8c2b3 | |
|
d7e41bc704 | |
|
b6f5b1aeb8 | |
|
3c6e803c77 | |
|
6266e37eec | |
|
c9f477517a | |
|
febb854aa8 | |
|
d2797b6834 | |
|
b486a7519d | |
|
f305103f6d | |
|
08746937db | |
|
7600932b12 | |
|
e017c2dfa6 | |
|
9c09fdb000 | |
|
b1c75d3b5d | |
|
1012109536 | |
|
1004c3428b | |
|
272334b2a7 | |
|
ee65d6ee26 | |
|
9b0e0a880b | |
|
2a67445c65 | |
|
2b4c60fc1f | |
|
dd35355f70 | |
|
4281e0daf3 | |
|
9b5593749b | |
|
4f886f7c80 | |
|
652d91d33a | |
|
6028a611c0 | |
|
0c910be5c4 | |
|
bf8fa84c4f | |
|
c23b2afd80 | |
|
d96978d1c2 | |
|
c3acd28c6b | |
|
29167d8528 | |
|
20b5e1c335 | |
|
7c53267153 | |
|
9ff5f02d8f | |
|
15e4726801 | |
|
c703f8518e | |
|
626c63cb7e | |
|
b6e71f985a | |
|
707a45d909 | |
|
4cc1b90b25 | |
|
0f04a90bdb | |
|
44f885551e | |
|
a6993b1b52 | |
|
6418593dfa | |
|
96ba1f8f9b | |
|
005d2b2d1b | |
|
0f1eb545c0 | |
|
29be0990fe | |
|
592271d46b | |
|
156e11af32 | |
|
a346855bab | |
|
ae7b47f7f9 | |
|
cb33fa0bc8 | |
|
534f7fc342 | |
|
7394518602 | |
|
7a3e3c802a | |
|
bd0327c7b8 | |
|
0a472db085 | |
|
f5d87cf419 | |
|
c6462e9fa4 | |
|
bea27b1ffa | |
|
d1c4fa9de5 | |
|
8aa7ccc796 | |
|
465623b904 | |
|
24bcdfdb9a | |
|
33b8133a33 | |
|
eac8cc2031 | |
|
4337aff726 | |
|
91389d6be4 | |
|
10d69b72d0 | |
|
70cf5c2100 | |
|
d030221214 | |
|
77123d0751 | |
|
f2087c376b | |
|
56e1c22e50 | |
|
f03061d8a7 | |
|
6a60919293 | |
|
e9299fc8b3 | |
|
0d5b97e186 | |
|
f018aee3aa | |
|
facb5d163e | |
|
147e938e93 | |
|
e96e90ebc7 | |
|
b36e62694c | |
|
5e980a8631 | |
|
bce0dbffbe | |
|
4c6c078d3c | |
|
5e7e677131 | |
|
efd8913de1 | |
|
d5dc137016 | |
|
411d87d63e | |
|
62c4c44090 | |
|
59033897c8 | |
|
e03d438b00 | |
|
df5877bd7d | |
|
eb5fe7aedc | |
|
0858f31701 | |
|
2fb13f64c9 | |
|
3843388258 | |
|
a2d2e570ea | |
|
51f17bb5ef | |
|
68e23b41a7 | |
|
26ceeed84b | |
|
7ff84160ec | |
|
b12ac6c2a4 | |
|
3c221ebdf1 | |
|
6247838abb | |
|
5d497ed2a0 | |
|
41fe0093c8 | |
|
ed8d613b8e | |
|
558c7245df | |
|
f0b4d63412 | |
|
98e44bbaa8 | |
|
b3802a356e | |
|
6216adf6a8 | |
|
c9df8f3b32 | |
|
fb9298448e | |
|
3e22c2b3de | |
|
194ec452be | |
|
df57ed1a68 | |
|
e43d291b37 | |
|
8ab2590e5b | |
|
d680eecbdc | |
|
59865c894e | |
|
286ac1bcfe | |
|
35a6588825 |
|
@ -1,5 +1,3 @@
|
||||||
# These are supported funding model platforms
|
# These are supported funding model platforms
|
||||||
|
|
||||||
github: flexiondotorg
|
github: [flexiondotorg, philclifford, lj3954]
|
||||||
patreon: wimpysworld
|
|
||||||
custom: https://wimpysworld.io/tip
|
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: 'bug: description of the bug you encountered'
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**I confirm this bug has not already been reported**
|
||||||
|
- [ ] I have searched the issues and this bug has not been reported previously
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
Steps to reproduce the behaviour:
|
||||||
|
1. Run `quickemu` with arguments '...'
|
||||||
|
2. See error
|
||||||
|
|
||||||
|
**Expected behaviour**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Quickemu output**
|
||||||
|
Run `quickemu` or `quickemu` and include the output of the failure below:
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Quickemu output</summary>
|
||||||
|
|
||||||
|
```text
|
||||||
|
quickemu/quickget output here
|
||||||
|
```
|
||||||
|
</details>
|
||||||
|
|
||||||
|
**System information**
|
||||||
|
Run `quickreport` and include the output here; if you can't run `quickreport`,
|
||||||
|
please provide the output of the following:
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Quickreport output</summary>
|
||||||
|
|
||||||
|
```text
|
||||||
|
quickreport output here
|
||||||
|
```
|
||||||
|
</details>
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
|
@ -0,0 +1,23 @@
|
||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: 'feat: describe the feature you are requesting'
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**I confirm this feature has not been previously requested**
|
||||||
|
- [ ] I have searched the issues and this feature has not previously been requested
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
Binary file not shown.
After Width: | Height: | Size: 3.7 KiB |
|
@ -1,24 +0,0 @@
|
||||||
#### Expected behaviour
|
|
||||||
|
|
||||||
Describe the your expected behaviour.
|
|
||||||
|
|
||||||
#### Actual behaviour
|
|
||||||
|
|
||||||
Describe the actual behaviour.
|
|
||||||
|
|
||||||
#### Steps to reproduce the behaviour
|
|
||||||
|
|
||||||
Outline the step to reproduce the issue you've encountered.
|
|
||||||
|
|
||||||
#### Quickemu output
|
|
||||||
|
|
||||||
Run `quickemu` or `quickget` and paste the output here.
|
|
||||||
|
|
||||||
#### Linux Distribution & Kernel
|
|
||||||
|
|
||||||
Run the following and paste the output.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
lsb_release --all
|
|
||||||
uname -a
|
|
||||||
```
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
# Description
|
||||||
|
|
||||||
|
Please include a summary of the changes along with any relevant motivation and context.
|
||||||
|
|
||||||
|
<!-- Close any related issues. Delete if not relevant -->
|
||||||
|
|
||||||
|
- Closes #
|
||||||
|
- Fixes #
|
||||||
|
- Resolves #
|
||||||
|
|
||||||
|
## Type of change
|
||||||
|
|
||||||
|
<!-- Delete any that are not relevant -->
|
||||||
|
|
||||||
|
- [ ] Bug fix (non-breaking change which fixes an issue)
|
||||||
|
- [ ] New feature (non-breaking change which adds functionality)
|
||||||
|
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
||||||
|
- [ ] Packaging (updates the packaging)
|
||||||
|
- [ ] Documentation (updates the documentation)
|
||||||
|
|
||||||
|
# Checklist:
|
||||||
|
|
||||||
|
- [ ] I have performed a self-review of my code
|
||||||
|
- [ ] I have tested my code in common scenarios and confirmed there are no regressions
|
||||||
|
- [ ] I have added comments to my code, particularly in hard-to-understand sections
|
||||||
|
- [ ] I have made corresponding changes to the documentation (*remove if no documentation changes were required*)
|
Binary file not shown.
Before Width: | Height: | Size: 22 KiB |
|
@ -0,0 +1,21 @@
|
||||||
|
name: Flake ❄️ Checker ✅
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
schedule:
|
||||||
|
- cron: '42 0 * * 6'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
flake-checker:
|
||||||
|
name: Flake Checker
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: DeterminateSystems/nix-installer-action@v19
|
||||||
|
- uses: DeterminateSystems/magic-nix-cache-action@v9
|
||||||
|
- uses: DeterminateSystems/flake-checker-action@v12
|
|
@ -0,0 +1,20 @@
|
||||||
|
name: Flake ❄️ Lock 🔒️ Updater ✨
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '37 13 14,28 * *'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lock-updater:
|
||||||
|
name: Flake Lock Updater
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: DeterminateSystems/nix-installer-action@v19
|
||||||
|
- uses: DeterminateSystems/magic-nix-cache-action@v9
|
||||||
|
- uses: DeterminateSystems/update-flake-lock@v27
|
||||||
|
with:
|
||||||
|
pr-title: "chore: update flake.lock"
|
|
@ -0,0 +1,27 @@
|
||||||
|
name: "Lint Pull Request 🐙"
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
- edited
|
||||||
|
- synchronize
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
pull-requests: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
main:
|
||||||
|
name: Validate pull request title
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: amannn/action-semantic-pull-request@v6
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
# If the PR only contains a single commit, the action will validate that
|
||||||
|
# it matches the configured pattern.
|
||||||
|
validateSingleCommit: true
|
||||||
|
# Related to `validateSingleCommit` you can opt-in to validate that the PR
|
||||||
|
# title matches a single commit to avoid confusion.
|
||||||
|
validateSingleCommitMatchesPrTitle: true
|
|
@ -0,0 +1,18 @@
|
||||||
|
name: "Lint Shellcheck 🐚"
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches: '**'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
shellcheck:
|
||||||
|
name: Shellcheck
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
- name: Run ShellCheck
|
||||||
|
uses: ludeeus/action-shellcheck@master
|
||||||
|
with:
|
||||||
|
format: gcc
|
||||||
|
severity: warning
|
|
@ -1,36 +0,0 @@
|
||||||
name: Publish PPA 📦️
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
publish-ppa:
|
|
||||||
name: Publish PPA
|
|
||||||
runs-on: ubuntu-22.04
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
- name: Import gpg key
|
|
||||||
uses: crazy-max/ghaction-import-gpg@v6
|
|
||||||
with:
|
|
||||||
gpg_private_key: ${{ secrets.PPA_GPG_PRIVATE_KEY }}
|
|
||||||
passphrase: ${{ secrets.PPA_GPG_PASSPHRASE }}
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get -y update
|
|
||||||
sudo apt-get -y install debhelper-compat distro-info dput devscripts
|
|
||||||
- name: Publish to PPA
|
|
||||||
env:
|
|
||||||
DEBEMAIL: ${{ secrets.DEBEMAIL }}
|
|
||||||
DEBFULLNAME: ${{ secrets.DEBFULLNAME }}
|
|
||||||
run: |
|
|
||||||
REL_VER=$(grep "^readonly VERSION" quickemu | cut -d'"' -f2)
|
|
||||||
STAMP=$(date +%y%j.%H%M)
|
|
||||||
for CODENAME in $(distro-info --supported); do
|
|
||||||
rm debian/changelog
|
|
||||||
dch --package quickemu --newversion="${REL_VER}-1~${CODENAME}${STAMP}" --distribution=${CODENAME} "New upstream release." --create
|
|
||||||
dpkg-buildpackage -d -S -sa
|
|
||||||
dput ppa:flexiondotorg/quickemu ../quickemu_${REL_VER}-1~${CODENAME}${STAMP}_source.changes
|
|
||||||
done
|
|
|
@ -1,15 +1,43 @@
|
||||||
name: Build 🏗️ and Publish 📦️
|
name: Publish Release 🏷️
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
tags: ['*']
|
tags:
|
||||||
|
- "v?[0-9]+.[0-9]+.[0-9]+*"
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
tag:
|
||||||
|
description: "The existing tag to publish"
|
||||||
|
type: "string"
|
||||||
|
required: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
create-release:
|
version-check:
|
||||||
name: Create Release
|
name: "Check versions ⚖️"
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: "Compare App and Git versions 🟰"
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
APP_VERSION=$(grep "^readonly VERSION" quickemu | cut -d'"' -f2)
|
||||||
|
GIT_VERSION=$(git describe --tags | cut -d'-' -f1)
|
||||||
|
echo "App version: ${REL_VERSION}"
|
||||||
|
echo "Git version: ${GIT_VERSION}"
|
||||||
|
if [ "${APP_VERSION}" != "${GIT_VERSION}" ]; then
|
||||||
|
echo "ERROR! Version mismatch.";
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
draft-release:
|
||||||
|
needs: [version-check]
|
||||||
|
name: "Draft Release 📥️"
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
- name: Create release ${{ github.ref }} as a draft
|
- name: Create release ${{ github.ref }} as a draft
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
@ -17,11 +45,11 @@ jobs:
|
||||||
gh release create "${{ github.ref }}" --draft --generate-notes
|
gh release create "${{ github.ref }}" --draft --generate-notes
|
||||||
|
|
||||||
build-release:
|
build-release:
|
||||||
needs: [create-release]
|
needs: [draft-release]
|
||||||
name: Build Release
|
name: "Build Release 👨🔧"
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
- name: Build and Upload .deb
|
- name: Build and Upload .deb
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
@ -36,10 +64,10 @@ jobs:
|
||||||
|
|
||||||
publish-release:
|
publish-release:
|
||||||
needs: [build-release]
|
needs: [build-release]
|
||||||
name: Publish Release
|
name: "Publish Release 📤️"
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
- name: Publish release ${{ github.ref }}
|
- name: Publish release ${{ github.ref }}
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
@ -48,3 +76,54 @@ jobs:
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
gh release edit "${{ github.ref }}" --draft=false
|
gh release edit "${{ github.ref }}" --draft=false
|
||||||
|
|
||||||
|
publish-flakehub:
|
||||||
|
needs: [version-check]
|
||||||
|
name: "Publish FlakeHub ❄️"
|
||||||
|
runs-on: "ubuntu-22.04"
|
||||||
|
permissions:
|
||||||
|
id-token: "write"
|
||||||
|
contents: "read"
|
||||||
|
steps:
|
||||||
|
- uses: "actions/checkout@v5"
|
||||||
|
with:
|
||||||
|
ref: "${{ (inputs.tag != null) && format('refs/tags/{0}', inputs.tag) || '' }}"
|
||||||
|
- uses: "DeterminateSystems/nix-installer-action@main"
|
||||||
|
- uses: "DeterminateSystems/magic-nix-cache-action@main"
|
||||||
|
- uses: "DeterminateSystems/flakehub-push@main"
|
||||||
|
with:
|
||||||
|
visibility: "public"
|
||||||
|
name: "quickemu-project/quickemu"
|
||||||
|
tag: "${{ inputs.tag }}"
|
||||||
|
|
||||||
|
publish-ppa:
|
||||||
|
needs: [version-check]
|
||||||
|
name: "Publish PPA 📦️"
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- name: "Checkout 🥡"
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: "Import gpg key 🔑"
|
||||||
|
uses: crazy-max/ghaction-import-gpg@v6
|
||||||
|
with:
|
||||||
|
gpg_private_key: ${{ secrets.PPA_GPG_PRIVATE_KEY }}
|
||||||
|
passphrase: ${{ secrets.PPA_GPG_PASSPHRASE }}
|
||||||
|
- name: "Install dependencies 💾"
|
||||||
|
run: |
|
||||||
|
sudo apt-get -y update
|
||||||
|
sudo apt-get -y install debhelper-compat distro-info dput devscripts
|
||||||
|
- name: "Upload to PPA ⤴️"
|
||||||
|
env:
|
||||||
|
DEBEMAIL: ${{ secrets.DEBEMAIL }}
|
||||||
|
DEBFULLNAME: ${{ secrets.DEBFULLNAME }}
|
||||||
|
run: |
|
||||||
|
REL_VER=$(grep "^readonly VERSION" quickemu | cut -d'"' -f2)
|
||||||
|
STAMP=$(date +%y%j.%H%M)
|
||||||
|
for CODENAME in $(distro-info --supported); do
|
||||||
|
rm debian/changelog
|
||||||
|
dch --package quickemu --newversion="${REL_VER}-1~${CODENAME}${STAMP}" --distribution=${CODENAME} "New upstream release." --create
|
||||||
|
dpkg-buildpackage -d -S -sa
|
||||||
|
dput ppa:flexiondotorg/quickemu ../quickemu_${REL_VER}-1~${CODENAME}${STAMP}_source.changes
|
||||||
|
done
|
||||||
|
|
|
@ -0,0 +1,82 @@
|
||||||
|
name: Test build quickemu 🚧
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
paths:
|
||||||
|
- quickemu
|
||||||
|
- quickget
|
||||||
|
- debian/**
|
||||||
|
- flake.nix
|
||||||
|
- package.nix
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
paths:
|
||||||
|
- quickemu
|
||||||
|
- quickget
|
||||||
|
- debian/**
|
||||||
|
- flake.nix
|
||||||
|
- package.nix
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
# TODO: arm64 runner
|
||||||
|
# https://github.blog/changelog/2024-06-03-actions-arm-based-linux-and-windows-runners-are-now-in-public-beta/
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-deb-build:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- name: "Checkout 🥡"
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
- name: "Build & Test .deb 🍥"
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
sudo apt-get -y update
|
||||||
|
sudo apt-get -y install debhelper devscripts
|
||||||
|
REL_VER=$(grep "^readonly VERSION" quickemu | cut -d'"' -f2)
|
||||||
|
rm debian/changelog
|
||||||
|
dch --package quickemu --newversion="${REL_VER}-1" --distribution=unstable "New upstream release." --create
|
||||||
|
dpkg-buildpackage --build=binary --no-check-builddeps --compression=gzip
|
||||||
|
sudo apt-get -y install ../quickemu_${REL_VER}-1_all.deb
|
||||||
|
quickemu --help
|
||||||
|
quickget --help
|
||||||
|
|
||||||
|
test-nix-build:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
permissions:
|
||||||
|
id-token: "write"
|
||||||
|
contents: "read"
|
||||||
|
steps:
|
||||||
|
- name: "Checkout 🥡"
|
||||||
|
uses: "actions/checkout@v5"
|
||||||
|
- name: "Install Nix ❄️"
|
||||||
|
uses: "DeterminateSystems/nix-installer-action@v19"
|
||||||
|
- name: "Enable Magic Nix Cache 🪄"
|
||||||
|
uses: "DeterminateSystems/magic-nix-cache-action@v9"
|
||||||
|
- name: "Build & Test .nix ❄️"
|
||||||
|
run: |
|
||||||
|
nix build .#quickemu
|
||||||
|
tree ./result
|
||||||
|
./result/bin/quickemu --help
|
||||||
|
./result/bin/quickget --help
|
||||||
|
./result/bin/quickreport
|
||||||
|
# Text a VM if the Nix Installer successfully enabled KVM
|
||||||
|
if [ $DETERMINATE_NIX_KVM -eq 1 ]; then
|
||||||
|
./result/bin/quickget alpine v3.20
|
||||||
|
./result/bin/quickemu --vm alpine-v3.20.conf --display none
|
||||||
|
sleep 5
|
||||||
|
if pgrep -F ./alpine-v3.20/alpine-v3.20.pid; then
|
||||||
|
echo "Test VM is running"
|
||||||
|
else
|
||||||
|
echo "Test VM is not running"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# Test a few more quickemu commands to clean up
|
||||||
|
./result/bin/quickemu --vm alpine-v3.20.conf --kill
|
||||||
|
./result/bin/quickemu --vm alpine-v3.20.conf --delete-disk
|
||||||
|
./result/bin/quickemu --vm alpine-v3.20.conf --delete-vm
|
||||||
|
fi
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
name: "Test quickget 🧪"
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
paths:
|
||||||
|
- quickget
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
paths:
|
||||||
|
- quickget
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
quickget-tests:
|
||||||
|
name: "Run quickget tests 👟"
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
- name: "Install dependencies 📦️"
|
||||||
|
run: |
|
||||||
|
sudo apt-get -y update
|
||||||
|
sudo apt-get -y install curl qemu-utils
|
||||||
|
- name: "List OS variants 📃"
|
||||||
|
run: |
|
||||||
|
mkdir -p results
|
||||||
|
./quickget --list | tail -n +2 | tee results/list.txt
|
||||||
|
- name: "Check OS downloads 💿️"
|
||||||
|
run: |
|
||||||
|
mkdir -p results
|
||||||
|
./quickget --check | tee results/check.txt
|
||||||
|
- name: "Display results 📊"
|
||||||
|
run: |
|
||||||
|
WINDOWS=$(grep -c "windows-" results/check.txt)
|
||||||
|
FAILED=$(grep -c ^FAIL results/check.txt)
|
||||||
|
SKIPPED=$(grep -c ^SKIP results/check.txt)
|
||||||
|
PASSED=$(grep -c ^PASS results/check.txt)
|
||||||
|
CHECKED=$((WINDOWS + FAILED + SKIPPED + PASSED))
|
||||||
|
echo -e "\nResults:"
|
||||||
|
echo -e "- CHECKED:\t${CHECKED}"
|
||||||
|
echo -e "- PASSED:\t${PASSED}"
|
||||||
|
echo -e "- SKIPPED:\t${SKIPPED}\t(of which ${WINDOWS} are Windows)"
|
||||||
|
echo -e "- FAILED:\t${FAILED}\n"
|
||||||
|
grep ^FAIL results/check.txt | tee results/failed.txt
|
||||||
|
VARIATIONS=$(wc -l results/list.txt | cut -d' ' -f 1)
|
||||||
|
DOWNLOADS=$(wc -l results/check.txt | cut -d' ' -f 1)
|
||||||
|
echo
|
||||||
|
echo "Compare OS variations with downloads:"
|
||||||
|
echo -e "- Variations:\t${VARIATIONS}"
|
||||||
|
echo -e "- Downloads:\t${DOWNLOADS}"
|
|
@ -2,10 +2,15 @@
|
||||||
*.conf
|
*.conf
|
||||||
*.dmg
|
*.dmg
|
||||||
*.fd
|
*.fd
|
||||||
|
*.fixed
|
||||||
*.img
|
*.img
|
||||||
*.iso
|
*.iso
|
||||||
|
*.ISO
|
||||||
*.lock
|
*.lock
|
||||||
|
!flake.lock
|
||||||
*.log
|
*.log
|
||||||
|
*.markdownlint.jsonc
|
||||||
|
*.markdownlint.yaml
|
||||||
*.msi
|
*.msi
|
||||||
*.part
|
*.part
|
||||||
*.permall
|
*.permall
|
||||||
|
@ -16,3 +21,4 @@
|
||||||
*.sock
|
*.sock
|
||||||
*.xml
|
*.xml
|
||||||
*.zs-old
|
*.zs-old
|
||||||
|
.direnv/
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
[submodule "build-docs"]
|
[submodule "build-docs"]
|
||||||
path = build-docs
|
path = build-docs
|
||||||
url = git@github.com:philclifford/quickemu-docs.git
|
url = https://github.com/philclifford/quickemu-docs.git
|
||||||
|
|
|
@ -0,0 +1,128 @@
|
||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
We as members, contributors, and leaders pledge to make participation in our
|
||||||
|
community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||||
|
identity and expression, level of experience, education, socio-economic status,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity
|
||||||
|
and orientation.
|
||||||
|
|
||||||
|
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||||
|
diverse, inclusive, and healthy community.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behaviour that contributes to a positive environment for our
|
||||||
|
community include:
|
||||||
|
|
||||||
|
* Demonstrating empathy and kindness toward other people
|
||||||
|
* Being respectful of differing opinions, viewpoints, and experiences
|
||||||
|
* Giving and gracefully accepting constructive feedback
|
||||||
|
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||||
|
and learning from the experience
|
||||||
|
* Focusing on what is best not just for us as individuals, but for the
|
||||||
|
overall community
|
||||||
|
|
||||||
|
Examples of unacceptable behaviour include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery, and sexual attention or
|
||||||
|
advances of any kind
|
||||||
|
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or email
|
||||||
|
address, without their explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Enforcement Responsibilities
|
||||||
|
|
||||||
|
Community leaders are responsible for clarifying and enforcing our standards of
|
||||||
|
acceptable behaviour and will take appropriate and fair corrective action in
|
||||||
|
response to any behaviour that they deem inappropriate, threatening, offensive,
|
||||||
|
or harmful.
|
||||||
|
|
||||||
|
Community leaders have the right and responsibility to remove, edit, or reject
|
||||||
|
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||||
|
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||||
|
decisions when appropriate.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies within all community spaces, and also applies when
|
||||||
|
an individual is officially representing the community in public spaces.
|
||||||
|
Examples of representing our community include using an official e-mail address,
|
||||||
|
posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behaviour may be
|
||||||
|
reported to the community leaders responsible for enforcement at
|
||||||
|
#quickemu channel on Discord.
|
||||||
|
All complaints will be reviewed and investigated promptly and fairly.
|
||||||
|
|
||||||
|
All community leaders are obligated to respect the privacy and security of the
|
||||||
|
reporter of any incident.
|
||||||
|
|
||||||
|
## Enforcement Guidelines
|
||||||
|
|
||||||
|
Community leaders will follow these Community Impact Guidelines in determining
|
||||||
|
the consequences for any action they deem in violation of this Code of Conduct:
|
||||||
|
|
||||||
|
### 1. Correction
|
||||||
|
|
||||||
|
**Community Impact**: Use of inappropriate language or other behaviour deemed
|
||||||
|
unprofessional or unwelcome in the community.
|
||||||
|
|
||||||
|
**Consequence**: A private, written warning from community leaders, providing
|
||||||
|
clarity around the nature of the violation and an explanation of why the
|
||||||
|
behaviour was inappropriate. A public apology may be requested.
|
||||||
|
|
||||||
|
### 2. Warning
|
||||||
|
|
||||||
|
**Community Impact**: A violation through a single incident or series
|
||||||
|
of actions.
|
||||||
|
|
||||||
|
**Consequence**: A warning with consequences for continued behaviour. No
|
||||||
|
interaction with the people involved, including unsolicited interaction with
|
||||||
|
those enforcing the Code of Conduct, for a specified period of time. This
|
||||||
|
includes avoiding interactions in community spaces as well as external channels
|
||||||
|
like social media. Violating these terms may lead to a temporary or
|
||||||
|
permanent ban.
|
||||||
|
|
||||||
|
### 3. Temporary Ban
|
||||||
|
|
||||||
|
**Community Impact**: A serious violation of community standards, including
|
||||||
|
sustained inappropriate behaviour.
|
||||||
|
|
||||||
|
**Consequence**: A temporary ban from any sort of interaction or public
|
||||||
|
communication with the community for a specified period of time. No public or
|
||||||
|
private interaction with the people involved, including unsolicited interaction
|
||||||
|
with those enforcing the Code of Conduct, is allowed during this period.
|
||||||
|
Violating these terms may lead to a permanent ban.
|
||||||
|
|
||||||
|
### 4. Permanent Ban
|
||||||
|
|
||||||
|
**Community Impact**: Demonstrating a pattern of violation of community
|
||||||
|
standards, including sustained inappropriate behaviour, harassment of an
|
||||||
|
individual, or aggression toward or disparagement of classes of individuals.
|
||||||
|
|
||||||
|
**Consequence**: A permanent ban from any sort of public interaction within
|
||||||
|
the community.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||||
|
version 2.0, available at
|
||||||
|
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
||||||
|
|
||||||
|
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||||
|
enforcement ladder](https://github.com/mozilla/diversity).
|
||||||
|
|
||||||
|
[homepage]: https://www.contributor-covenant.org
|
||||||
|
|
||||||
|
For answers to common questions about this code of conduct, see the FAQ at
|
||||||
|
https://www.contributor-covenant.org/faq. Translations are available at
|
||||||
|
https://www.contributor-covenant.org/translations.
|
|
@ -0,0 +1,11 @@
|
||||||
|
# Contributing
|
||||||
|
|
||||||
|
We welcome contributions to Quickemu.
|
||||||
|
|
||||||
|
- Help other Quickemu users by answering questions in the [Quickemu Discussions](https://github.com/quickemu-project/quickemu/discussions) 🛟
|
||||||
|
- Improve the documentation in [this README](https://github.com/quickemu-project/quickemu/edit/master/README.md) and the [Quickemu Wiki](https://github.com/quickemu-project/quickemu/wiki) 📖
|
||||||
|
- File bug reports and feature requests in the [Quickemu Issues](https://github.com/quickemu-project/quickemu/issues) 📁
|
||||||
|
- Submit [Quickemu Pull requests](https://github.com/quickemu-project/quickemu/pulls) to fix bugs 🐞 or add new features ✨
|
||||||
|
- Follow our [guide to adding a new OS to quickget](https://github.com/quickemu-project/quickemu/wiki/06-Advanced-quickget-features#adding-a-new-os-to-quickget)
|
||||||
|
- Commit messages must [conform to the Conventional Commits specification](https://www.conventionalcommits.org/).
|
||||||
|
- [Sponsor the project](https://github.com/sponsors/flexiondotorg) 💖
|
|
@ -0,0 +1,47 @@
|
||||||
|
class Quickemu < Formula
|
||||||
|
desc "Quickly create and run optimised Windows, macOS and Linux virtual machines"
|
||||||
|
homepage "https://github.com/quickemu-project/quickemu"
|
||||||
|
|
||||||
|
livecheck do
|
||||||
|
url :stable
|
||||||
|
end
|
||||||
|
|
||||||
|
stable do
|
||||||
|
latest_release = JSON.parse(Utils.safe_popen_read("curl", "-s", "https://api.github.com/repos/quickemu-project/quickemu/releases/latest"))
|
||||||
|
version latest_release["tag_name"]
|
||||||
|
url "https://api.github.com/repos/quickemu-project/quickemu/tarball/#{latest_release["tag_name"]}"
|
||||||
|
end
|
||||||
|
|
||||||
|
head "https://github.com/quickemu-project/quickemu.git"
|
||||||
|
license "MIT"
|
||||||
|
|
||||||
|
depends_on "bash"
|
||||||
|
depends_on "cdrtools"
|
||||||
|
depends_on "coreutils"
|
||||||
|
depends_on "jq"
|
||||||
|
depends_on "python3"
|
||||||
|
depends_on "qemu"
|
||||||
|
depends_on "samba"
|
||||||
|
depends_on "socat"
|
||||||
|
depends_on "swtpm"
|
||||||
|
depends_on "usbutils"
|
||||||
|
depends_on "zsync"
|
||||||
|
|
||||||
|
def install
|
||||||
|
bin.install "quickemu"
|
||||||
|
bin.install "quickget"
|
||||||
|
end
|
||||||
|
|
||||||
|
test do
|
||||||
|
# `test do` will create, run in and delete a temporary directory.
|
||||||
|
#
|
||||||
|
# This test will fail and we won't accept that! For Homebrew/homebrew-core
|
||||||
|
# this will need to be a test that verifies the functionality of the
|
||||||
|
# software. Run the test with `brew test quickemu`. Options passed
|
||||||
|
# to `brew install` such as `--HEAD` also need to be provided to `brew test`.
|
||||||
|
#
|
||||||
|
# The installed folder is not in the path, so use the entire path to any
|
||||||
|
# executables being tested: `system bin/"program", "do", "something"`.
|
||||||
|
system "false"
|
||||||
|
end
|
||||||
|
end
|
954
README.md
954
README.md
|
@ -1,39 +1,49 @@
|
||||||
<h1 align="center">
|
<div align="center">
|
||||||
<img src=".github/logo.png" alt="Quickemu" width="256" />
|
<img src=".github/logo.png" alt="Quickemu" width="256" />
|
||||||
<br />
|
|
||||||
Quickemu
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
<p align="center"><b>Quickly create and run optimised Windows, macOS and Linux desktop virtual machines.</b></p>
|
# Quickemu
|
||||||
<div align="center"><img src=".github/screenshot.png" alt="Quickemu Screenshot" /></div>
|
|
||||||
<p align="center">Made with 💝 for <img src=".github/tux.png" align="top" width="18" /></p>
|
|
||||||
|
|
||||||
## Introduction
|
**Quickly create and run optimised Windows, macOS and Linux virtual machines:**
|
||||||
|
|
||||||
Quickly create and run highly optimised desktop virtual machines for
|
**Made with 💝 for <img src=".github/tux.png" align="top" width="24" alt="Tux (Linux)"/> & <img src=".github/apple.png" align="top" width="24" alt="Apple (macOS)"/>**
|
||||||
Linux, macOS and Windows; with just two commands. You decide what
|
</div>
|
||||||
operating system you want to run and Quickemu will figure out the best
|
|
||||||
way to do it for you. For example:
|
|
||||||
|
|
||||||
``` bash
|
<p align="center">
|
||||||
quickget ubuntu-mate 22.04
|
<a href="https://wimpysworld.io/discord" target="_blank"><img alt="Discord" src="https://img.shields.io/discord/712850672223125565?style=for-the-badge&logo=discord&logoColor=%23ffffff&label=Discord&labelColor=%234253e8&color=%23e4e2e2"></a>
|
||||||
quickemu --vm ubuntu-mate-22.04.conf
|
<a href="https://fosstodon.org/@wimpy" target="_blank"><img alt="Mastodon" src="https://img.shields.io/badge/Mastodon-6468fa?style=for-the-badge&logo=mastodon&logoColor=%23ffffff"></a>
|
||||||
```
|
<a href="https://twitter.com/m_wimpress" target="_blank"><img alt="Twitter" src="https://img.shields.io/badge/Twitter-303030?style=for-the-badge&logo=x&logoColor=%23ffffff"></a>
|
||||||
|
<a href="https://linkedin.com/in/martinwimpress" target="_blank"><img alt="LinkedIn" src="https://img.shields.io/badge/LinkedIn-1667be?style=for-the-badge&logo=linkedin&logoColor=%23ffffff"></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
The original objective of the project was to enable quick testing of
|
|
||||||
Linux distributions where the virtual machine configurations can be
|
|
||||||
stored anywhere, such as external USB storage or your home directory,
|
|
||||||
and no elevated permissions are required to run the virtual machines.
|
|
||||||
**Quickemu now also includes comprehensive support for macOS and
|
|
||||||
Windows**.
|
|
||||||
|
|
||||||
## Features
|
# Introduction
|
||||||
|
|
||||||
- **macOS** Monterey, Big Sur, Catalina, Mojave & High Sierra
|
**Quickemu** is a wrapper for the excellent [QEMU](https://www.qemu.org/) that
|
||||||
|
automatically *"does the right thing"* when creating virtual machines. No
|
||||||
|
requirement for exhaustive configuration options. You decide what operating
|
||||||
|
system you want to run and Quickemu takes care of the rest 🤖
|
||||||
|
|
||||||
|
- `quickget` **automatically downloads the upstream OS** and creates the configuration 📀
|
||||||
|
- `quickemu` enumerates your hardware and launches the virtual machine with the **optimum configuration best suited to your computer** ⚡️
|
||||||
|
|
||||||
|
The original objective of the project was to [enable quick testing of Linux
|
||||||
|
distributions](https://github.com/quickemu-project/quickemu/wiki/02-Create-Linux-virtual-machines)
|
||||||
|
where the virtual machines and their configuration can be stored anywhere (such
|
||||||
|
as external USB storage or your home directory) and no elevated permissions are
|
||||||
|
required to run the virtual machines.
|
||||||
|
|
||||||
|
**Today, Quickemu includes comprehensive support for [macOS](https://github.com/quickemu-project/quickemu/wiki/03-Create-macOS-virtual-machines),
|
||||||
|
[Windows](https://github.com/quickemu-project/quickemu/wiki/04-Create-Windows-virtual-machines)**, most of the BSDs, novel non-Linux operating systems such as FreeDOS, Haiku, KolibriOS, OpenIndiana, ReactOS, and more.
|
||||||
|
|
||||||
|
# Features
|
||||||
|
|
||||||
|
- Host support for **Linux and macOS**
|
||||||
|
- **macOS** Sonoma, Ventura, Monterey, Big Sur, Catalina & Mojave
|
||||||
- **Windows** 10 and 11 including TPM 2.0
|
- **Windows** 10 and 11 including TPM 2.0
|
||||||
|
- **Windows Server** 2022 2019 2016
|
||||||
- [Ubuntu](https://ubuntu.com/desktop) and all the **[official Ubuntu
|
- [Ubuntu](https://ubuntu.com/desktop) and all the **[official Ubuntu
|
||||||
flavours](https://ubuntu.com/download/flavours)**
|
flavours](https://ubuntu.com/download/flavours)**
|
||||||
- **Over 360 operating system editions are supported!**
|
- **Nearly 1000 operating system editions are supported!**
|
||||||
- Full SPICE support including host/guest clipboard sharing
|
- Full SPICE support including host/guest clipboard sharing
|
||||||
- VirtIO-webdavd file sharing for Linux and Windows guests
|
- VirtIO-webdavd file sharing for Linux and Windows guests
|
||||||
- VirtIO-9p file sharing for Linux and macOS guests
|
- VirtIO-9p file sharing for Linux and macOS guests
|
||||||
|
@ -50,886 +60,52 @@ Windows**.
|
||||||
- Full duplex audio
|
- Full duplex audio
|
||||||
- Braille support
|
- Braille support
|
||||||
- EFI (with or without SecureBoot) and Legacy BIOS boot
|
- EFI (with or without SecureBoot) and Legacy BIOS boot
|
||||||
- Graphical user interfaces available
|
|
||||||
|
|
||||||
Quickemu is a wrapper for the excellent [QEMU](https://www.qemu.org/)
|
## As featured on [Linux Matters](https://linuxmatters.sh) podcast!
|
||||||
that attempts to automatically *"do the right thing"*, rather than
|
|
||||||
expose exhaustive configuration options.
|
|
||||||
|
|
||||||
We have a Discord for this project:
|
The presenters of Linux Matters 🐧🎙️ are the creators of each of the principal Quickemu projects. We discussed Quickemu's 2024 reboot in [Episode 30 - Quickemu Rising From the Bashes](https://linuxmatters.sh/30). <!-- and in [Episode 32 - Quick, quicker, quickest](https://linuxmatters.sh/32) [Martin](https://github.com/flexiondotorg) unveils macOS host support for [**Quickemu**](https://github.com/quickemu-project/quickemu), [Mark](https://github.com/marxjohnson) explains the origins of the [**Quickgui**](https://github.com/quickemu-project/quickgui) desktop app and upcoming improvements, and [Alan](https://github.com/popey) debuts [**Quicktest**](https://github.com/quickemu-project/quicktest); a framework for automatically testing operating systems via Quickemu -->
|
||||||
[](https://discord.gg/sNmz3uw)
|
|
||||||
|
|
||||||
See this (old) video where I explain some of my motivations for creating
|
<div align="center">
|
||||||
Quickemu.
|
<a href="https://linuxmatters.sh" target="_blank"><img src="https://github.com/wimpysworld/nix-config/raw/main/.github/screenshots/linuxmatters.png" alt="Linux Matters Podcast"/></a>
|
||||||
|
<br />
|
||||||
|
<em>Linux Matters Podcast</em>
|
||||||
|
</div>
|
||||||
|
|
||||||
[](https://www.youtube.com/watch?v=AOTYWEgw0hI)
|
|
||||||
|
|
||||||
## Requirements
|
[Once Quickemu is installed](https://github.com/quickemu-project/quickemu/wiki/01-Installation), there are two simple steps to create and run a virtual machine:
|
||||||
|
|
||||||
- [QEMU](https://www.qemu.org/) (*6.0.0 or newer*) **with GTK, SDL,
|
- `quickget` automatically downloads the ISO image for the operating system you want to run and creates a configuration file for the virtual machine.
|
||||||
SPICE & VirtFS support**
|
|
||||||
- [bash](https://www.gnu.org/software/bash/) (*4.0 or newer*)
|
|
||||||
- [Coreutils](https://www.gnu.org/software/coreutils/)
|
|
||||||
- [EDK II](https://github.com/tianocore/edk2)
|
|
||||||
- [grep](https://www.gnu.org/software/grep/)
|
|
||||||
- [jq](https://stedolan.github.io/jq/)
|
|
||||||
- [LSB](https://wiki.linuxfoundation.org/lsb/start)
|
|
||||||
- [procps](https://gitlab.com/procps-ng/procps)
|
|
||||||
- [python3](https://www.python.org/)
|
|
||||||
- [macrecovery](https://github.com/acidanthera/OpenCorePkg/tree/master/Utilities/macrecovery)
|
|
||||||
- [mkisofs](http://cdrtools.sourceforge.net/private/cdrecord.html)
|
|
||||||
- [usbutils](https://github.com/gregkh/usbutils)
|
|
||||||
- [util-linux](https://github.com/karelzak/util-linux)
|
|
||||||
- [sed](https://www.gnu.org/software/sed/)
|
|
||||||
- [socat](http://www.dest-unreach.org/socat/)
|
|
||||||
- [spicy](https://gitlab.freedesktop.org/spice/spice-gtk)
|
|
||||||
- [swtpm](https://github.com/stefanberger/swtpm)
|
|
||||||
- [Wget](https://www.gnu.org/software/wget/)
|
|
||||||
- [xdg-user-dirs](https://www.freedesktop.org/wiki/Software/xdg-user-dirs/)
|
|
||||||
- [xrandr](https://gitlab.freedesktop.org/xorg/app/xrandr)
|
|
||||||
- [zsync](http://zsync.moria.org.uk/)
|
|
||||||
- [unzip](http://www.info-zip.org/UnZip.html)
|
|
||||||
|
|
||||||
### Installing Requirements
|
|
||||||
|
|
||||||
For Ubuntu, Arch and nixos systems the
|
|
||||||
[ppa](https://launchpad.net/~flexiondotorg/+archive/ubuntu/quickemu),
|
|
||||||
[AUR](https://aur.archlinux.org/packages/quickemu) or
|
|
||||||
[nix](https://github.com/NixOS/nixpkgs/tree/master/pkgs/development/quickemu)
|
|
||||||
packaging will take care of the dependencies. For other host
|
|
||||||
distributions or operating systems it will be necessary to install the
|
|
||||||
above requirements or their equivalents.
|
|
||||||
|
|
||||||
These examples may save a little typing
|
|
||||||
|
|
||||||
Debian (and direct derivatives such as MX Linux):
|
|
||||||
|
|
||||||
sudo apt install qemu bash coreutils ovmf grep jq lsb-base procps python3 genisoimage usbutils util-linux sed spice-client-gtk libtss2-tcti-swtpm0 wget xdg-user-dirs zsync unzip
|
|
||||||
|
|
||||||
Fedora:
|
|
||||||
|
|
||||||
sudo dnf install qemu bash coreutils edk2-tools grep jq lsb procps python3 genisoimage usbutils util-linux sed spice-gtk-tools swtpm wget xdg-user-dirs xrandr unzip
|
|
||||||
|
|
||||||
MacOS:
|
|
||||||
|
|
||||||
This is a work in progress (see [issue
|
|
||||||
248](https://github.com/quickemu-project/quickemu/issues/248) for other
|
|
||||||
steps and changes that may enable running on MacOS)
|
|
||||||
|
|
||||||
brew install qemu bash coreutils grep jq python@3.10 cdrtools gnu-sed spice-gtk wget zsync
|
|
||||||
|
|
||||||
# Usage
|
|
||||||
|
|
||||||
## Graphical User Interfaces
|
|
||||||
|
|
||||||
While `quickemu` and `quickget` are designed for the terminal, a
|
|
||||||
graphical user interface is also available:
|
|
||||||
|
|
||||||
- **[Quickgui](https://github.com/quickgui/quickgui)** by [Mark
|
|
||||||
Johnson](https://github.com/marxjohnson) and [Yannick
|
|
||||||
Mauray](https://github.com/ymauray).
|
|
||||||
|
|
||||||
Many thanks to [Luke Wesley-Holley](https://github.com/Lukewh) and
|
|
||||||
[Philipp Kiemle](https://github.com/daPhipz) for creating the
|
|
||||||
**[Quickemu icons](https://github.com/Lukewh/quickemu-icons)** 🎨
|
|
||||||
|
|
||||||
### Quickgui for Ubuntu
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
sudo add-apt-repository ppa:yannick-mauray/quickgui
|
|
||||||
sudo apt update
|
|
||||||
sudo apt install quickgui
|
|
||||||
```
|
|
||||||
|
|
||||||
### quickemu quickget X terminal project
|
|
||||||
|
|
||||||
From Nov 2023, there is also a multi option desktop integrated text
|
|
||||||
interface, with lots of unique tools and utilities to help you make
|
|
||||||
light work of installations, snapshots and disk management
|
|
||||||
|
|
||||||
- **[qqX](https://github.com/TuxVinyards/qqX)** is independently
|
|
||||||
curated by [Alex Genovese](https://github.com/TuxVinyards) (see the
|
|
||||||
github pages)
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
# Install Quickemu
|
|
||||||
|
|
||||||
## Arch
|
|
||||||
|
|
||||||
Quickemu is available from the AUR (Arch user repository), and can be
|
|
||||||
installed via any AUR helper. Assuming your AUR helper is yay, Run the
|
|
||||||
following command:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
yay -Sy quickemu
|
|
||||||
```
|
|
||||||
|
|
||||||
## Ubuntu
|
|
||||||
|
|
||||||
Quickemu is available from a PPA for Ubuntu users. The Quickemu PPA also
|
|
||||||
includes a back port of QEMU 6.0.0 for 20.04 (Focal) and 21.04
|
|
||||||
(Hirsute). To install Quickemu and all the dependencies run the
|
|
||||||
following in a terminal:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
sudo apt-add-repository ppa:flexiondotorg/quickemu
|
|
||||||
sudo apt update
|
|
||||||
sudo apt install quickemu
|
|
||||||
```
|
|
||||||
|
|
||||||
## Other Linux
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
git clone --filter=blob:none https://github.com/wimpysworld/quickemu
|
|
||||||
cd quickemu
|
|
||||||
```
|
|
||||||
|
|
||||||
Now install all the **Requirements** documented above.
|
|
||||||
|
|
||||||
### Other sources
|
|
||||||
|
|
||||||
[Repology.org](https://repology.org/) found the following releases have
|
|
||||||
been packaged.
|
|
||||||
|
|
||||||
#### Quickemu
|
|
||||||
|
|
||||||
[](https://repology.org/project/quickemu/versions)
|
|
||||||
|
|
||||||
#### Quickgui
|
|
||||||
|
|
||||||
[](https://repology.org/project/quickgui/versions)
|
|
||||||
|
|
||||||
## Ubuntu Guest
|
|
||||||
|
|
||||||
`quickget` will automatically download an Ubuntu release and create the
|
|
||||||
virtual machine configuration.
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
quickget ubuntu 22.04
|
|
||||||
quickemu --vm ubuntu-22.04.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
- Complete the installation as normal.
|
|
||||||
- Post-install:
|
|
||||||
- Install the SPICE agent (`spice-vdagent`) in the guest to enable
|
|
||||||
copy/paste and USB redirection
|
|
||||||
- `sudo apt install spice-vdagent`
|
|
||||||
- Install the SPICE WebDAV agent (`spice-webdavd`) in the guest to
|
|
||||||
enable file sharing.
|
|
||||||
- `sudo apt install spice-webdavd`
|
|
||||||
|
|
||||||
### Ubuntu devel (daily-live) images
|
|
||||||
|
|
||||||
`quickget` can also download/refresh devel images via `zsync` for Ubuntu
|
|
||||||
developers and testers.
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
quickget ubuntu devel
|
|
||||||
quickemu --vm ubuntu-devel.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
You can run `quickget ubuntu devel` to refresh your daily development
|
|
||||||
image as often as you like, it will even automatically switch to a new
|
|
||||||
series.
|
|
||||||
|
|
||||||
### Ubuntu Flavours
|
|
||||||
|
|
||||||
All the official Ubuntu flavours are supported, just replace `ubuntu`
|
|
||||||
with your preferred flavour.
|
|
||||||
|
|
||||||
- `edubuntu` (Edubuntu)
|
|
||||||
- `kubuntu` (Kubuntu)
|
|
||||||
- `lubuntu` (Lubuntu)
|
|
||||||
- `ubuntu-budgie` (Ubuntu Budgie)
|
|
||||||
- `ubuntucinnamon` (Ubuntu Cinnamon)
|
|
||||||
- `ubuntukylin` (Ubuntu Kylin)
|
|
||||||
- `ubuntu-mate` (Ubuntu MATE)
|
|
||||||
- `ubuntu-server` (Ubuntu Server)
|
|
||||||
- `ubuntustudio` (Ubuntu Studio)
|
|
||||||
- `ubuntu` (Ubuntu)
|
|
||||||
- `ubuntu-unity` (Ubuntu Unity)
|
|
||||||
- `xubuntu` (Xubuntu)
|
|
||||||
|
|
||||||
You can also use `quickget` with options to:
|
|
||||||
|
|
||||||
``` shell
|
``` shell
|
||||||
# show an OS ISO download URL for {os} {release} [edition]
|
quickget nixos unstable minimal
|
||||||
quickget --show-iso-url fedora 38 Silverblue
|
|
||||||
# test if and OS ISO is available for {os} {release} [edition]
|
|
||||||
quickget --test-iso-url nixos 23.05 plasma5
|
|
||||||
# open an OS distribution homepage in a browser
|
|
||||||
quickget --open-distro-homepage ubuntu-mate
|
|
||||||
```
|
```
|
||||||
|
|
||||||
The `--show-iso-url` and `--test-iso-url` options **do not** work for
|
- `quickemu` starts the virtual machine using the configuration file created by `quickget`.
|
||||||
`Windows` (`quickget` will begin downloading the requested release and
|
|
||||||
edition of windows)
|
|
||||||
|
|
||||||
## Other Operating Systems
|
``` shell
|
||||||
|
quickemu --vm nixos-unstable-minimal.conf
|
||||||
`quickget` also supports:
|
|
||||||
|
|
||||||
- `alma` (Alma Linux)
|
|
||||||
- `alpine` (Alpine Linux)
|
|
||||||
- `android` (Android x86)
|
|
||||||
- `antix` (Antix)
|
|
||||||
- `archcraft` (Archcraft)
|
|
||||||
- `archlinux` (Arch Linux)
|
|
||||||
- `arcolinux` (Arco Linux)
|
|
||||||
- `batocera` (Batocera)
|
|
||||||
- `blendos` (BlendOS)
|
|
||||||
- `bodhi` (Bodhi)
|
|
||||||
- `bunsenlabs` (Bunsenlabs)
|
|
||||||
- `cachyos` (CachyOS)
|
|
||||||
- `centos-stream` (CentOS Stream)
|
|
||||||
- `debian` (Debian)
|
|
||||||
- `deepin` (Deepin)
|
|
||||||
- `devuan` (Devuan)
|
|
||||||
- `dragonflybsd` (DragonFlyBSD)
|
|
||||||
- `elementary` (elementary OS)
|
|
||||||
- `endeavouros` (EndeavourOS)
|
|
||||||
- `endless` (Endless OS)
|
|
||||||
- `fedora` (Fedora)
|
|
||||||
- `freebsd` (FreeBSD)
|
|
||||||
- `freedos` (FreeDOS)
|
|
||||||
- `garuda` (Garuda Linux)
|
|
||||||
- `gentoo` (Gentoo)
|
|
||||||
- `ghostbsd` (GhostBSD)
|
|
||||||
- `haiku` (Haiku)
|
|
||||||
- `holoiso` (SteamOS HoloISO)
|
|
||||||
- `kali` (Kali)
|
|
||||||
- `kdeneon` (KDE Neon)
|
|
||||||
- `kolibrios` (KolibriOS)
|
|
||||||
- `linuxlite` (Linux Lite)
|
|
||||||
- `linuxmint` (Linux Mint)
|
|
||||||
- `lmde` (Linux Mint Debian Edition)
|
|
||||||
- `mageia` (Mageia)
|
|
||||||
- `manjaro` (Manjaro)
|
|
||||||
- `mxlinux` (MX Linux)
|
|
||||||
- `netboot` (netboot.xyz)
|
|
||||||
- `netbsd` (NetBSD)
|
|
||||||
- `nixos` (NixOS)
|
|
||||||
- `openbsd` (OpenBSD)
|
|
||||||
- `openindiana` (OpenIndiana)
|
|
||||||
- `opensuse` (openSUSE)
|
|
||||||
- `oraclelinux` (Oracle Linux)
|
|
||||||
- `peppermint` (PeppermintOS)
|
|
||||||
- `popos` (Pop!\_OS)
|
|
||||||
- `porteus` (Porteus)
|
|
||||||
- `reactos` (ReactOS)
|
|
||||||
- `rebornos` (RebornOS)
|
|
||||||
- `rockylinux` (Rocky Linux)
|
|
||||||
- `siduction` (Siduction)
|
|
||||||
- `slackware` (Slackware)
|
|
||||||
- `solus` (Solus)
|
|
||||||
- `spiral` (Spiral)
|
|
||||||
- `tails` (Tails)
|
|
||||||
- `tinycore` (Tiny Core Linux)
|
|
||||||
- `trisquel` (Trisquel)
|
|
||||||
- `truenas-core` (TrueNAS Core)
|
|
||||||
- `truenas-scale` (TrueNAS Scale)
|
|
||||||
- `vanillaos` (Vanilla OS)
|
|
||||||
- `void` (Void Linux)
|
|
||||||
- `vxlinux` (VX Linux)
|
|
||||||
- `xerolinux` (XeroLinux)
|
|
||||||
- `zorin` (Zorin OS)
|
|
||||||
|
|
||||||
Or you can download a Linux image and manually create a VM
|
|
||||||
configuration.
|
|
||||||
|
|
||||||
- Download a .iso image of a Linux distribution
|
|
||||||
- Create a VM configuration file; for example `debian-bullseye.conf`
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
guest_os="linux"
|
|
||||||
disk_img="debian-bullseye/disk.qcow2"
|
|
||||||
iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- Use `quickemu` to start the virtual machine:
|
Execute `quickget` (with no arguments) to see a list of all the supported operating systems.
|
||||||
|
|
||||||
``` bash
|
## Demo
|
||||||
quickemu --vm debian-bullseye.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
- Complete the installation as normal.
|
<div align="center">
|
||||||
- Post-install:
|
|
||||||
- Install the SPICE agent (`spice-vdagent`) in the guest to enable
|
|
||||||
copy/paste and USB redirection.
|
|
||||||
- Install the SPICE WebDAV agent (`spice-webdavd`) in the guest to
|
|
||||||
enable file sharing.
|
|
||||||
|
|
||||||
## macOS Guest
|
<a href="https://asciinema.org/a/658148?autoplay=1" target="_blank"><img src="https://asciinema.org/a/658148.svg" /></a>
|
||||||
|
|
||||||
`quickget` automatically downloads a macOS recovery image and creates a
|
</div>
|
||||||
virtual machine configuration.
|
|
||||||
|
|
||||||
``` bash
|
# Documentation
|
||||||
quickget macos catalina
|
|
||||||
quickemu --vm macos-catalina.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
macOS `high-sierra`, `mojave`, `catalina`, `big-sur`, `monterey` and
|
The wiki describes how to get up and running with Quickemu and also covers more advanced configuration and usage.
|
||||||
`ventura` are supported.
|
|
||||||
|
|
||||||
- Use cursor keys and enter key to select the **macOS Base System**
|
- [**Installation**](https://github.com/quickemu-project/quickemu/wiki/01-Installation) 💾
|
||||||
- From **macOS Utilities**
|
- [**Create Linux virtual machines**](https://github.com/quickemu-project/quickemu/wiki/02-Create-Linux-virtual-machines) 🐧
|
||||||
- Click **Disk Utility** and **Continue**
|
- [**Create macOS virtual machines**](https://github.com/quickemu-project/quickemu/wiki/03-Create-macOS-virtual-machines) 🍏
|
||||||
- Select `QEMU HARDDISK Media` (\~103.08GB) from the list (on
|
- [**Create Windows virtual machines**](https://github.com/quickemu-project/quickemu/wiki/04-Create-Windows-virtual-machines) 🪟
|
||||||
Big Sur and above use `Apple Inc. VirtIO Block Device`) and
|
- [**Advanced quickemu configuration**](https://github.com/quickemu-project/quickemu/wiki/05-Advanced-quickemu-configuration) 🔧
|
||||||
click **Erase**.
|
- [**Advanced quickget features**](https://github.com/quickemu-project/quickemu/wiki/06-Advanced-quickget-features) 🤓
|
||||||
- Enter a `Name:` for the disk
|
- [**Alternative frontends**](https://github.com/quickemu-project/quickemu/wiki/07-Alternative-frontends) 🧑💻
|
||||||
- If you are installing macOS Mojave or later (Catalina, Big
|
- [**References**](https://github.com/quickemu-project/quickemu/wiki/08-References) 📚️
|
||||||
Sur, Monterey and Ventura), choose any of the APFS options
|
|
||||||
as the filesystem. MacOS Extended may not work.
|
|
||||||
- Click **Erase**.
|
|
||||||
- Click **Done**.
|
|
||||||
- Close Disk Utility
|
|
||||||
- From **macOS Utilities**
|
|
||||||
- Click **Reinstall macOS** and **Continue**
|
|
||||||
- Complete the installation as you normally would.
|
|
||||||
- On the first reboot use cursor keys and enter key to select
|
|
||||||
**macOS Installer**
|
|
||||||
- On the subsequent reboots use cursor keys and enter key to
|
|
||||||
select the disk you named
|
|
||||||
- Once you have finished installing macOS you will be presented with
|
|
||||||
an the out-of-the-box first-start wizard to configure various
|
|
||||||
options and set up your username and password
|
|
||||||
- OPTIONAL: After you have concluded the out-of-the-box wizard, you
|
|
||||||
may want to enable the TRIM feature that the computer industry
|
|
||||||
created for SSD disks. This feature in our macOS installation will
|
|
||||||
allow QuickEmu to compact (shrink) your macOS disk image whenever
|
|
||||||
you delete files inside the Virtual Machine. Without this step your
|
|
||||||
macOS disk image will only ever get larger and will not shrink even
|
|
||||||
when you delete lots of data inside macOS.
|
|
||||||
- To enable TRIM, open the Terminal application and type the
|
|
||||||
following command followed by pressing
|
|
||||||
command on the hard disk when files are deleted:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
sudo trimforce enable
|
|
||||||
```
|
|
||||||
|
|
||||||
You will be prompted to enter your account's password to gain the
|
|
||||||
privilege needed. Once you've entered your password and pressed
|
|
||||||
in the form of two questions that require you to type
|
|
||||||
response as though you said "no":
|
|
||||||
|
|
||||||
``` plain
|
|
||||||
IMPORTANT NOTICE: This tool force-enables TRIM for all relevant attached devices, even though such devices may not have been validated for data integrity while using TRIM. Use of this tool to enable TRIM may result in unintended data loss or data corruption. It should not be used in a commercial operating environment or with important data. Before using this tool, you should back up all of your data and regularly back up data while TRIM is enabled. This tool is provided on an "as is" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THIS TOOL OR ITS USE ALONE OR IN COMBINATION WITH YOUR DEVICES, SYSTEMS, OR SERVICES. BY USING THIS TOOL TO ENABLE TRIM, YOU AGREE THAT, TO THE EXTENT PERMITTED BY APPLICABLE LAW, USE OF THE TOOL IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU.
|
|
||||||
Are you sure you with to proceed (y/N)?
|
|
||||||
```
|
|
||||||
|
|
||||||
And a second confirmation once you've confirmed the previous one:
|
|
||||||
|
|
||||||
``` plain
|
|
||||||
Your system will immediately reboot when this is complete.
|
|
||||||
Is this OK (y/N)?
|
|
||||||
```
|
|
||||||
|
|
||||||
As the last message states, your system will automatically reboot as
|
|
||||||
soon as the command completes.
|
|
||||||
|
|
||||||
The default macOS configuration looks like this:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
guest_os="macos"
|
|
||||||
img="macos-catalina/RecoveryImage.img"
|
|
||||||
disk_img="macos-catalina/disk.qcow2"
|
|
||||||
macos_release="catalina"
|
|
||||||
```
|
|
||||||
|
|
||||||
- `guest_os="macos"` instructs Quickemu to optimise for macOS.
|
|
||||||
- `macos_release="catalina"` instructs Quickemu to optimise for a
|
|
||||||
particular macOS release.
|
|
||||||
- For example VirtIO Network and Memory Ballooning are available
|
|
||||||
in Big Sur and newer, but not previous releases.
|
|
||||||
- And VirtIO Block Media (disks) are supported/stable in Catalina
|
|
||||||
and newer.
|
|
||||||
|
|
||||||
### macOS compatibility
|
|
||||||
|
|
||||||
There are some considerations when running macOS via Quickemu.
|
|
||||||
|
|
||||||
- Supported macOS releases:
|
|
||||||
- High Sierra
|
|
||||||
- Mojave
|
|
||||||
- Catalina **(Recommended)**
|
|
||||||
- Big Sur
|
|
||||||
- Monterey
|
|
||||||
- Ventura
|
|
||||||
- `quickemu` will automatically download the required
|
|
||||||
[OpenCore](https://github.com/acidanthera/OpenCorePkg) bootloader
|
|
||||||
and OVMF firmware from [OSX-KVM](https://github.com/kholia/OSX-KVM).
|
|
||||||
- Optimised by default, but no GPU acceleration is available.
|
|
||||||
- Host CPU vendor is detected and guest CPU is optimised
|
|
||||||
accordingly.
|
|
||||||
- [VirtIO Block
|
|
||||||
Media](https://www.kraxel.org/blog/2019/06/macos-qemu-guest/) is
|
|
||||||
used for the system disk where supported.
|
|
||||||
- [VirtIO `usb-tablet`](http://philjordan.eu/osx-virt/) is used
|
|
||||||
for the mouse.
|
|
||||||
- VirtIO Network (`virtio-net`) is supported and enabled on macOS
|
|
||||||
Big Sur and newer but previous releases use `vmxnet3`.
|
|
||||||
- VirtIO Memory Ballooning is supported and enabled on macOS Big
|
|
||||||
Sur and newer but disabled for other support macOS releases.
|
|
||||||
- USB host and SPICE pass-through is:
|
|
||||||
- UHCI (USB 2.0) on macOS Catalina and earlier.
|
|
||||||
- XHCI (USB 3.0) on macOS Big Sur and newer.
|
|
||||||
- Display resolution can only be changed via macOS System Preferences.
|
|
||||||
- **Full Duplex audio requires [VoodooHDA
|
|
||||||
OC](https://github.com/chris1111/VoodooHDA-OC) or pass-through a USB
|
|
||||||
audio-device to the macOS guest VM**.
|
|
||||||
- NOTE! [Gatekeeper](https://disable-gatekeeper.github.io/) and
|
|
||||||
[System Integrity Protection
|
|
||||||
(SIP)](https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection)
|
|
||||||
need to be disabled to install VoodooHDA OC
|
|
||||||
- File sharing between guest and host is available via
|
|
||||||
[virtio-9p](https://wiki.qemu.org/Documentation/9psetup) and [SPICE
|
|
||||||
webdavd](https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24).
|
|
||||||
- Copy/paste via SPICE agent is **not available on macOS**.
|
|
||||||
|
|
||||||
### macOS App Store
|
|
||||||
|
|
||||||
If you see *"Your device or computer could not be verified"* when you
|
|
||||||
try to login to the App Store, make sure that your wired ethernet device
|
|
||||||
is `en0`. Use `ifconfig` in a terminal to verify this.
|
|
||||||
|
|
||||||
If the wired ethernet device is not `en0`, then then go to *System
|
|
||||||
Preferences* -\> *Network*, delete all the network devices and apply the
|
|
||||||
changes. Next, open a terminal and run the following:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
|
|
||||||
```
|
|
||||||
|
|
||||||
Now reboot, and the App Store should work.
|
|
||||||
|
|
||||||
## Windows 8, 10 & 11 Guests
|
|
||||||
|
|
||||||
`quickget` can download
|
|
||||||
[Windows10](https://www.microsoft.com/software-download/windows10) and
|
|
||||||
[Windows 11](https://www.microsoft.com/software-download/windows11)
|
|
||||||
automatically and create an optimised virtual machine configuration.
|
|
||||||
This configuration also includes the [VirtIO drivers for
|
|
||||||
Windows](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/).
|
|
||||||
|
|
||||||
Windows 8.1 is also supported but doesn't feature any automated
|
|
||||||
installation or driver optimisation.
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
quickget windows 11
|
|
||||||
quickemu --vm windows-11.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
- Complete the installation as you normally would.
|
|
||||||
- All relevant drivers and services should be installed automatically.
|
|
||||||
- A local administrator user account is automatically created, with
|
|
||||||
these credentials:
|
|
||||||
- Username: `Quickemu`
|
|
||||||
- Password: `quickemu`
|
|
||||||
|
|
||||||
The default Windows 11 configuration looks like this:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
guest_os="windows"
|
|
||||||
disk_img="windows-11/disk.qcow2"
|
|
||||||
iso="windows-11/windows-11.iso"
|
|
||||||
fixed_iso="windows-11/virtio-win.iso"
|
|
||||||
tpm="on"
|
|
||||||
secureboot="off"
|
|
||||||
```
|
|
||||||
|
|
||||||
- `guest_os="windows"` instructs `quickemu` to optimise for Windows.
|
|
||||||
- `fixed_iso=` specifies the ISO image that provides VirtIO drivers.
|
|
||||||
- `tpm="on"` instructs `quickemu` to create a software emulated TPM
|
|
||||||
device using `swtpm`.
|
|
||||||
|
|
||||||
# SPICE
|
|
||||||
|
|
||||||
The following features are available while using the SPICE protocol:
|
|
||||||
|
|
||||||
- Copy/paste between the guest and host
|
|
||||||
- Host file sharing to the guest
|
|
||||||
- USB device redirection
|
|
||||||
|
|
||||||
To use SPICE add `--display spice` to the Quickemu invocation, this
|
|
||||||
requires that the `spicy` client is installed, available from the
|
|
||||||
`spice-client-gtk` package in Debian/Ubuntu.
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
quickemu --vm ubuntu-22.04.conf --display spice
|
|
||||||
```
|
|
||||||
|
|
||||||
To enable copy/paste with a Windows guest, install [SPICE Windows guest
|
|
||||||
tools](https://www.spice-space.org/download.html) in the guest VM.
|
|
||||||
|
|
||||||
## Headless
|
|
||||||
|
|
||||||
To start a VM with SPICE enabled, but no display attached use
|
|
||||||
`--display none`. This requires that the `spicy` client is installed,
|
|
||||||
available from the `spice-client-gtk` package in Debian/Ubuntu to
|
|
||||||
connect to the running VM
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
quickemu --vm ubuntu-22.04.conf --display none
|
|
||||||
```
|
|
||||||
|
|
||||||
You can also use the `.ports` file in the VM directory to lookup what
|
|
||||||
SSH and SPICE ports the VM is connected to.
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
cat ubuntu-22.04/ubuntu-22.04.ports
|
|
||||||
```
|
|
||||||
|
|
||||||
If, for example, the SSH port is set to 22220, and assuming your VM has
|
|
||||||
a started SSH service (details vary by OS), you can typically SSH into
|
|
||||||
it from the host as follows:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
ssh -p 22220 your_vm_user@localhost
|
|
||||||
```
|
|
||||||
|
|
||||||
# Accessibility
|
|
||||||
|
|
||||||
Qemu provides support for using BrlAPI to display braille output on a
|
|
||||||
real or fake device.
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
quickemu --vm ubuntu-22.04.conf --braille --display sdl
|
|
||||||
```
|
|
||||||
|
|
||||||
# BIOS and EFI
|
|
||||||
|
|
||||||
Since Quickemu 2.1.0 `efi` is the default boot option. If you want to
|
|
||||||
override this behaviour then add the following line to you VM
|
|
||||||
configuration to enable legacy BIOS.
|
|
||||||
|
|
||||||
- `boot="legacy"` - Enable Legacy BIOS boot
|
|
||||||
|
|
||||||
# Tuning CPU cores, RAM & disks
|
|
||||||
|
|
||||||
By default, Quickemu will calculate the number of CPUs cores and RAM to
|
|
||||||
allocate to a VM based on the specifications of your host computer. You
|
|
||||||
can override this default behaviour and tune the VM configuration to
|
|
||||||
your liking.
|
|
||||||
|
|
||||||
Add additional lines to your virtual machine configuration:
|
|
||||||
|
|
||||||
- `cpu_cores="4"` - Specify the number of CPU cores allocated to the
|
|
||||||
VM
|
|
||||||
- `ram="4G"` - Specify the amount of RAM to allocate to the VM
|
|
||||||
- `disk_size="16G"` - Specify the size of the virtual disk allocated
|
|
||||||
to the VM
|
|
||||||
|
|
||||||
## Disk preallocation
|
|
||||||
|
|
||||||
Preallocation mode (allowed values: `off` (default), `metadata`,
|
|
||||||
`falloc`, `full`). An image with preallocated metadata is initially
|
|
||||||
larger but can improve performance when the image needs to grow.
|
|
||||||
|
|
||||||
Specify what disk preallocation should be used, if any, when creating
|
|
||||||
the system disk image by adding a line like this to your VM
|
|
||||||
configuration.
|
|
||||||
|
|
||||||
- `preallocation="metadata"`
|
|
||||||
|
|
||||||
## CD-ROM disks
|
|
||||||
|
|
||||||
If you want to expose an ISO image from the host to guest add the
|
|
||||||
following line to the VM configuration:
|
|
||||||
|
|
||||||
- `fixed_iso="/path/to/image.iso"`
|
|
||||||
|
|
||||||
## Floppy disks
|
|
||||||
|
|
||||||
If you're like [Alan Pope](https://popey.com) you'll probably want to
|
|
||||||
mount a floppy disk image in the guest. To do so add the following line
|
|
||||||
to the VM configuration:
|
|
||||||
|
|
||||||
- `floppy="/path/to/floppy.img"`
|
|
||||||
|
|
||||||
# File Sharing
|
|
||||||
|
|
||||||
All File Sharing options will only expose `~/Public` (or localised
|
|
||||||
variations) for the current user to the guest VMs.
|
|
||||||
|
|
||||||
## Samba 🐧 🍏 🪟
|
|
||||||
|
|
||||||
If `smbd` is available on the host, Quickemu will automatically enable
|
|
||||||
the built-in QEMU support for exposing a Samba share from the host to
|
|
||||||
the guest.
|
|
||||||
|
|
||||||
You can install the minimal Samba components on Ubuntu using:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
sudo apt install --no-install-recommends samba
|
|
||||||
```
|
|
||||||
|
|
||||||
If everything is set up correctly, the `smbd` address will be printed
|
|
||||||
when the virtual machine is started. For example:
|
|
||||||
|
|
||||||
- smbd: On guest: smb://10.0.2.4/qemu
|
|
||||||
|
|
||||||
If using a Windows guest, right-click on "This PC", click "Add a network
|
|
||||||
location", and paste this address, removing `smb:` and replacing forward
|
|
||||||
slashes with backslashes (in this example `\\10.0.2.4\qemu`).
|
|
||||||
|
|
||||||
## SPICE WebDAV 🐧 🪟
|
|
||||||
|
|
||||||
- TBD
|
|
||||||
|
|
||||||
## VirtIO-9P 🐧 🍏
|
|
||||||
|
|
||||||
- TBD
|
|
||||||
|
|
||||||
# Network port forwarding
|
|
||||||
|
|
||||||
Add an additional line to your virtual machine configuration. For
|
|
||||||
example:
|
|
||||||
|
|
||||||
- `port_forwards=("8123:8123" "8888:80")`
|
|
||||||
|
|
||||||
In the example above:
|
|
||||||
|
|
||||||
- Port 8123 on the host is forwarded to port 8123 on the guest.
|
|
||||||
- Port 8888 on the host is forwarded to port 80 on the guest.
|
|
||||||
|
|
||||||
# Disable networking
|
|
||||||
|
|
||||||
To completely disable all network interfaces in a guest VM add this
|
|
||||||
additional line to your virtual machine configuration:
|
|
||||||
|
|
||||||
- `network="none"`
|
|
||||||
|
|
||||||
# Restricted networking
|
|
||||||
|
|
||||||
You can isolate the guest from the host (and broader network) using the
|
|
||||||
restrict option, which will restrict networking to just the guest and
|
|
||||||
any virtual devices.
|
|
||||||
|
|
||||||
This can be used to prevent software running inside the guest from
|
|
||||||
phoning home while still providing a network inside the guest. Add this
|
|
||||||
additional line to your virtual machine configuration:
|
|
||||||
|
|
||||||
- `network="restrict"`
|
|
||||||
|
|
||||||
# Bridged networking
|
|
||||||
|
|
||||||
Connect your virtual machine to a preconfigured network bridge. Add an
|
|
||||||
additional line to your virtual machine configuration:
|
|
||||||
|
|
||||||
- `network="br0"`
|
|
||||||
|
|
||||||
If you want to have a persistent MAC address for your bridged network
|
|
||||||
interface in the guest VM you can add `macaddr` to the virtual machine
|
|
||||||
configuration. QEMU requires that the MAC address is in the range:
|
|
||||||
**52:54:00:AB:00:00 - 52:54:00:AB:FF:FF**
|
|
||||||
|
|
||||||
So you can generate your own MAC addresses with:
|
|
||||||
|
|
||||||
- `macaddr="52:54:00:AB:51:AE"`
|
|
||||||
|
|
||||||
# USB redirection
|
|
||||||
|
|
||||||
Quickemu supports USB redirection via SPICE pass-through and host
|
|
||||||
pass-through.
|
|
||||||
|
|
||||||
## SPICE redirection (recommended)
|
|
||||||
|
|
||||||
Using SPICE for USB pass-through is easiest as it doesn't require any
|
|
||||||
elevated permission, start Quickemu with `--display spice` and then
|
|
||||||
select `Input` -\> `Select USB Device for redirection` from the menu to
|
|
||||||
choose which device(s) you want to attach to the guest.
|
|
||||||
|
|
||||||
## Host redirection **NOT Recommended**
|
|
||||||
|
|
||||||
**USB host redirection is not recommended**, it is provided purely for
|
|
||||||
backwards compatibility to older versions of Quickemu. Using SPICE is
|
|
||||||
preferred, see above.
|
|
||||||
|
|
||||||
Add an additional line to your virtual machine configuration. For
|
|
||||||
example:
|
|
||||||
|
|
||||||
- `usb_devices=("046d:082d" "046d:085e")`
|
|
||||||
|
|
||||||
In the example above:
|
|
||||||
|
|
||||||
- The USB device with vendor_id 046d and product_id 082d will be
|
|
||||||
exposed to the guest.
|
|
||||||
- The USB device with vendor_id 046d and product_id 085e will be
|
|
||||||
exposed to the guest.
|
|
||||||
|
|
||||||
If the USB devices are not writable, `quickemu` will display the
|
|
||||||
appropriate commands to modify the USB device(s) access permissions,
|
|
||||||
like this:
|
|
||||||
|
|
||||||
- USB: Host pass-through requested:
|
|
||||||
- Sennheiser Communications EPOS GTW 270 on bus 001 device 005 needs permission changes:
|
|
||||||
sudo chown -v root:user /dev/bus/usb/001/005
|
|
||||||
ERROR! USB permission changes are required 👆
|
|
||||||
|
|
||||||
# TPM
|
|
||||||
|
|
||||||
Since Quickemu 2.2.0 a software emulated TPM device can be added to
|
|
||||||
guest virtual machines. Just add `tpm="on"` to your VM configuration.
|
|
||||||
`quickget` will automatically add this line to Windows 11 virtual
|
|
||||||
machines.
|
|
||||||
|
|
||||||
# All the options
|
|
||||||
|
|
||||||
Here are the usage instructions:
|
|
||||||
|
|
||||||
<!-- [[[cog
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
import cog
|
|
||||||
# cannot use check_result() because of non-zero return
|
|
||||||
result=subprocess.run(["./quickemu", "--help"], capture_output=True, text=True)
|
|
||||||
help=result.stdout
|
|
||||||
cog.out(f"\n```\n{help}\n```\n")
|
|
||||||
]]] -->
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Usage
|
|
||||||
quickemu --vm ubuntu.conf
|
|
||||||
|
|
||||||
You can also pass optional parameters
|
|
||||||
--access : Enable remote spice access support. 'local' (default), 'remote', 'clientipaddress'
|
|
||||||
--braille : Enable braille support. Requires SDL.
|
|
||||||
--delete-disk : Delete the disk image and EFI variables
|
|
||||||
--delete-vm : Delete the entire VM and it's configuration
|
|
||||||
--display : Select display backend. 'sdl' (default), 'gtk', 'none', 'spice' or 'spice-app'
|
|
||||||
--fullscreen : Starts VM in full screen mode (Ctl+Alt+f to exit)
|
|
||||||
--ignore-msrs-always : Configure KVM to always ignore unhandled machine-specific registers
|
|
||||||
--screen <screen> : Use specified screen to determine the window size.
|
|
||||||
--screenpct <percent> : Percent of fullscreen for VM if --fullscreen is not specified.
|
|
||||||
--shortcut : Create a desktop shortcut
|
|
||||||
--snapshot apply <tag> : Apply/restore a snapshot.
|
|
||||||
--snapshot create <tag> : Create a snapshot.
|
|
||||||
--snapshot delete <tag> : Delete a snapshot.
|
|
||||||
--snapshot info : Show disk/snapshot info.
|
|
||||||
--status-quo : Do not commit any changes to disk/snapshot.
|
|
||||||
--viewer <viewer> : Choose an alternative viewer. @Options: 'spicy' (default), 'remote-viewer', 'none'
|
|
||||||
--ssh-port <port> : Set ssh-port manually
|
|
||||||
--spice-port <port> : Set spice-port manually
|
|
||||||
--public-dir <path> : Expose share directory. @Options: '' (default: xdg-user-dir PUBLICSHARE), '<directory>', 'none'
|
|
||||||
--monitor <type> : Set monitor connection type. @Options: 'socket' (default), 'telnet', 'none'
|
|
||||||
--monitor-telnet-host <ip/host> : Set telnet host for monitor. (default: 'localhost')
|
|
||||||
--monitor-telnet-port <port> : Set telnet port for monitor. (default: '4440')
|
|
||||||
--monitor-cmd <cmd> : Send command to monitor if available. (Example: system_powerdown)
|
|
||||||
--serial <type> : Set serial connection type. @Options: 'socket' (default), 'telnet', 'none'
|
|
||||||
--serial-telnet-host <ip/host> : Set telnet host for serial. (default: 'localhost')
|
|
||||||
--serial-telnet-port <port> : Set telnet port for serial. (default: '6660')
|
|
||||||
--keyboard <type> : Set keyboard. @Options: 'usb' (default), 'ps2', 'virtio'
|
|
||||||
--keyboard_layout <layout> : Set keyboard layout.
|
|
||||||
--mouse <type> : Set mouse. @Options: 'tablet' (default), 'ps2', 'usb', 'virtio'
|
|
||||||
--usb-controller <type> : Set usb-controller. @Options: 'ehci' (default), 'xhci', 'none'
|
|
||||||
--sound-card <type> : Set sound card. @Options: 'intel-hda' (default), 'ac97', 'es1370', 'sb16', 'none'
|
|
||||||
--extra_args <arguments> : Pass additional arguments to qemu
|
|
||||||
--version : Print version
|
|
||||||
|
|
||||||
```
|
|
||||||
<!-- [[[end]]] -->
|
|
||||||
|
|
||||||
## Desktop shortcuts
|
|
||||||
|
|
||||||
Desktop shortcuts can be created for a VM, the shortcuts are saved in
|
|
||||||
`~/.local/share/applications`. Here is an example of how to create a
|
|
||||||
shortcut.
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
quickemu --vm ubuntu-22.04-desktop.conf --shortcut
|
|
||||||
```
|
|
||||||
|
|
||||||
## Screen and window size (Linux guests only)
|
|
||||||
|
|
||||||
`qemu` will always default to the primary monitor to display the VM's
|
|
||||||
window.
|
|
||||||
|
|
||||||
Without the `--screen` option, `quickemu` will look for the size of the
|
|
||||||
smallest monitor, and use a size that fits on said monitor.
|
|
||||||
|
|
||||||
The `--screen` option forces `quickemu` to use the size of the given
|
|
||||||
monitor to compute the size of the window. **It won't use that monitor
|
|
||||||
to display the VM's window if it's not the primary monitor**. This is
|
|
||||||
useful if the primary monitor if not the smallest one, and if the VM's
|
|
||||||
window doesn't need to be moved around.
|
|
||||||
|
|
||||||
The `--screen` option is also useful with the `--fullscreen` option,
|
|
||||||
again because `qemu` will always use the primary monitor. In order for
|
|
||||||
the fullscreen mode to work properly, the resolution of the VM's window
|
|
||||||
must match the resolution of the screen.
|
|
||||||
|
|
||||||
To know which screen to use, type:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
xrandr --listmonitors | grep -v Monitors
|
|
||||||
```
|
|
||||||
|
|
||||||
The command will output something like this:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
0: +*HDMI-0 2560/597x1440/336+1920+0 HDMI-0
|
|
||||||
1: +DVI-D-0 1920/527x1080/296+0+0 DVI-D-0
|
|
||||||
```
|
|
||||||
|
|
||||||
The first number is what needs to be passed to the `--screen` option.
|
|
||||||
|
|
||||||
For example:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
quickemu --vm vm.conf --screen 0
|
|
||||||
```
|
|
||||||
|
|
||||||
The above uses the 2560x1440 screen to compute the size of the window,
|
|
||||||
which Quickemu sizes to 2048x1152. Without the `--screen` option,
|
|
||||||
Quickemu would have used the 1920x1080 monitor which results in a window
|
|
||||||
size of 1664x936.
|
|
||||||
|
|
||||||
The '--screenpct' is an optional integer value between 25 \<= pct \< 100
|
|
||||||
which will override system default screen sizes. The VM size will be
|
|
||||||
'pct' of the chosen screen. **If --fullscreen is chosen screen will be
|
|
||||||
fullsize instead of being scaled down by --screenpct value.**
|
|
||||||
|
|
||||||
# References
|
|
||||||
|
|
||||||
Useful reference that assisted the development of Quickemu.
|
|
||||||
|
|
||||||
- General
|
|
||||||
- [QEMU's documentation!](https://qemu.readthedocs.io/en/latest/)
|
|
||||||
- <https://pve.proxmox.com/wiki/Qemu/KVM_Virtual_Machines>
|
|
||||||
- <https://www.kraxel.org/blog/2020/01/qemu-sound-audiodev/>
|
|
||||||
- macOS
|
|
||||||
- <https://www.nicksherlock.com/2020/06/installing-macos-big-sur-on-proxmox/>
|
|
||||||
- <https://passthroughpo.st/mac-os-adds-early-support-for-virtio-qemu/>
|
|
||||||
- <https://github.com/kholia/OSX-KVM>
|
|
||||||
- <https://github.com/thenickdude/KVM-Opencore>
|
|
||||||
- <https://github.com/acidanthera/OpenCorePkg/tree/master/Utilities/macrecovery>
|
|
||||||
- <https://www.kraxel.org/blog/2017/09/running-macos-as-guest-in-kvm/>
|
|
||||||
- <https://www.nicksherlock.com/2017/10/passthrough-of-advanced-cpu-features-for-macos-high-sierra-guests/>
|
|
||||||
- <http://philjordan.eu/osx-virt/>
|
|
||||||
- <https://github.com/Dids/clover-builder>
|
|
||||||
- [OpenCore
|
|
||||||
Configurator](https://mackie100projects.altervista.org)
|
|
||||||
- Windows
|
|
||||||
- <https://www.heiko-sieger.info/running-windows-10-on-linux-using-kvm-with-vga-passthrough/>
|
|
||||||
- <https://leduccc.medium.com/improving-the-performance-of-a-windows-10-guest-on-qemu-a5b3f54d9cf5>
|
|
||||||
- <https://frontpagelinux.com/tutorials/how-to-use-linux-kvm-to-optimize-your-windows-10-virtual-machine/>
|
|
||||||
- <https://turlucode.com/qemu-command-line-args/>
|
|
||||||
- <https://github.com/pbatard/Fido>
|
|
||||||
- <https://www.catapultsystems.com/blogs/create-zero-touch-windows-10-iso/>
|
|
||||||
- TPM
|
|
||||||
- <https://qemu-project.gitlab.io/qemu/specs/tpm.html>
|
|
||||||
- <https://www.tecklyfe.com/how-to-create-a-windows-11-virtual-machine-in-qemu/>
|
|
||||||
- 9p & virtiofs
|
|
||||||
- <https://wiki.qemu.org/Documentation/9p>
|
|
||||||
- <https://wiki.qemu.org/Documentation/9psetup>
|
|
||||||
- <https://www.kraxel.org/blog/2019/06/macos-qemu-guest/>
|
|
||||||
- <https://superuser.com/questions/628169/how-to-share-a-directory-with-the-host-without-networking-in-qemu>
|
|
||||||
- <https://virtio-fs.gitlab.io/>
|
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Supported Versions
|
||||||
|
|
||||||
|
Here are the versions of Quickemu currently being supported with security updates.
|
||||||
|
|
||||||
|
| Version | Supported |
|
||||||
|
| ------- | ------------------ |
|
||||||
|
| 4.9.x | :white_check_mark: |
|
||||||
|
| < 4.8 | :x: |
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
If you discover a vulnerability in Quickemu then [file an issue](https://github.com/quickemu-project/quickemu/issues/new) and click *Report a vulnerability*.
|
||||||
|
|
||||||
|
- Quickemu is a spare-time hobby project.
|
||||||
|
- We do not have SLAs for responding to security issues.
|
||||||
|
- It is a best-efforts basis.
|
|
@ -1 +1 @@
|
||||||
Subproject commit d6acc32a36447b5c0ef62c5adc125f21bfc269e7
|
Subproject commit 3125ddc21a91440cd6f1f70aa40081d760c10a4e
|
|
@ -0,0 +1,66 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
import struct
|
||||||
|
import hashlib
|
||||||
|
import argparse
|
||||||
|
v1_prod_pubkey = 0xC3E748CAD9CD384329E10E25A91E43E1A762FF529ADE578C935BDDF9B13F2179D4855E6FC89E9E29CA12517D17DFA1EDCE0BEBF0EA7B461FFE61D94E2BDF72C196F89ACD3536B644064014DAE25A15DB6BB0852ECBD120916318D1CCDEA3C84C92ED743FC176D0BACA920D3FCF3158AFF731F88CE0623182A8ED67E650515F75745909F07D415F55FC15A35654D118C55A462D37A3ACDA08612F3F3F6571761EFCCBCC299AEE99B3A4FD6212CCFFF5EF37A2C334E871191F7E1C31960E010A54E86FA3F62E6D6905E1CD57732410A3EB0C6B4DEFDABE9F59BF1618758C751CD56CEF851D1C0EAA1C558E37AC108DA9089863D20E2E7E4BF475EC66FE6B3EFDCF
|
||||||
|
# v2_prod_pubkey = 0xCB45C5E53217D4499FB80B2D96AA4F964EB551F1DA4EBFA4F5E23F87BFE82FC113590E536757F329D6EAD1F267771EE342F5A5E61514DD3D3383187E663929D577D94648F262EBA1157E152DB5273D10AE3A6A058CB9CD64D01267DAC82ED3B7BC1631D078C911414129CDAAA0FFB0A8E2A7ADD6F32FB09A7E98D259BFF6ED10808D1BDA58CAF7355DFF1A085A18B11657D2617447BF657140D599364E5AC8E626276AC03BC2417831D9E61B25154AFE9F2D8271E9CE22D2783803083A5A7A575774688721097DC5E4B32D118CF6317A7083BA15BA608430A8C8C6B7DA2D932D81F571603A9363AC0197AB670242D9C9180D97A10900F11FE3D9246CF14F0883
|
||||||
|
# v2_dev_pubkey = 0xB372CEC9E05E71FB3FAA08C34E3256FB312EA821638A243EF8A5DEA46FCDA33F00F88FC2933FB276D37B914F89BAD5B5D75771E342265B771995AE8F43B4DFF3F21A877FE777A8B419587C8718D36204FA1922A575AD5207D5D6B8C10F84DDCA661B731E7E7601D64D4A894F487FE1AA1DDC2A1697A3553B1DD85D5750DF2AA9D988E83C4C70BBBE4747219F9B92B199FECB16091896EBB441606DEC20F446249D5568BB51FC87BA7F85E6295FBE811B0A314408CD31921C360608A0FF7F87BD733560FE1C96E472834CAB6BE016C35727754273125089BE043FD3B26F0B2DE141E05990CE922F1702DA0A2F4E9F8760D0FA712DDB9928E0CDAC14501ED5E2C3
|
||||||
|
|
||||||
|
ChunkListHeader = struct.Struct('<4sIBBBxQQQ')
|
||||||
|
assert ChunkListHeader.size == 0x24
|
||||||
|
|
||||||
|
Chunk = struct.Struct('<I32s')
|
||||||
|
assert Chunk.size == 0x24
|
||||||
|
|
||||||
|
def parse_chunklist(path):
|
||||||
|
with open(path, 'rb') as f:
|
||||||
|
hash_ctx = hashlib.sha256()
|
||||||
|
data = f.read(ChunkListHeader.size)
|
||||||
|
hash_ctx.update(data)
|
||||||
|
magic, header_size, file_version, chunk_method, signature_method, chunk_count, chunk_offset, signature_offset = ChunkListHeader.unpack(data)
|
||||||
|
assert magic == b'CNKL'
|
||||||
|
assert header_size == ChunkListHeader.size
|
||||||
|
assert file_version == 1
|
||||||
|
assert chunk_method == 1
|
||||||
|
assert signature_method in [1, 2]
|
||||||
|
assert chunk_count > 0
|
||||||
|
assert chunk_offset == 0x24
|
||||||
|
assert signature_offset == chunk_offset + Chunk.size * chunk_count
|
||||||
|
for i in range(chunk_count):
|
||||||
|
data = f.read(Chunk.size)
|
||||||
|
hash_ctx.update(data)
|
||||||
|
chunk_size, chunk_sha256 = Chunk.unpack(data)
|
||||||
|
yield chunk_size, chunk_sha256
|
||||||
|
digest = hash_ctx.digest()
|
||||||
|
if signature_method == 1:
|
||||||
|
data = f.read(256)
|
||||||
|
assert len(data) == 256
|
||||||
|
signature = int.from_bytes(data, 'little')
|
||||||
|
plaintext = 0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003031300d0609608648016503040201050004200000000000000000000000000000000000000000000000000000000000000000 | int.from_bytes(digest, 'big')
|
||||||
|
assert pow(signature, 0x10001, v1_prod_pubkey) == plaintext
|
||||||
|
elif signature_method == 2:
|
||||||
|
data = f.read(32)
|
||||||
|
assert data == digest
|
||||||
|
else:
|
||||||
|
raise NotImplementedError
|
||||||
|
assert f.read(1) == b''
|
||||||
|
|
||||||
|
def check_chunklist(path, chunklist_path):
|
||||||
|
with open(path, 'rb') as f:
|
||||||
|
for chunk_size, chunk_sha256 in parse_chunklist(chunklist_path):
|
||||||
|
chunk = f.read(chunk_size)
|
||||||
|
assert len(chunk) == chunk_size
|
||||||
|
assert hashlib.sha256(chunk).digest() == chunk_sha256
|
||||||
|
assert f.read(1) == b''
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument('vmdir', type=Path)
|
||||||
|
args = parser.parse_args()
|
||||||
|
vmdir = args.vmdir
|
||||||
|
check_chunklist(vmdir / 'RecoveryImage.dmg', vmdir / 'RecoveryImage.chunklist')
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -1,204 +1,5 @@
|
||||||
quickemu (4.9.1-1) unstable; urgency=medium
|
quickemu (4.9.6-1) unstable; urgency=medium
|
||||||
|
|
||||||
* New upstream release.
|
* New upstream release.
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 10 Nov 2023 14:49:08 +0000
|
-- Martin Wimpress <code@wimpress.io> Fri, 10 Nov 2023 14:49:08 +0000
|
||||||
|
|
||||||
quickemu (4.8-1~mantic1.0) mantic; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
+ https://github.com/quickemu-project/quickemu/releases/tag/4.8
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Wed, 14 Jun 2023 12:40:56 +0100
|
|
||||||
|
|
||||||
quickemu (4.7-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
+ https://github.com/quickemu-project/quickemu/releases/tag/4.7
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Wed, 26 Apr 2023 12:00:35 +0100
|
|
||||||
|
|
||||||
quickemu (4.6-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
+ https://github.com/quickemu-project/quickemu/releases/tag/4.6
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Sat, 04 Feb 2023 00:32:47 +0000
|
|
||||||
|
|
||||||
quickemu (4.5-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
+ https://github.com/quickemu-project/quickemu/releases/tag/4.5
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Sun, 11 Dec 2022 20:54:52 +0000
|
|
||||||
|
|
||||||
quickemu (4.4-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
+ https://github.com/quickemu-project/quickemu/releases/tag/4.4
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 21 Oct 2022 08:52:12 +0100
|
|
||||||
|
|
||||||
quickemu (4.3-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
+ https://github.com/quickemu-project/quickemu/releases/tag/4.3
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Thu, 22 Sep 2022 09:22:00 +0100
|
|
||||||
|
|
||||||
quickemu (4.2-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
+ https://github.com/quickemu-project/quickemu/releases/tag/4.2
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Wed, 21 Sep 2022 23:34:24 +0100
|
|
||||||
|
|
||||||
quickemu (4.1-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Sat, 20 Aug 2022 00:03:33 +0100
|
|
||||||
|
|
||||||
quickemu (4.0-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Mon, 01 Aug 2022 11:24:48 +0100
|
|
||||||
|
|
||||||
quickemu (3.16-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 29 Jul 2022 11:50:32 +0100
|
|
||||||
|
|
||||||
quickemu (3.15-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 22 Apr 2022 09:55:13 +0100
|
|
||||||
|
|
||||||
quickemu (3.14-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New Upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 11 Mar 2022 16:20:05 +0000
|
|
||||||
|
|
||||||
quickemu (3.13-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Thu, 24 Feb 2022 23:00:05 +0000
|
|
||||||
|
|
||||||
quickemu (3.12-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Tue, 22 Feb 2022 12:13:16 +0000
|
|
||||||
|
|
||||||
quickemu (3.11-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <martin.wimpress@ubuntu.com> Wed, 08 Dec 2021 11:01:04 +0000
|
|
||||||
|
|
||||||
quickemu (2.3.4-1~jammy1.0) jammy; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Mon, 06 Dec 2021 11:53:50 +0000
|
|
||||||
|
|
||||||
quickemu (2.3.3-1~jammy1.0) jammy; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 03 Dec 2021 11:38:10 +0000
|
|
||||||
|
|
||||||
quickemu (2.3.2-1~jammy1.0) jammy; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Sun, 14 Nov 2021 10:25:06 +0000
|
|
||||||
|
|
||||||
quickemu (2.3.1-1~jammy1.0) jammy; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Mon, 08 Nov 2021 00:54:38 +0000
|
|
||||||
|
|
||||||
quickemu (2.3.0-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 29 Oct 2021 10:03:58 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.9-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Thu, 28 Oct 2021 22:46:37 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.8-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Thu, 28 Oct 2021 16:13:20 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.7-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Wed, 27 Oct 2021 12:57:59 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.6-1~jammy1.0) jammy; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Thu, 21 Oct 2021 10:57:35 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.5-1~jammy1.0) jammy; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Sat, 16 Oct 2021 11:35:41 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.4-1~impish1.0) impish; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 15 Oct 2021 12:50:05 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.3-1~impish1.0) impish; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 08 Oct 2021 15:06:50 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.2-1~impish1.0) impish; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 08 Oct 2021 02:39:00 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.1-1~impish1.0) impish; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Thu, 07 Oct 2021 16:23:33 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.0-1~impish1.0) impish; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Wed, 06 Oct 2021 11:08:33 +0100
|
|
||||||
|
|
||||||
quickemu (2.1.0-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Tue, 05 Oct 2021 17:12:48 +0100
|
|
||||||
|
|
||||||
quickemu (1.0.0-1~focal1.2) focal; urgency=medium
|
|
||||||
|
|
||||||
* Initial release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Mon, 06 Sep 2021 23:11:44 +0100
|
|
||||||
|
|
|
@ -5,26 +5,30 @@ Maintainer: Martin Wimpress <code@wimpress.io>
|
||||||
Build-Depends:
|
Build-Depends:
|
||||||
debhelper-compat (= 12),
|
debhelper-compat (= 12),
|
||||||
Standards-Version: 4.5.1
|
Standards-Version: 4.5.1
|
||||||
Homepage: https://github.com/wimpysworld/quickemu
|
Homepage: https://github.com/quickemu-project/quickemu
|
||||||
Vcs-Browser: https://github.com/wimpysworld/quickemu
|
Vcs-Browser: https://github.com/quickemu-project/quickemu
|
||||||
Vcs-Git: https://github.com/wimpysworld/quickemu.git
|
Vcs-Git: https://github.com/quickemu-project/quickemu.git
|
||||||
Rules-Requires-Root: no
|
Rules-Requires-Root: no
|
||||||
|
|
||||||
Package: quickemu
|
Package: quickemu
|
||||||
Architecture: all
|
Architecture: all
|
||||||
Depends:
|
Depends:
|
||||||
coreutils,
|
coreutils,
|
||||||
|
curl,
|
||||||
genisoimage,
|
genisoimage,
|
||||||
jq,
|
jq,
|
||||||
|
mesa-utils,
|
||||||
|
pciutils,
|
||||||
procps,
|
procps,
|
||||||
python3-minimal,
|
python3-minimal,
|
||||||
qemu-system (>= 6.0),
|
qemu-system (>= 6.0),
|
||||||
|
base-files (<< 13~) | qemu-system-modules-spice,
|
||||||
socat,
|
socat,
|
||||||
spice-client-gtk,
|
spice-client-gtk,
|
||||||
swtpm,
|
swtpm,
|
||||||
usbutils,
|
usbutils,
|
||||||
util-linux,
|
util-linux,
|
||||||
wget,
|
uuid-runtime,
|
||||||
x11-xserver-utils,
|
x11-xserver-utils,
|
||||||
xdg-user-dirs,
|
xdg-user-dirs,
|
||||||
zsync,
|
zsync,
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||||
Upstream-Name: quickemu
|
Upstream-Name: quickemu
|
||||||
Upstream-Contact: Martin Wimpress <code@wimpress.io>
|
Upstream-Contact: Martin Wimpress <code@wimpress.io>
|
||||||
Source: https://github.com/wimpysworld/quickemu
|
Source: https://github.com/quickemu-project/quickemu
|
||||||
|
|
||||||
Files: *
|
Files: *
|
||||||
Copyright: 2020-2021 Martin Wimpress <code@wimpress.io>
|
Copyright: 2020-2024 Martin Wimpress <code@wimpress.io>
|
||||||
License: MIT
|
License: MIT
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -26,7 +26,7 @@ License: MIT
|
||||||
# If you want to use GPL v2 or later for the /debian/* files use
|
# If you want to use GPL v2 or later for the /debian/* files use
|
||||||
# the following clauses, or change it to suit. Delete these two lines
|
# the following clauses, or change it to suit. Delete these two lines
|
||||||
Files: debian/*
|
Files: debian/*
|
||||||
Copyright: 2021 Martin Wimpress <code@wimpress.io>
|
Copyright: 2021 - 2024 Martin Wimpress <code@wimpress.io>
|
||||||
License: GPL-2+
|
License: GPL-2+
|
||||||
This package is free software; you can redistribute it and/or modify
|
This package is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
macrecovery usr/bin
|
chunkcheck usr/bin
|
||||||
quickemu usr/bin
|
quickemu usr/bin
|
||||||
quickget usr/bin
|
quickget usr/bin
|
||||||
windowskey usr/bin
|
quickreport usr/bin
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
version=4
|
|
||||||
|
|
||||||
opts="filenamemangle=s%(?:.*?)?v?(\d[\d.]*)\.tar\.gz%quickemu-$1.tar.gz%" \
|
|
||||||
https://github.com/wimpysworld/quickemu/tags \
|
|
||||||
(?:.*?/)?v?(\d[\d.]*)\.tar\.gz
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
{ lib,
|
||||||
|
mkShell,
|
||||||
|
pkgs,
|
||||||
|
stdenv,
|
||||||
|
}:
|
||||||
|
mkShell {
|
||||||
|
packages = with pkgs; ([
|
||||||
|
cdrtools
|
||||||
|
curl
|
||||||
|
gawk
|
||||||
|
gnugrep
|
||||||
|
gnused
|
||||||
|
jq
|
||||||
|
pciutils
|
||||||
|
procps
|
||||||
|
python3
|
||||||
|
qemu_full
|
||||||
|
samba
|
||||||
|
socat
|
||||||
|
spice-gtk
|
||||||
|
swtpm
|
||||||
|
unzip
|
||||||
|
util-linux
|
||||||
|
xorg.xrandr
|
||||||
|
zsync
|
||||||
|
OVMF
|
||||||
|
OVMFFull
|
||||||
|
] ++ lib.optionals stdenv.isLinux [
|
||||||
|
glxinfo
|
||||||
|
usbutils
|
||||||
|
xdg-user-dirs
|
||||||
|
]);
|
||||||
|
|
||||||
|
inputsFrom = with pkgs; [
|
||||||
|
git
|
||||||
|
];
|
||||||
|
|
||||||
|
shellHook = ''
|
||||||
|
echo "**********************************************************************"
|
||||||
|
echo "* 'direnv reload' to update '.direnv/bin/quickemu' for testing *"
|
||||||
|
echo "**********************************************************************"
|
||||||
|
sed \
|
||||||
|
-e '/OVMF_CODE_4M.secboot.fd/s|ovmfs=(|ovmfs=("${pkgs.OVMFFull.firmware}","${pkgs.OVMFFull.variables}" |' \
|
||||||
|
-e '/OVMF_CODE_4M.fd/s|ovmfs=(|ovmfs=("${pkgs.OVMF.firmware}","${pkgs.OVMF.variables}" |' \
|
||||||
|
-e '/cp "''${VARS_IN}" "''${VARS_OUT}"/a chmod +w "''${VARS_OUT}"' \
|
||||||
|
-e 's,\$(command -v smbd),${pkgs.samba}/bin/smbd,' \
|
||||||
|
quickemu > $PWD/.direnv/bin/quickemu
|
||||||
|
chmod +x $PWD/.direnv/bin/quickemu
|
||||||
|
'';
|
||||||
|
}
|
|
@ -9,16 +9,18 @@ datadir := $(datarootdir)
|
||||||
mandir := $(datarootdir)/man
|
mandir := $(datarootdir)/man
|
||||||
bindir := $(PREFIX)/bin
|
bindir := $(PREFIX)/bin
|
||||||
|
|
||||||
all: quickget.1 quickemu.1 quickemu_conf.1
|
all: quickget.1 quickemu.1 quickemu_conf.5
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm *.1
|
rm *.1 *.5
|
||||||
|
|
||||||
install_docs: all
|
install_docs: all
|
||||||
install -d $(DESTDIR)$(mandir)/man1
|
install -d $(DESTDIR)$(mandir)/man1
|
||||||
|
install -d $(DESTDIR)$(mandir)/man5
|
||||||
install -m 644 quickget.1 $(DESTDIR)$(mandir)/man1
|
install -m 644 quickget.1 $(DESTDIR)$(mandir)/man1
|
||||||
install -m 644 quickemu.1 $(DESTDIR)$(mandir)/man1
|
install -m 644 quickemu.1 $(DESTDIR)$(mandir)/man1
|
||||||
install -m 644 quickemu_conf.1 $(DESTDIR)$(mandir)/man1
|
install -m 644 quickemu_conf.5 $(DESTDIR)$(mandir)/man5
|
||||||
|
rm -f $(DESTDIR)$(mandir)/man1/quickemu_conf.1
|
||||||
|
|
||||||
# install -m 644 quickgui.1 $(DESTDIR)$(mandir)/man1
|
# install -m 644 quickgui.1 $(DESTDIR)$(mandir)/man1
|
||||||
|
|
||||||
|
@ -26,17 +28,20 @@ install_bins:
|
||||||
install -d $(DESTDIR)$(bindir)
|
install -d $(DESTDIR)$(bindir)
|
||||||
install -m 755 ../quickget $(DESTDIR)$(bindir)
|
install -m 755 ../quickget $(DESTDIR)$(bindir)
|
||||||
install -m 755 ../quickemu $(DESTDIR)$(bindir)
|
install -m 755 ../quickemu $(DESTDIR)$(bindir)
|
||||||
install -m 755 ../macrecovery $(DESTDIR)$(bindir)
|
install -m 755 ../quickreport $(DESTDIR)$(bindir)
|
||||||
|
install -m 755 ../chunkcheck $(DESTDIR)$(bindir)
|
||||||
|
|
||||||
install: install_bins install_docs
|
install: install_bins install_docs
|
||||||
|
|
||||||
uninstall::
|
uninstall::
|
||||||
rm -f $(DESTDIR)$(mandir)/man1/quickget.1
|
rm -f $(DESTDIR)$(mandir)/man1/quickget.1
|
||||||
rm -f $(DESTDIR)$(mandir)/man1/quickemu.1
|
rm -f $(DESTDIR)$(mandir)/man1/quickemu.1
|
||||||
rm -f $(DESTDIR)$(mandir)/man1/quickemu_conf.1
|
rm -f $(DESTDIR)$(mandir)/man5/quickemu_conf.5
|
||||||
rm -f $(DESTDIR)$(bindir)/quickget
|
rm -f $(DESTDIR)$(bindir)/quickget
|
||||||
rm -f $(DESTDIR)$(bindir)/quickemu
|
rm -f $(DESTDIR)$(bindir)/quickemu
|
||||||
|
rm -f $(DESTDIR)$(bindir)/quickreport
|
||||||
rm -f $(DESTDIR)$(bindir)/macrecovery
|
rm -f $(DESTDIR)$(bindir)/macrecovery
|
||||||
|
rm -f $(DESTDIR)$(bindir)/chunkcheck
|
||||||
|
|
||||||
|
|
||||||
.PHONY: all
|
.PHONY: all
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
PANDOC ?= pandoc
|
PANDOC ?= pandoc
|
||||||
|
PANDOC_OPTIONS = -f gfm+definition_lists
|
||||||
|
|
||||||
MANSECTION ?= 1
|
.SUFFIXES: .1.md .1 .5.md .5
|
||||||
|
|
||||||
MANPAGE.md = $(PANDOC) --standalone $(PANDOCFLAGS) --to man
|
.1.md.1 .5.md.5:
|
||||||
|
$(PANDOC) --standalone $(PANDOC_OPTIONS) --to man -o $@ $<
|
||||||
%.$(MANSECTION): %.$(MANSECTION).md
|
|
||||||
$(MANPAGE.md) $< -o $@
|
|
||||||
|
|
902
docs/quickemu.1
902
docs/quickemu.1
File diff suppressed because it is too large
Load Diff
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
author: Martin Wimpress
|
author: Martin Wimpress
|
||||||
date: November 26, 2023
|
date: December 30, 2024
|
||||||
footer: quickemu
|
footer: quickemu
|
||||||
header: Quickemu User Manual
|
header: Quickemu User Manual
|
||||||
section: 1
|
section: 1
|
||||||
|
@ -27,28 +27,34 @@ machines for Linux, macOS and Windows
|
||||||
|
|
||||||
You can also pass optional parameters
|
You can also pass optional parameters
|
||||||
|
|
||||||
|
**--access**
|
||||||
|
: Enable remote spice access support. 'local' (default), 'remote',
|
||||||
|
'clientipaddress'
|
||||||
|
|
||||||
**--braille**
|
**--braille**
|
||||||
: Enable braille support. Requires SDL.
|
: Enable braille support. Requires SDL.
|
||||||
|
|
||||||
**--delete-disk**
|
**--delete-disk**
|
||||||
: Delete the disk image.
|
: Delete the disk image and EFI variables
|
||||||
|
|
||||||
|
**--delete-vm**
|
||||||
|
: Delete the entire VM and its configuration
|
||||||
|
|
||||||
**--display**
|
**--display**
|
||||||
: Select display backend. 'sdl' (default), 'gtk', 'none', 'spice' or
|
: Select display backend. 'sdl' (default), 'gtk', 'none', 'spice' or
|
||||||
'spice-app'
|
'spice-app'
|
||||||
|
|
||||||
**--sound-card**
|
|
||||||
: Select virtual audio emulation. 'intel-hda' (default), 'ac97'
|
|
||||||
(solaris default), 'es1370', 'sb16' (freedos default) or 'none'
|
|
||||||
|
|
||||||
**--fullscreen**
|
**--fullscreen**
|
||||||
: Starts VM in full screen mode (Ctl+Alt+f to exit)
|
: Starts VM in full screen mode (Ctl+Alt+f to exit)
|
||||||
|
|
||||||
**--ignore-msrs-always**
|
**--ignore-msrs-always**
|
||||||
: Configure KVM to always ignore unhandled machine-specific registers
|
: Configure KVM to always ignore unhandled machine-specific registers
|
||||||
|
|
||||||
**--screen \<screen\>**
|
**--kill**
|
||||||
: Use specified screen to determine the window size.
|
: Kill the VM process if it is running
|
||||||
|
|
||||||
|
**--offline**
|
||||||
|
: Override all network settings and start the VM offline
|
||||||
|
|
||||||
**--shortcut**
|
**--shortcut**
|
||||||
: Create a desktop shortcut
|
: Create a desktop shortcut
|
||||||
|
@ -68,6 +74,68 @@ You can also pass optional parameters
|
||||||
**--status-quo**
|
**--status-quo**
|
||||||
: Do not commit any changes to disk/snapshot.
|
: Do not commit any changes to disk/snapshot.
|
||||||
|
|
||||||
|
**--viewer \<viewer\>**
|
||||||
|
: Choose an alternative viewer. @Options: 'spicy' (default),
|
||||||
|
'remote-viewer', 'none'
|
||||||
|
|
||||||
|
**--width \<width\>**
|
||||||
|
: Set VM screen width; requires '--height'
|
||||||
|
|
||||||
|
**--height \<height\>**
|
||||||
|
: Set VM screen height; requires '--width'
|
||||||
|
|
||||||
|
**--ssh-port \<port\>**
|
||||||
|
: Set SSH port manually
|
||||||
|
|
||||||
|
**--spice-port \<port\>**
|
||||||
|
: Set SPICE port manually
|
||||||
|
|
||||||
|
**--public-dir \<path\>**
|
||||||
|
: Expose share directory. @Options: '' (default: xdg-user-dir
|
||||||
|
PUBLICSHARE), '<directory>', 'none'
|
||||||
|
|
||||||
|
**--monitor \<type\>**
|
||||||
|
: Set monitor connection type. @Options: 'socket' (default), 'telnet',
|
||||||
|
'none'
|
||||||
|
|
||||||
|
**--monitor-telnet-host \<ip/host\>**
|
||||||
|
: Set telnet host for monitor. (default: 'localhost')
|
||||||
|
|
||||||
|
**--monitor-telnet-port \<port\>**
|
||||||
|
: Set telnet port for monitor. (default: '4440')
|
||||||
|
|
||||||
|
**--monitor-cmd \<cmd\>**
|
||||||
|
: Send command to monitor if available. (Example: system_powerdown)
|
||||||
|
|
||||||
|
**--serial \<type\>**
|
||||||
|
: Set serial connection type. @Options: 'socket' (default), 'telnet',
|
||||||
|
'none'
|
||||||
|
|
||||||
|
**--serial-telnet-host \<ip/host\>**
|
||||||
|
: Set telnet host for serial. (default: 'localhost')
|
||||||
|
|
||||||
|
**--serial-telnet-port \<port\>**
|
||||||
|
: Set telnet port for serial. (default: '6660')
|
||||||
|
|
||||||
|
**--keyboard \<type\>**
|
||||||
|
: Set keyboard. @Options: 'usb' (default), 'ps2', 'virtio'
|
||||||
|
|
||||||
|
**--keyboard_layout \<layout\>**
|
||||||
|
: Set keyboard layout: 'en-us' (default)
|
||||||
|
|
||||||
|
**--mouse \<type\>**
|
||||||
|
: Set mouse. @Options: 'tablet' (default), 'ps2', 'usb', 'virtio'
|
||||||
|
|
||||||
|
**--usb-controller \<type\>**
|
||||||
|
: Set usb-controller. @Options: 'ehci' (default), 'xhci', 'none'
|
||||||
|
|
||||||
|
**--sound-card \<type\>**
|
||||||
|
: Set sound card. @Options: 'intel-hda' (default), 'ac97', 'es1370',
|
||||||
|
'sb16', 'none'
|
||||||
|
|
||||||
|
**--extra_args \<arguments\>**
|
||||||
|
: Pass additional arguments to qemu
|
||||||
|
|
||||||
**--version**
|
**--version**
|
||||||
: Print version
|
: Print version
|
||||||
|
|
||||||
|
@ -76,40 +144,48 @@ You can also pass optional parameters
|
||||||
**quickemu --vm ubuntu-mate-22.04.conf**
|
**quickemu --vm ubuntu-mate-22.04.conf**
|
||||||
: Launches the VM specified in the file *ubuntu-mate-22.04.conf*
|
: Launches the VM specified in the file *ubuntu-mate-22.04.conf*
|
||||||
|
|
||||||
## Introduction
|
# Introduction
|
||||||
|
|
||||||
Quickly create and run highly optimised desktop virtual machines for
|
**Quickemu** is a wrapper for the excellent
|
||||||
Linux, macOS and Windows; with just two commands. You decide what
|
[QEMU](https://www.qemu.org/) that automatically *"does the right
|
||||||
operating system you want to run and Quickemu will figure out the best
|
thing"* when creating virtual machines. No requirement for exhaustive
|
||||||
way to do it for you. For example:
|
configuration options. You decide what operating system you want to run
|
||||||
|
and Quickemu takes care of the rest 🤖
|
||||||
|
|
||||||
``` bash
|
- `quickget` **automatically downloads the upstream OS** and creates the
|
||||||
quickget ubuntu-mate 22.04
|
configuration 📀
|
||||||
quickemu --vm ubuntu-mate-22.04.conf
|
- `quickemu` enumerates your hardware and launches the virtual machine
|
||||||
```
|
with the **optimum configuration best suited to your computer** ⚡️
|
||||||
|
|
||||||
The original objective of the project was to enable quick testing of
|
The original objective of the project was to [enable quick testing of
|
||||||
Linux distributions where the virtual machine configurations can be
|
Linux
|
||||||
stored anywhere, such as external USB storage or your home directory,
|
distributions](https://github.com/quickemu-project/quickemu/wiki/02-Create-Linux-virtual-machines)
|
||||||
and no elevated permissions are required to run the virtual machines.
|
where the virtual machines and their configuration can be stored
|
||||||
**Quickemu now also includes comprehensive support for macOS and
|
anywhere (such as external USB storage or your home directory) and no
|
||||||
Windows**.
|
elevated permissions are required to run the virtual machines.
|
||||||
|
|
||||||
## Features
|
**Today, Quickemu includes comprehensive support for
|
||||||
|
[macOS](https://github.com/quickemu-project/quickemu/wiki/03-Create-macOS-virtual-machines),
|
||||||
|
[Windows](https://github.com/quickemu-project/quickemu/wiki/04-Create-Windows-virtual-machines)**,
|
||||||
|
most of the BSDs, novel non-Linux operating systems such as FreeDOS,
|
||||||
|
Haiku, KolibriOS, OpenIndiana, ReactOS, and more.
|
||||||
|
|
||||||
- **macOS** Monterey, Big Sur, Catalina, Mojave & High Sierra
|
# Features
|
||||||
|
|
||||||
|
- Host support for **Linux and macOS**
|
||||||
|
- **macOS** Sonoma, Ventura, Monterey, Big Sur, Catalina & Mojave
|
||||||
- **Windows** 10 and 11 including TPM 2.0
|
- **Windows** 10 and 11 including TPM 2.0
|
||||||
|
- **Windows Server** 2022 2019 2016
|
||||||
- [Ubuntu](https://ubuntu.com/desktop) and all the **[official Ubuntu
|
- [Ubuntu](https://ubuntu.com/desktop) and all the **[official Ubuntu
|
||||||
flavours](https://ubuntu.com/download/flavours)**
|
flavours](https://ubuntu.com/download/flavours)**
|
||||||
- **Over 360 operating system editions are supported!**
|
- **Nearly 1000 operating system editions are supported!**
|
||||||
- Full SPICE support including host/guest clipboard sharing
|
- Full SPICE support including host/guest clipboard sharing
|
||||||
- VirtIO-webdavd file sharing for Linux and Windows guests
|
- VirtIO-webdavd file sharing for Linux and Windows guests
|
||||||
- VirtIO-9p file sharing for Linux and macOS guests
|
- VirtIO-9p file sharing for Linux and macOS guests
|
||||||
- [QEMU Guest Agent
|
- [QEMU Guest Agent support](https://wiki.qemu.org/Features/GuestAgent);
|
||||||
support](https://wiki.qemu.org/Features/GuestAgent); provides access
|
provides access to a system-level agent via standard QMP commands
|
||||||
to a system-level agent via standard QMP commands
|
- Samba file sharing for Linux, macOS and Windows guests (*if `smbd` is
|
||||||
- Samba file sharing for Linux, macOS and Windows guests (*if `smbd`
|
installed on the host*)
|
||||||
is installed on the host*)
|
|
||||||
- VirGL acceleration
|
- VirGL acceleration
|
||||||
- USB device pass-through
|
- USB device pass-through
|
||||||
- Smartcard pass-through
|
- Smartcard pass-through
|
||||||
|
@ -118,50 +194,53 @@ Windows**.
|
||||||
- Full duplex audio
|
- Full duplex audio
|
||||||
- Braille support
|
- Braille support
|
||||||
- EFI (with or without SecureBoot) and Legacy BIOS boot
|
- EFI (with or without SecureBoot) and Legacy BIOS boot
|
||||||
- Graphical user interfaces available
|
|
||||||
|
|
||||||
Quickemu is a wrapper for the excellent [QEMU](https://www.qemu.org/)
|
## As featured on [Linux Matters](https://linuxmatters.sh) podcast!
|
||||||
that attempts to automatically *"do the right thing"*, rather than
|
|
||||||
expose exhaustive configuration options.
|
|
||||||
|
|
||||||
We have a Discord for this project:
|
The presenters of Linux Matters 🐧🎙️ are the creators of each of the
|
||||||
[](https://discord.gg/sNmz3uw)
|
principle Quickemu projects. We discussed Quickemu's 2024 reboot in
|
||||||
|
[Episode 30 - Quickemu Rising From the
|
||||||
|
Bashes](https://linuxmatters.sh/30).
|
||||||
|
<!-- and in [Episode 32 - Quick, quicker, quickest](https://linuxmatters.sh/32) [Martin](https://github.com/flexiondotorg) unveils macOS host support for [**Quickemu**](https://github.com/quickemu-project/quickemu), [Mark](https://github.com/marxjohnson) explains the origins of the [**Quickgui**](https://github.com/quickemu-project/quickgui) desktop app and upcoming improvements, and [Alan](https://github.com/popey) debuts [**Quicktest**](https://github.com/quickemu-project/quicktest); a framework for automatically testing operating systems via Quickemu -->
|
||||||
|
|
||||||
See this (old) video where I explain some of my motivations for creating
|
<div align="center">
|
||||||
Quickemu.
|
|
||||||
|
|
||||||
[](https://www.youtube.com/watch?v=AOTYWEgw0hI)
|
<br /> <em>Linux Matters Podcast</em>
|
||||||
|
|
||||||
## Requirements
|
</div>
|
||||||
|
|
||||||
|
When installing from source, you will need to install the following
|
||||||
|
requirements manually:
|
||||||
|
|
||||||
- [QEMU](https://www.qemu.org/) (*6.0.0 or newer*) **with GTK, SDL,
|
- [QEMU](https://www.qemu.org/) (*6.0.0 or newer*) **with GTK, SDL,
|
||||||
SPICE & VirtFS support**
|
SPICE & VirtFS support**
|
||||||
- [bash](https://www.gnu.org/software/bash/) (*4.0 or newer*)
|
- [bash](https://www.gnu.org/software/bash/) (*4.0 or newer*)
|
||||||
- [Coreutils](https://www.gnu.org/software/coreutils/)
|
- [Coreutils](https://www.gnu.org/software/coreutils/)
|
||||||
|
- [curl](https://curl.se/)
|
||||||
- [EDK II](https://github.com/tianocore/edk2)
|
- [EDK II](https://github.com/tianocore/edk2)
|
||||||
|
- [gawk](https://www.gnu.org/software/gawk/)
|
||||||
- [grep](https://www.gnu.org/software/grep/)
|
- [grep](https://www.gnu.org/software/grep/)
|
||||||
|
- [glxinfo](https://gitlab.freedesktop.org/mesa/demos)
|
||||||
- [jq](https://stedolan.github.io/jq/)
|
- [jq](https://stedolan.github.io/jq/)
|
||||||
- [LSB](https://wiki.linuxfoundation.org/lsb/start)
|
- [LSB](https://wiki.linuxfoundation.org/lsb/start)
|
||||||
|
- [pciutils](https://github.com/pciutils/pciutils)
|
||||||
- [procps](https://gitlab.com/procps-ng/procps)
|
- [procps](https://gitlab.com/procps-ng/procps)
|
||||||
- [python3](https://www.python.org/)
|
- [python3](https://www.python.org/)
|
||||||
- [macrecovery](https://github.com/acidanthera/OpenCorePkg/tree/master/Utilities/macrecovery)
|
|
||||||
- [mkisofs](http://cdrtools.sourceforge.net/private/cdrecord.html)
|
- [mkisofs](http://cdrtools.sourceforge.net/private/cdrecord.html)
|
||||||
- [usbutils](https://github.com/gregkh/usbutils)
|
- [usbutils](https://github.com/gregkh/usbutils)
|
||||||
- [util-linux](https://github.com/karelzak/util-linux)
|
- [util-linux](https://github.com/karelzak/util-linux); including
|
||||||
|
`uuidgen`
|
||||||
- [sed](https://www.gnu.org/software/sed/)
|
- [sed](https://www.gnu.org/software/sed/)
|
||||||
- [socat](http://www.dest-unreach.org/socat/)
|
- [socat](http://www.dest-unreach.org/socat/)
|
||||||
- [spicy](https://gitlab.freedesktop.org/spice/spice-gtk)
|
- [spicy](https://gitlab.freedesktop.org/spice/spice-gtk)
|
||||||
- [swtpm](https://github.com/stefanberger/swtpm)
|
- [swtpm](https://github.com/stefanberger/swtpm)
|
||||||
- [Wget](https://www.gnu.org/software/wget/)
|
|
||||||
- [xdg-user-dirs](https://www.freedesktop.org/wiki/Software/xdg-user-dirs/)
|
- [xdg-user-dirs](https://www.freedesktop.org/wiki/Software/xdg-user-dirs/)
|
||||||
- [xrandr](https://gitlab.freedesktop.org/xorg/app/xrandr)
|
- [xrandr](https://gitlab.freedesktop.org/xorg/app/xrandr)
|
||||||
- [zsync](http://zsync.moria.org.uk/)
|
- [zsync](http://zsync.moria.org.uk/)
|
||||||
- [unzip](http://www.info-zip.org/UnZip.html)
|
- [unzip](http://www.info-zip.org/UnZip.html)
|
||||||
|
|
||||||
### Installing Requirements
|
For Ubuntu, Arch and NixOS hosts, the
|
||||||
|
|
||||||
For Ubuntu, Arch and nixos systems the
|
|
||||||
[ppa](https://launchpad.net/~flexiondotorg/+archive/ubuntu/quickemu),
|
[ppa](https://launchpad.net/~flexiondotorg/+archive/ubuntu/quickemu),
|
||||||
[AUR](https://aur.archlinux.org/packages/quickemu) or
|
[AUR](https://aur.archlinux.org/packages/quickemu) or
|
||||||
[nix](https://github.com/NixOS/nixpkgs/tree/master/pkgs/development/quickemu)
|
[nix](https://github.com/NixOS/nixpkgs/tree/master/pkgs/development/quickemu)
|
||||||
|
@ -169,65 +248,99 @@ packaging will take care of the dependencies. For other host
|
||||||
distributions or operating systems it will be necessary to install the
|
distributions or operating systems it will be necessary to install the
|
||||||
above requirements or their equivalents.
|
above requirements or their equivalents.
|
||||||
|
|
||||||
These examples may save a little typing
|
These examples may save a little typing:
|
||||||
|
|
||||||
Debian (and direct derivatives such as MX Linux):
|
#### Install requirements on Debian hosts
|
||||||
|
|
||||||
sudo apt install qemu bash coreutils ovmf grep jq lsb-base procps python3 genisoimage usbutils util-linux sed spice-client-gtk libtss2-tcti-swtpm0 wget xdg-user-dirs zsync unzip
|
This also applies to derivatives:
|
||||||
|
|
||||||
Fedora:
|
``` shell
|
||||||
|
sudo apt-get install bash coreutils curl genisoimage grep jq mesa-utils ovmf pciutils procps python3 qemu sed socat spice-client-gtk swtpm-tools unzip usbutils util-linux xdg-user-dirs xrandr zsync
|
||||||
|
```
|
||||||
|
|
||||||
sudo dnf install qemu bash coreutils edk2-tools grep jq lsb procps python3 genisoimage usbutils util-linux sed spice-gtk-tools swtpm wget xdg-user-dirs xrandr unzip
|
#### Install requirements on Fedora hosts
|
||||||
|
|
||||||
MacOS:
|
``` shell
|
||||||
|
sudo dnf install bash coreutils curl edk2-tools genisoimage grep jq mesa-demos pciutils procps python3 qemu sed socat spice-gtk-tools swtpm unzip usbutils util-linux uuidgen-runtime xdg-user-dirs xrandr zsync
|
||||||
|
```
|
||||||
|
|
||||||
This is a work in progress (see [issue
|
### Install requirements on Gentoo
|
||||||
248](https://github.com/quickemu-project/quickemu/issues/248) for other
|
|
||||||
steps and changes that may enable running on MacOS)
|
|
||||||
|
|
||||||
brew install qemu bash coreutils grep jq python@3.10 cdrtools gnu-sed spice-gtk wget zsync
|
Please note that you may have to use `sys-firmware/edk2-ovmf` instead of
|
||||||
|
`sys-firmware/edk2-ovmf-bin` - depending on how your system is
|
||||||
|
configured.
|
||||||
|
|
||||||
# Usage
|
``` shell
|
||||||
|
sudo emerge --ask --noreplace app-emulation/qemu \
|
||||||
|
app-shells/bash \
|
||||||
|
sys-apps/coreutils \
|
||||||
|
net-misc/curl \
|
||||||
|
sys-firmware/edk2-ovmf-bin \
|
||||||
|
sys-apps/gawk \
|
||||||
|
sys-apps/grep \
|
||||||
|
x11-apps/mesa-progs \
|
||||||
|
app-misc/jq \
|
||||||
|
sys-apps/pciutils \
|
||||||
|
sys-process/procps \
|
||||||
|
app-cdr/cdrtools \
|
||||||
|
sys-apps/usbutils \
|
||||||
|
sys-apps/util-linux \
|
||||||
|
sys-apps/sed \
|
||||||
|
net-misc/socat \
|
||||||
|
app-emulation/spice \
|
||||||
|
app-crypt/swtpm \
|
||||||
|
x11-misc/xdg-user-dirs \
|
||||||
|
x11-apps/xrandr \
|
||||||
|
net-misc/zsync \
|
||||||
|
app-arch/unzip
|
||||||
|
```
|
||||||
|
|
||||||
## Graphical User Interfaces
|
#### Install requirements on macOS hosts
|
||||||
|
|
||||||
|
Install the Quickemu requirements using brew:
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
brew install bash cdrtools coreutils jq python3 qemu usbutils samba socat swtpm zsync
|
||||||
|
```
|
||||||
|
|
||||||
|
Now clone the project:
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
git clone https://github.com/quickemu-project/quickemu
|
||||||
|
cd quickemu
|
||||||
|
```
|
||||||
|
|
||||||
|
## [Alternative Frontends](https://github.com/quickemu-project/quickemu/wiki/07-Alternative-frontends)
|
||||||
|
|
||||||
|
### Quickgui
|
||||||
|
|
||||||
While `quickemu` and `quickget` are designed for the terminal, a
|
While `quickemu` and `quickget` are designed for the terminal, a
|
||||||
graphical user interface is also available:
|
graphical user interface is also available:
|
||||||
|
|
||||||
- **[Quickgui](https://github.com/quickgui/quickgui)** by [Mark
|
- **[Quickgui](https://github.com/quickemu-project/quickgui)** by [Mark
|
||||||
Johnson](https://github.com/marxjohnson) and [Yannick
|
Johnson](https://github.com/marxjohnson) and [Yannick
|
||||||
Mauray](https://github.com/ymauray).
|
Mauray](https://github.com/ymauray).
|
||||||
|
|
||||||
Many thanks to [Luke Wesley-Holley](https://github.com/Lukewh) and
|
To install Quickgui on Ubuntu:
|
||||||
[Philipp Kiemle](https://github.com/daPhipz) for creating the
|
|
||||||
**[Quickemu icons](https://github.com/Lukewh/quickemu-icons)** 🎨
|
|
||||||
|
|
||||||
### Quickgui for Ubuntu
|
``` shell
|
||||||
|
|
||||||
``` bash
|
|
||||||
sudo add-apt-repository ppa:yannick-mauray/quickgui
|
sudo add-apt-repository ppa:yannick-mauray/quickgui
|
||||||
sudo apt update
|
sudo apt update
|
||||||
sudo apt install quickgui
|
sudo apt install quickgui
|
||||||
```
|
```
|
||||||
|
|
||||||
### quickemu quickget X terminal project
|
Many thanks to [Luke Wesley-Holley](https://github.com/Lukewh) and
|
||||||
|
[Philipp Kiemle](https://github.com/daPhipz) for creating the
|
||||||
|
**[Quickemu icons](https://github.com/Lukewh/quickemu-icons)** 🎨
|
||||||
|
|
||||||
From Nov 2023, there is also a multi option desktop integrated text
|
## Creating Linux guests 🐧
|
||||||
interface, with lots of unique tools and utilities to help you make
|
|
||||||
light work of installations, snapshots and disk management
|
|
||||||
|
|
||||||
- **[qqX](https://github.com/TuxVinyards/qqX)** is independently
|
### Ubuntu
|
||||||
curated by [Alex Genovese](https://github.com/TuxVinyards) (see the
|
|
||||||
github pages)
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Ubuntu Guest
|
|
||||||
|
|
||||||
`quickget` will automatically download an Ubuntu release and create the
|
`quickget` will automatically download an Ubuntu release and create the
|
||||||
virtual machine configuration.
|
virtual machine configuration.
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
quickget ubuntu 22.04
|
quickget ubuntu 22.04
|
||||||
quickemu --vm ubuntu-22.04.conf
|
quickemu --vm ubuntu-22.04.conf
|
||||||
```
|
```
|
||||||
|
@ -241,25 +354,29 @@ quickemu --vm ubuntu-22.04.conf
|
||||||
enable file sharing.
|
enable file sharing.
|
||||||
- `sudo apt install spice-webdavd`
|
- `sudo apt install spice-webdavd`
|
||||||
|
|
||||||
### Ubuntu devel (daily-live) images
|
### Ubuntu daily-live images
|
||||||
|
|
||||||
`quickget` can also download/refresh devel images via `zsync` for Ubuntu
|
`quickget` can also download/refresh daily-live images via `zsync` for
|
||||||
developers and testers.
|
Ubuntu developers and testers.
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
quickget ubuntu devel
|
quickget ubuntu daily-live
|
||||||
quickemu --vm ubuntu-devel.conf
|
quickemu --vm ubuntu-daily-live.conf
|
||||||
```
|
```
|
||||||
|
|
||||||
You can run `quickget ubuntu devel` to refresh your daily development
|
You can run `quickget ubuntu daily-live` to refresh your daily
|
||||||
image as often as you like, it will even automatically switch to a new
|
development image as often as you like, it will even automatically
|
||||||
series.
|
switch to a new series.
|
||||||
|
|
||||||
### Ubuntu Flavours
|
### Ubuntu Flavours
|
||||||
|
|
||||||
All the official Ubuntu flavours are supported, just replace `ubuntu`
|
All the official Ubuntu flavours are supported, just replace `ubuntu`
|
||||||
with your preferred flavour.
|
with your preferred flavour.
|
||||||
|
|
||||||
|
The project
|
||||||
|
[wiki](https://github.com/quickemu-project/quickemu/wiki/02-Create-Linux-virtual-machines)
|
||||||
|
may have further information.
|
||||||
|
|
||||||
- `edubuntu` (Edubuntu)
|
- `edubuntu` (Edubuntu)
|
||||||
- `kubuntu` (Kubuntu)
|
- `kubuntu` (Kubuntu)
|
||||||
- `lubuntu` (Lubuntu)
|
- `lubuntu` (Lubuntu)
|
||||||
|
@ -273,42 +390,70 @@ with your preferred flavour.
|
||||||
- `ubuntu-unity` (Ubuntu Unity)
|
- `ubuntu-unity` (Ubuntu Unity)
|
||||||
- `xubuntu` (Xubuntu)
|
- `xubuntu` (Xubuntu)
|
||||||
|
|
||||||
You can also use `quickget` with options to:
|
You can also use `quickget` with advanced options :
|
||||||
|
|
||||||
|
``` text
|
||||||
|
--download <os> <release> [edition] : Download image; no VM configuration
|
||||||
|
--create-config <os> [path/url] [flags] : Create VM config for an OS image
|
||||||
|
--open-homepage <os> : Open homepage for the OS
|
||||||
|
--show [os] : Show OS information
|
||||||
|
--version : Show version
|
||||||
|
--help : Show this help message
|
||||||
|
--disable-unattended : Force quickget not to set up an unattended installation
|
||||||
|
--url [os] [release] [edition] : Show image URL(s)
|
||||||
|
--check [os] [release] [edition] : Check image URL(s)
|
||||||
|
--list : List all supported systems
|
||||||
|
--list-csv : List everything in csv format
|
||||||
|
--list-json : List everything in json format
|
||||||
|
```
|
||||||
|
|
||||||
|
Here are some typical uses
|
||||||
|
|
||||||
``` shell
|
``` shell
|
||||||
# show an OS ISO download URL for {os} {release} [edition]
|
# show an OS ISO download URL for {os} {release} [edition]
|
||||||
quickget --show-iso-url fedora 38 Silverblue
|
quickget --url fedora 38 Silverblue
|
||||||
# test if and OS ISO is available for {os} {release} [edition]
|
# test if an OS ISO is available for {os} {release} [edition]
|
||||||
quickget --test-iso-url nixos 23.05 plasma5
|
quickget --check nixos unstable plasma5
|
||||||
# open an OS distribution homepage in a browser
|
# open an OS distribution homepage in a browser
|
||||||
quickget --open-distro-homepage ubuntu-mate
|
quickget --open-homepage ubuntu-mate
|
||||||
|
# Only download image file into current directory, without creating VM
|
||||||
|
quickget --download elementary 7.1
|
||||||
```
|
```
|
||||||
|
|
||||||
The `--show-iso-url` and `--test-iso-url` options **do not** work for
|
The `--url`, `--check`, and `--download` options are fully functional
|
||||||
`Windows` (`quickget` will begin downloading the requested release and
|
for all operating systems, including Windows and macOS.
|
||||||
edition of windows)
|
|
||||||
|
|
||||||
## Other Operating Systems
|
Further information is available from the project
|
||||||
|
[wiki](https://github.com/quickemu-project/quickemu/wiki/06-Advanced-quickget-features)
|
||||||
|
|
||||||
|
### Other Operating Systems
|
||||||
|
|
||||||
`quickget` also supports:
|
`quickget` also supports:
|
||||||
|
|
||||||
- `alma` (Alma Linux)
|
- `alma` (AlmaLinux)
|
||||||
- `alpine` (Alpine Linux)
|
- `alpine` (Alpine Linux)
|
||||||
- `android` (Android x86)
|
- `android` (Android x86)
|
||||||
- `antix` (Antix)
|
- `antix` (Antix)
|
||||||
- `archcraft` (Archcraft)
|
- `archcraft` (Archcraft)
|
||||||
- `archlinux` (Arch Linux)
|
- `archlinux` (Arch Linux)
|
||||||
- `arcolinux` (Arco Linux)
|
- `arcolinux` (Arco Linux)
|
||||||
|
- `artixlinux` (Artix Linux)
|
||||||
|
- `athenaos` (Athena OS)
|
||||||
- `batocera` (Batocera)
|
- `batocera` (Batocera)
|
||||||
|
- `bazzite` (Bazzite)
|
||||||
|
- `biglinux` (BigLinux)
|
||||||
- `blendos` (BlendOS)
|
- `blendos` (BlendOS)
|
||||||
- `bodhi` (Bodhi)
|
- `bodhi` (Bodhi)
|
||||||
- `bunsenlabs` (Bunsenlabs)
|
- `bunsenlabs` (BunsenLabs)
|
||||||
- `cachyos` (CachyOS)
|
- `cachyos` (CachyOS)
|
||||||
- `centos-stream` (CentOS Stream)
|
- `centos-stream` (CentOS Stream)
|
||||||
|
- `chimeralinux` (Chimera Linux)
|
||||||
|
- `crunchbang++` (Crunchbangplusplus)
|
||||||
- `debian` (Debian)
|
- `debian` (Debian)
|
||||||
- `deepin` (Deepin)
|
- `deepin` (Deepin)
|
||||||
- `devuan` (Devuan)
|
- `devuan` (Devuan)
|
||||||
- `dragonflybsd` (DragonFlyBSD)
|
- `dragonflybsd` (DragonFlyBSD)
|
||||||
|
- `easyos` (EasyOS)
|
||||||
- `elementary` (elementary OS)
|
- `elementary` (elementary OS)
|
||||||
- `endeavouros` (EndeavourOS)
|
- `endeavouros` (EndeavourOS)
|
||||||
- `endless` (Endless OS)
|
- `endless` (Endless OS)
|
||||||
|
@ -318,52 +463,67 @@ edition of windows)
|
||||||
- `garuda` (Garuda Linux)
|
- `garuda` (Garuda Linux)
|
||||||
- `gentoo` (Gentoo)
|
- `gentoo` (Gentoo)
|
||||||
- `ghostbsd` (GhostBSD)
|
- `ghostbsd` (GhostBSD)
|
||||||
|
- `gnomeos` (GNOME OS)
|
||||||
|
- `guix` (Guix)
|
||||||
- `haiku` (Haiku)
|
- `haiku` (Haiku)
|
||||||
- `holoiso` (SteamOS HoloISO)
|
- `holoiso` (HoloISO)
|
||||||
- `kali` (Kali)
|
- `kali` (Kali)
|
||||||
- `kdeneon` (KDE Neon)
|
- `kdeneon` (KDE Neon)
|
||||||
- `kolibrios` (KolibriOS)
|
- `kolibrios` (KolibriOS)
|
||||||
- `linuxlite` (Linux Lite)
|
- `linuxlite` (Linux Lite)
|
||||||
- `linuxmint` (Linux Mint)
|
- `linuxmint` (Linux Mint)
|
||||||
- `lmde` (Linux Mint Debian Edition)
|
- `lmde` (Linux Mint Debian Edition)
|
||||||
|
- `maboxlinux` (Mabox Linux)
|
||||||
- `mageia` (Mageia)
|
- `mageia` (Mageia)
|
||||||
- `manjaro` (Manjaro)
|
- `manjaro` (Manjaro)
|
||||||
- `mxlinux` (MX Linux)
|
- `mxlinux` (MX Linux)
|
||||||
- `netboot` (netboot.xyz)
|
- `netboot` (netboot.xyz)
|
||||||
- `netbsd` (NetBSD)
|
- `netbsd` (NetBSD)
|
||||||
|
- `nitrux` (Nitrux)
|
||||||
- `nixos` (NixOS)
|
- `nixos` (NixOS)
|
||||||
|
- `nwg-shell` (nwg-shell)
|
||||||
- `openbsd` (OpenBSD)
|
- `openbsd` (OpenBSD)
|
||||||
- `openindiana` (OpenIndiana)
|
- `openindiana` (OpenIndiana)
|
||||||
- `opensuse` (openSUSE)
|
- `opensuse` (openSUSE)
|
||||||
- `oraclelinux` (Oracle Linux)
|
- `oraclelinux` (Oracle Linux)
|
||||||
|
- `parrotsec` (Parrot Security)
|
||||||
- `peppermint` (PeppermintOS)
|
- `peppermint` (PeppermintOS)
|
||||||
- `popos` (Pop!\_OS)
|
- `popos` (Pop!\_OS)
|
||||||
- `porteus` (Porteus)
|
- `porteus` (Porteus)
|
||||||
|
- `primtux` (PrimTux)
|
||||||
|
- `proxmox-ve` (Proxmox VE)
|
||||||
|
- `pureos` (PureOS)
|
||||||
- `reactos` (ReactOS)
|
- `reactos` (ReactOS)
|
||||||
- `rebornos` (RebornOS)
|
- `rebornos` (RebornOS)
|
||||||
- `rockylinux` (Rocky Linux)
|
- `rockylinux` (Rocky Linux)
|
||||||
- `siduction` (Siduction)
|
- `siduction` (Siduction)
|
||||||
- `slackware` (Slackware)
|
- `slackware` (Slackware)
|
||||||
|
- `slax` (Slax)
|
||||||
|
- `slint` (Slint)
|
||||||
|
- `slitaz` (SliTaz)
|
||||||
- `solus` (Solus)
|
- `solus` (Solus)
|
||||||
- `spiral` (Spiral)
|
- `sparkylinux` (SparkyLinux)
|
||||||
|
- `spirallinux` (SpiralLinux)
|
||||||
- `tails` (Tails)
|
- `tails` (Tails)
|
||||||
- `tinycore` (Tiny Core Linux)
|
- `tinycore` (Tiny Core Linux)
|
||||||
- `trisquel` (Trisquel)
|
- `trisquel` (Trisquel-)
|
||||||
- `truenas-core` (TrueNAS Core)
|
- `truenas-core` (TrueNAS Core)
|
||||||
- `truenas-scale` (TrueNAS Scale)
|
- `truenas-scale` (TrueNAS Scale)
|
||||||
|
- `tuxedo-os` (Tuxedo OS)
|
||||||
- `vanillaos` (Vanilla OS)
|
- `vanillaos` (Vanilla OS)
|
||||||
- `void` (Void Linux)
|
- `void` (Void Linux)
|
||||||
- `vxlinux` (VX Linux)
|
- `vxlinux` (VX Linux)
|
||||||
- `xerolinux` (XeroLinux)
|
|
||||||
- `zorin` (Zorin OS)
|
- `zorin` (Zorin OS)
|
||||||
|
|
||||||
|
### [Custom Linux guests](https://github.com/quickemu-project/quickemu/wiki/02-Create-Linux-virtual-machines#manually-create-linux-guests)
|
||||||
|
|
||||||
Or you can download a Linux image and manually create a VM
|
Or you can download a Linux image and manually create a VM
|
||||||
configuration.
|
configuration.
|
||||||
|
|
||||||
- Download a .iso image of a Linux distribution
|
- Download a .iso image of a Linux distribution
|
||||||
- Create a VM configuration file; for example `debian-bullseye.conf`
|
- Create a VM configuration file; for example `debian-bullseye.conf`
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
guest_os="linux"
|
guest_os="linux"
|
||||||
disk_img="debian-bullseye/disk.qcow2"
|
disk_img="debian-bullseye/disk.qcow2"
|
||||||
iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
|
iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
|
||||||
|
@ -371,7 +531,7 @@ iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
|
||||||
|
|
||||||
- Use `quickemu` to start the virtual machine:
|
- Use `quickemu` to start the virtual machine:
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
quickemu --vm debian-bullseye.conf
|
quickemu --vm debian-bullseye.conf
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -382,67 +542,76 @@ quickemu --vm debian-bullseye.conf
|
||||||
- Install the SPICE WebDAV agent (`spice-webdavd`) in the guest to
|
- Install the SPICE WebDAV agent (`spice-webdavd`) in the guest to
|
||||||
enable file sharing.
|
enable file sharing.
|
||||||
|
|
||||||
## macOS Guest
|
## Supporting old Linux distros
|
||||||
|
|
||||||
|
If you want to run an old Linux , from 2016 or earlier, change the
|
||||||
|
`guest_os` to `linux_old`. This will enable the `vmware-svga` graphics
|
||||||
|
driver which is better supported on older distros.
|
||||||
|
|
||||||
|
## [Creating macOS Guests](https://github.com/quickemu-project/quickemu/wiki/03-Create-macOS-virtual-machines#automatically-create-macos-guests) 🍏
|
||||||
|
|
||||||
|
**Installing macOS in a VM can be a bit finicky, if you encounter
|
||||||
|
problems, [check the
|
||||||
|
Discussions](https://github.com/quickemu-project/quickemu/discussions)
|
||||||
|
for solutions or ask for help there** 🛟
|
||||||
|
|
||||||
`quickget` automatically downloads a macOS recovery image and creates a
|
`quickget` automatically downloads a macOS recovery image and creates a
|
||||||
virtual machine configuration.
|
virtual machine configuration.
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
quickget macos catalina
|
quickget macos big-sur
|
||||||
quickemu --vm macos-catalina.conf
|
quickemu --vm macos-big-sur.conf
|
||||||
```
|
```
|
||||||
|
|
||||||
macOS `high-sierra`, `mojave`, `catalina`, `big-sur`, `monterey` and
|
macOS `mojave`, `catalina`, `big-sur`, `monterey`, `ventura` and
|
||||||
`ventura` are supported.
|
`sonoma` are supported.
|
||||||
|
|
||||||
- Use cursor keys and enter key to select the **macOS Base System**
|
- Use cursor keys and enter key to select the **macOS Base System**
|
||||||
- From **macOS Utilities**
|
- From **macOS Utilities**
|
||||||
- Click **Disk Utility** and **Continue**
|
- Click **Disk Utility** and **Continue**
|
||||||
- Select `QEMU HARDDISK Media` (\~103.08GB) from the list (on
|
- Select `QEMU HARDDISK Media` (~103.08GB) from the list (on Big Sur
|
||||||
Big Sur and above use `Apple Inc. VirtIO Block Device`) and
|
and above use `Apple Inc. VirtIO Block Device`) and click
|
||||||
click **Erase**.
|
**Erase**.
|
||||||
- Enter a `Name:` for the disk
|
- Enter a `Name:` for the disk
|
||||||
- If you are installing macOS Mojave or later (Catalina, Big
|
- If you are installing macOS Mojave or later (Catalina, Big Sur,
|
||||||
Sur, Monterey and Ventura), choose any of the APFS options
|
Monterey, Ventura and Sonoma), choose any of the APFS options as
|
||||||
as the filesystem. MacOS Extended may not work.
|
the filesystem. MacOS Extended may not work.
|
||||||
- Click **Erase**.
|
- Click **Erase**.
|
||||||
- Click **Done**.
|
- Click **Done**.
|
||||||
- Close Disk Utility
|
- Close Disk Utility
|
||||||
- From **macOS Utilities**
|
- From **macOS Utilities**
|
||||||
- Click **Reinstall macOS** and **Continue**
|
- Click **Reinstall macOS** and **Continue**
|
||||||
- Complete the installation as you normally would.
|
- Complete the installation as you normally would.
|
||||||
- On the first reboot use cursor keys and enter key to select
|
- On the first reboot use cursor keys and enter key to select **macOS
|
||||||
**macOS Installer**
|
Installer**
|
||||||
- On the subsequent reboots use cursor keys and enter key to
|
- On the subsequent reboots use cursor keys and enter key to select
|
||||||
select the disk you named
|
the disk you named
|
||||||
- Once you have finished installing macOS you will be presented with
|
- Once you have finished installing macOS you will be presented with an
|
||||||
an the out-of-the-box first-start wizard to configure various
|
the out-of-the-box first-start wizard to configure various options and
|
||||||
options and set up your username and password
|
set up your username and password
|
||||||
- OPTIONAL: After you have concluded the out-of-the-box wizard, you
|
- OPTIONAL: After you have concluded the out-of-the-box wizard, you may
|
||||||
may want to enable the TRIM feature that the computer industry
|
want to enable the TRIM feature that the computer industry created for
|
||||||
created for SSD disks. This feature in our macOS installation will
|
SSD disks. This feature in our macOS installation will allow QuickEmu
|
||||||
allow QuickEmu to compact (shrink) your macOS disk image whenever
|
to compact (shrink) your macOS disk image whenever you delete files
|
||||||
you delete files inside the Virtual Machine. Without this step your
|
inside the Virtual Machine. Without this step your macOS disk image
|
||||||
macOS disk image will only ever get larger and will not shrink even
|
will only ever get larger and will not shrink even when you delete
|
||||||
when you delete lots of data inside macOS.
|
lots of data inside macOS.
|
||||||
- To enable TRIM, open the Terminal application and type the
|
- To enable TRIM, open the Terminal application and type the following
|
||||||
following command followed by pressing
|
command followed by pressing <kbd>enter</kbd> to tell macos to use
|
||||||
`<kbd>`{=html}enter`</kbd>`{=html} to tell macos to use the TRIM
|
the TRIM command on the hard disk when files are deleted:
|
||||||
command on the hard disk when files are deleted:
|
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
sudo trimforce enable
|
sudo trimforce enable
|
||||||
```
|
```
|
||||||
|
|
||||||
You will be prompted to enter your account's password to gain the
|
You will be prompted to enter your account's password to gain the
|
||||||
privilege needed. Once you've entered your password and pressed
|
privilege needed. Once you've entered your password and pressed
|
||||||
`<kbd>`{=html}enter`</kbd>`{=html} the command will request confirmation
|
<kbd>enter</kbd> the command will request confirmation in the form of
|
||||||
in the form of two questions that require you to type
|
two questions that require you to type <kbd>y</kbd> (for a "yes"
|
||||||
`<kbd>`{=html}y`</kbd>`{=html} (for a "yes" response) followed by
|
response) followed by <kbd>enter</kbd> to confirm.
|
||||||
`<kbd>`{=html}enter`</kbd>`{=html} to confirm. If you press
|
|
||||||
`<kbd>`{=html}enter`</kbd>`{=html} without first typing
|
If you press <kbd>enter</kbd> without first typing <kbd>y</kbd> the
|
||||||
`<kbd>`{=html}y`</kbd>`{=html} the system will consider that a negative
|
system will consider that a negative response as though you said "no":
|
||||||
response as though you said "no":
|
|
||||||
|
|
||||||
``` plain
|
``` plain
|
||||||
IMPORTANT NOTICE: This tool force-enables TRIM for all relevant attached devices, even though such devices may not have been validated for data integrity while using TRIM. Use of this tool to enable TRIM may result in unintended data loss or data corruption. It should not be used in a commercial operating environment or with important data. Before using this tool, you should back up all of your data and regularly back up data while TRIM is enabled. This tool is provided on an "as is" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THIS TOOL OR ITS USE ALONE OR IN COMBINATION WITH YOUR DEVICES, SYSTEMS, OR SERVICES. BY USING THIS TOOL TO ENABLE TRIM, YOU AGREE THAT, TO THE EXTENT PERMITTED BY APPLICABLE LAW, USE OF THE TOOL IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU.
|
IMPORTANT NOTICE: This tool force-enables TRIM for all relevant attached devices, even though such devices may not have been validated for data integrity while using TRIM. Use of this tool to enable TRIM may result in unintended data loss or data corruption. It should not be used in a commercial operating environment or with important data. Before using this tool, you should back up all of your data and regularly back up data while TRIM is enabled. This tool is provided on an "as is" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THIS TOOL OR ITS USE ALONE OR IN COMBINATION WITH YOUR DEVICES, SYSTEMS, OR SERVICES. BY USING THIS TOOL TO ENABLE TRIM, YOU AGREE THAT, TO THE EXTENT PERMITTED BY APPLICABLE LAW, USE OF THE TOOL IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU.
|
||||||
|
@ -461,55 +630,55 @@ soon as the command completes.
|
||||||
|
|
||||||
The default macOS configuration looks like this:
|
The default macOS configuration looks like this:
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
guest_os="macos"
|
guest_os="macos"
|
||||||
img="macos-catalina/RecoveryImage.img"
|
img="macos- big-sur/RecoveryImage.img"
|
||||||
disk_img="macos-catalina/disk.qcow2"
|
disk_img="macos- big-sur/disk.qcow2"
|
||||||
macos_release="catalina"
|
macos_release=" big-sur"
|
||||||
```
|
```
|
||||||
|
|
||||||
- `guest_os="macos"` instructs Quickemu to optimise for macOS.
|
- `guest_os="macos"` instructs Quickemu to optimise for macOS.
|
||||||
- `macos_release="catalina"` instructs Quickemu to optimise for a
|
- `macos_release=" big-sur"` instructs Quickemu to optimise for a
|
||||||
particular macOS release.
|
particular macOS release.
|
||||||
- For example VirtIO Network and Memory Ballooning are available
|
- For example VirtIO Network and Memory Ballooning are available in
|
||||||
in Big Sur and newer, but not previous releases.
|
Big Sur and newer, but not previous releases.
|
||||||
- And VirtIO Block Media (disks) are supported/stable in Catalina
|
- And VirtIO Block Media (disks) are supported/stable in Catalina and
|
||||||
and newer.
|
newer.
|
||||||
|
|
||||||
### macOS compatibility
|
# macOS compatibility
|
||||||
|
|
||||||
There are some considerations when running macOS via Quickemu.
|
There are some considerations when running macOS via Quickemu.
|
||||||
|
|
||||||
- Supported macOS releases:
|
- Supported macOS releases:
|
||||||
- High Sierra
|
|
||||||
- Mojave
|
- Mojave
|
||||||
- Catalina **(Recommended)**
|
- Catalina
|
||||||
- Big Sur
|
- Big Sur
|
||||||
- Monterey
|
- Monterey
|
||||||
- Ventura
|
- Ventura
|
||||||
|
- Sonoma
|
||||||
- `quickemu` will automatically download the required
|
- `quickemu` will automatically download the required
|
||||||
[OpenCore](https://github.com/acidanthera/OpenCorePkg) bootloader
|
[OpenCore](https://github.com/acidanthera/OpenCorePkg) bootloader and
|
||||||
and OVMF firmware from [OSX-KVM](https://github.com/kholia/OSX-KVM).
|
OVMF firmware from [OSX-KVM](https://github.com/kholia/OSX-KVM).
|
||||||
- Optimised by default, but no GPU acceleration is available.
|
- Optimised by default, but no GPU acceleration is available.
|
||||||
- Host CPU vendor is detected and guest CPU is optimised
|
- Host CPU vendor is detected and guest CPU is optimised accordingly.
|
||||||
accordingly.
|
|
||||||
- [VirtIO Block
|
- [VirtIO Block
|
||||||
Media](https://www.kraxel.org/blog/2019/06/macos-qemu-guest/) is
|
Media](https://www.kraxel.org/blog/2019/06/macos-qemu-guest/) is
|
||||||
used for the system disk where supported.
|
used for the system disk where supported.
|
||||||
- [VirtIO `usb-tablet`](http://philjordan.eu/osx-virt/) is used
|
- [VirtIO `usb-tablet`](http://philjordan.eu/osx-virt/) is used for
|
||||||
for the mouse.
|
the mouse.
|
||||||
- VirtIO Network (`virtio-net`) is supported and enabled on macOS
|
- VirtIO Network (`virtio-net`) is supported and enabled on macOS Big
|
||||||
Big Sur and newer but previous releases use `vmxnet3`.
|
Sur and newer, but earlier releases use `vmxnet3`.
|
||||||
- VirtIO Memory Ballooning is supported and enabled on macOS Big
|
- VirtIO Memory Ballooning is supported and enabled on macOS Big Sur
|
||||||
Sur and newer but disabled for other support macOS releases.
|
and newer but disabled for other support macOS releases.
|
||||||
- USB host and SPICE pass-through is:
|
- USB host and SPICE pass-through is:
|
||||||
- UHCI (USB 2.0) on macOS Catalina and earlier.
|
- UHCI (USB 2.0) on macOS Catalina and earlier.
|
||||||
- XHCI (USB 3.0) on macOS Big Sur and newer.
|
- XHCI (USB 3.0) on macOS Big Sur and newer.
|
||||||
- Display resolution can only be changed via macOS System Preferences.
|
- Display resolution can be changed via `quickemu` using `--width` and
|
||||||
|
`--height` command line arguments.
|
||||||
- **Full Duplex audio requires [VoodooHDA
|
- **Full Duplex audio requires [VoodooHDA
|
||||||
OC](https://github.com/chris1111/VoodooHDA-OC) or pass-through a USB
|
OC](https://github.com/chris1111/VoodooHDA-OC) or pass-through a USB
|
||||||
audio-device to the macOS guest VM**.
|
audio-device to the macOS guest VM**.
|
||||||
- NOTE! [Gatekeeper](https://disable-gatekeeper.github.io/) and
|
- NOTE! [Gatekeeper](https://disable-gatekeeper.github.io/) and
|
||||||
[System Integrity Protection
|
[System Integrity Protection
|
||||||
(SIP)](https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection)
|
(SIP)](https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection)
|
||||||
need to be disabled to install VoodooHDA OC
|
need to be disabled to install VoodooHDA OC
|
||||||
|
@ -518,7 +687,7 @@ There are some considerations when running macOS via Quickemu.
|
||||||
webdavd](https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24).
|
webdavd](https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24).
|
||||||
- Copy/paste via SPICE agent is **not available on macOS**.
|
- Copy/paste via SPICE agent is **not available on macOS**.
|
||||||
|
|
||||||
### macOS App Store
|
# macOS App Store
|
||||||
|
|
||||||
If you see *"Your device or computer could not be verified"* when you
|
If you see *"Your device or computer could not be verified"* when you
|
||||||
try to login to the App Store, make sure that your wired ethernet device
|
try to login to the App Store, make sure that your wired ethernet device
|
||||||
|
@ -528,25 +697,39 @@ If the wired ethernet device is not `en0`, then then go to *System
|
||||||
Preferences* -\> *Network*, delete all the network devices and apply the
|
Preferences* -\> *Network*, delete all the network devices and apply the
|
||||||
changes. Next, open a terminal and run the following:
|
changes. Next, open a terminal and run the following:
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
|
sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
|
||||||
```
|
```
|
||||||
|
|
||||||
Now reboot, and the App Store should work.
|
Now reboot, and the App Store should work.
|
||||||
|
|
||||||
## Windows 8, 10 & 11 Guests
|
There may be further advice and information about macOS guests in the
|
||||||
|
project
|
||||||
|
[wiki](https://github.com/quickemu-project/quickemu/wiki/03-Create-macOS-virtual-machines#automatically-create-macos-guests).
|
||||||
|
|
||||||
`quickget` can download
|
## [Creating Windows guests](https://github.com/quickemu-project/quickemu/wiki/04-Create-Windows-virtual-machines) 🪟
|
||||||
[Windows10](https://www.microsoft.com/software-download/windows10) and
|
|
||||||
[Windows 11](https://www.microsoft.com/software-download/windows11)
|
`quickget` can download [**Windows
|
||||||
|
10**](https://www.microsoft.com/software-download/windows10) and
|
||||||
|
[**Windows 11**](https://www.microsoft.com/software-download/windows11)
|
||||||
automatically and create an optimised virtual machine configuration.
|
automatically and create an optimised virtual machine configuration.
|
||||||
This configuration also includes the [VirtIO drivers for
|
This configuration also includes the [VirtIO drivers for
|
||||||
Windows](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/).
|
Windows](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/).
|
||||||
|
|
||||||
Windows 8.1 is also supported but doesn't feature any automated
|
**Windows 8.1** is also supported but doesn't feature any automated
|
||||||
installation or driver optimisation.
|
installation or driver optimisation.
|
||||||
|
|
||||||
``` bash
|
`quickget` can also download [Windows 10
|
||||||
|
LTSC](https://www.microsoft.com/en-us/evalcenter/download-windows-10-enterprise)
|
||||||
|
and Windows Server
|
||||||
|
[2012-r2](https://www.microsoft.com/en-us/evalcenter/download-windows-server-2012-r2),
|
||||||
|
[2016](https://www.microsoft.com/en-us/evalcenter/download-windows-server-2016),
|
||||||
|
[2019](https://www.microsoft.com/en-us/evalcenter/download-windows-server-2019),
|
||||||
|
and
|
||||||
|
[2022](https://www.microsoft.com/en-us/evalcenter/download-windows-server-2022).
|
||||||
|
No automated installation is supported for these releases.
|
||||||
|
|
||||||
|
``` shell
|
||||||
quickget windows 11
|
quickget windows 11
|
||||||
quickemu --vm windows-11.conf
|
quickemu --vm windows-11.conf
|
||||||
```
|
```
|
||||||
|
@ -558,40 +741,27 @@ quickemu --vm windows-11.conf
|
||||||
- Username: `Quickemu`
|
- Username: `Quickemu`
|
||||||
- Password: `quickemu`
|
- Password: `quickemu`
|
||||||
|
|
||||||
The default Windows 11 configuration looks like this:
|
Further information is available from the project
|
||||||
|
[wiki](https://github.com/quickemu-project/quickemu/wiki/04-Create-Windows-virtual-machines)
|
||||||
|
|
||||||
``` bash
|
## Configuration
|
||||||
guest_os="windows"
|
|
||||||
disk_img="windows-11/disk.qcow2"
|
|
||||||
iso="windows-11/windows-11.iso"
|
|
||||||
fixed_iso="windows-11/virtio-win.iso"
|
|
||||||
tpm="on"
|
|
||||||
secureboot="off"
|
|
||||||
```
|
|
||||||
|
|
||||||
- `guest_os="windows"` instructs `quickemu` to optimise for Windows.
|
|
||||||
- `fixed_iso=` specifies the ISO image that provides VirtIO drivers.
|
|
||||||
- `tpm="on"` instructs `quickemu` to create a software emulated TPM
|
|
||||||
device using `swtpm`.
|
|
||||||
|
|
||||||
# All the options
|
|
||||||
|
|
||||||
Here are the usage instructions:
|
Here are the usage instructions:
|
||||||
|
|
||||||
|
``` text
|
||||||
|
Usage
|
||||||
|
quickemu --vm ubuntu.conf <arguments>
|
||||||
|
|
||||||
Usage
|
Arguments
|
||||||
quickemu --vm ubuntu.conf
|
|
||||||
|
|
||||||
You can also pass optional parameters
|
|
||||||
--access : Enable remote spice access support. 'local' (default), 'remote', 'clientipaddress'
|
--access : Enable remote spice access support. 'local' (default), 'remote', 'clientipaddress'
|
||||||
--braille : Enable braille support. Requires SDL.
|
--braille : Enable braille support. Requires SDL.
|
||||||
--delete-disk : Delete the disk image and EFI variables
|
--delete-disk : Delete the disk image and EFI variables
|
||||||
--delete-vm : Delete the entire VM and it's configuration
|
--delete-vm : Delete the entire VM and its configuration
|
||||||
--display : Select display backend. 'sdl' (default), 'gtk', 'none', 'spice' or 'spice-app'
|
--display : Select display backend. 'sdl' (default), 'cocoa', 'gtk', 'none', 'spice' or 'spice-app'
|
||||||
--fullscreen : Starts VM in full screen mode (Ctl+Alt+f to exit)
|
--fullscreen : Starts VM in full screen mode (Ctl+Alt+f to exit)
|
||||||
--ignore-msrs-always : Configure KVM to always ignore unhandled machine-specific registers
|
--ignore-msrs-always : Configure KVM to always ignore unhandled machine-specific registers
|
||||||
--screen <screen> : Use specified screen to determine the window size.
|
--kill : Kill the VM process if it is running
|
||||||
--screenpct <percent> : Percent of fullscreen for VM if --fullscreen is not specified.
|
--offline : Override all network settings and start the VM offline
|
||||||
--shortcut : Create a desktop shortcut
|
--shortcut : Create a desktop shortcut
|
||||||
--snapshot apply <tag> : Apply/restore a snapshot.
|
--snapshot apply <tag> : Apply/restore a snapshot.
|
||||||
--snapshot create <tag> : Create a snapshot.
|
--snapshot create <tag> : Create a snapshot.
|
||||||
|
@ -599,8 +769,10 @@ Here are the usage instructions:
|
||||||
--snapshot info : Show disk/snapshot info.
|
--snapshot info : Show disk/snapshot info.
|
||||||
--status-quo : Do not commit any changes to disk/snapshot.
|
--status-quo : Do not commit any changes to disk/snapshot.
|
||||||
--viewer <viewer> : Choose an alternative viewer. @Options: 'spicy' (default), 'remote-viewer', 'none'
|
--viewer <viewer> : Choose an alternative viewer. @Options: 'spicy' (default), 'remote-viewer', 'none'
|
||||||
--ssh-port <port> : Set ssh-port manually
|
--width <width> : Set VM screen width; requires '--height'
|
||||||
--spice-port <port> : Set spice-port manually
|
--height <height> : Set VM screen height; requires '--width'
|
||||||
|
--ssh-port <port> : Set SSH port manually
|
||||||
|
--spice-port <port> : Set SPICE port manually
|
||||||
--public-dir <path> : Expose share directory. @Options: '' (default: xdg-user-dir PUBLICSHARE), '<directory>', 'none'
|
--public-dir <path> : Expose share directory. @Options: '' (default: xdg-user-dir PUBLICSHARE), '<directory>', 'none'
|
||||||
--monitor <type> : Set monitor connection type. @Options: 'socket' (default), 'telnet', 'none'
|
--monitor <type> : Set monitor connection type. @Options: 'socket' (default), 'telnet', 'none'
|
||||||
--monitor-telnet-host <ip/host> : Set telnet host for monitor. (default: 'localhost')
|
--monitor-telnet-host <ip/host> : Set telnet host for monitor. (default: 'localhost')
|
||||||
|
@ -610,12 +782,14 @@ Here are the usage instructions:
|
||||||
--serial-telnet-host <ip/host> : Set telnet host for serial. (default: 'localhost')
|
--serial-telnet-host <ip/host> : Set telnet host for serial. (default: 'localhost')
|
||||||
--serial-telnet-port <port> : Set telnet port for serial. (default: '6660')
|
--serial-telnet-port <port> : Set telnet port for serial. (default: '6660')
|
||||||
--keyboard <type> : Set keyboard. @Options: 'usb' (default), 'ps2', 'virtio'
|
--keyboard <type> : Set keyboard. @Options: 'usb' (default), 'ps2', 'virtio'
|
||||||
--keyboard_layout <layout> : Set keyboard layout.
|
--keyboard_layout <layout> : Set keyboard layout: 'en-us' (default)
|
||||||
--mouse <type> : Set mouse. @Options: 'tablet' (default), 'ps2', 'usb', 'virtio'
|
--mouse <type> : Set mouse. @Options: 'tablet' (default), 'ps2', 'usb', 'virtio'
|
||||||
--usb-controller <type> : Set usb-controller. @Options: 'ehci' (default), 'xhci', 'none'
|
--usb-controller <type> : Set usb-controller. @Options: 'ehci' (default), 'xhci', 'none'
|
||||||
--sound-card <type> : Set sound card. @Options: 'intel-hda' (default), 'ac97', 'es1370', 'sb16', 'none'
|
--sound-card <type> : Set sound card. @Options: 'intel-hda' (default), 'ac97', 'es1370', 'sb16', 'usb-audio', 'none'
|
||||||
|
--sound-duplex <type> : Set sound card duplex. @Options: 'hda-micro' (default: speaker/mic), 'hda-duplex' (line-in/line-out), 'hda-output' (output-only)
|
||||||
--extra_args <arguments> : Pass additional arguments to qemu
|
--extra_args <arguments> : Pass additional arguments to qemu
|
||||||
--version : Print version
|
--version : Print version
|
||||||
|
```
|
||||||
|
|
||||||
## Desktop shortcuts
|
## Desktop shortcuts
|
||||||
|
|
||||||
|
@ -623,61 +797,11 @@ Desktop shortcuts can be created for a VM, the shortcuts are saved in
|
||||||
`~/.local/share/applications`. Here is an example of how to create a
|
`~/.local/share/applications`. Here is an example of how to create a
|
||||||
shortcut.
|
shortcut.
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
quickemu --vm ubuntu-22.04-desktop.conf --shortcut
|
quickemu --vm ubuntu-22.04-desktop.conf --shortcut
|
||||||
```
|
```
|
||||||
|
|
||||||
## Screen and window size (Linux guests only)
|
## References
|
||||||
|
|
||||||
`qemu` will always default to the primary monitor to display the VM's
|
|
||||||
window.
|
|
||||||
|
|
||||||
Without the `--screen` option, `quickemu` will look for the size of the
|
|
||||||
smallest monitor, and use a size that fits on said monitor.
|
|
||||||
|
|
||||||
The `--screen` option forces `quickemu` to use the size of the given
|
|
||||||
monitor to compute the size of the window. **It won't use that monitor
|
|
||||||
to display the VM's window if it's not the primary monitor**. This is
|
|
||||||
useful if the primary monitor if not the smallest one, and if the VM's
|
|
||||||
window doesn't need to be moved around.
|
|
||||||
|
|
||||||
The `--screen` option is also useful with the `--fullscreen` option,
|
|
||||||
again because `qemu` will always use the primary monitor. In order for
|
|
||||||
the fullscreen mode to work properly, the resolution of the VM's window
|
|
||||||
must match the resolution of the screen.
|
|
||||||
|
|
||||||
To know which screen to use, type:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
xrandr --listmonitors | grep -v Monitors
|
|
||||||
```
|
|
||||||
|
|
||||||
The command will output something like this:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
0: +*HDMI-0 2560/597x1440/336+1920+0 HDMI-0
|
|
||||||
1: +DVI-D-0 1920/527x1080/296+0+0 DVI-D-0
|
|
||||||
```
|
|
||||||
|
|
||||||
The first number is what needs to be passed to the `--screen` option.
|
|
||||||
|
|
||||||
For example:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
quickemu --vm vm.conf --screen 0
|
|
||||||
```
|
|
||||||
|
|
||||||
The above uses the 2560x1440 screen to compute the size of the window,
|
|
||||||
which Quickemu sizes to 2048x1152. Without the `--screen` option,
|
|
||||||
Quickemu would have used the 1920x1080 monitor which results in a window
|
|
||||||
size of 1664x936.
|
|
||||||
|
|
||||||
The '--screenpct' is an optional integer value between 25 \<= pct \< 100
|
|
||||||
which will override system default screen sizes. The VM size will be
|
|
||||||
'pct' of the chosen screen. **If --fullscreen is chosen screen will be
|
|
||||||
fullsize instead of being scaled down by --screenpct value.**
|
|
||||||
|
|
||||||
# References
|
|
||||||
|
|
||||||
Useful reference that assisted the development of Quickemu.
|
Useful reference that assisted the development of Quickemu.
|
||||||
|
|
||||||
|
@ -690,13 +814,13 @@ Useful reference that assisted the development of Quickemu.
|
||||||
- <https://passthroughpo.st/mac-os-adds-early-support-for-virtio-qemu/>
|
- <https://passthroughpo.st/mac-os-adds-early-support-for-virtio-qemu/>
|
||||||
- <https://github.com/kholia/OSX-KVM>
|
- <https://github.com/kholia/OSX-KVM>
|
||||||
- <https://github.com/thenickdude/KVM-Opencore>
|
- <https://github.com/thenickdude/KVM-Opencore>
|
||||||
|
- <https://gist.github.com/MCJack123/943eaca762730ca4b7ae460b731b68e7>
|
||||||
- <https://github.com/acidanthera/OpenCorePkg/tree/master/Utilities/macrecovery>
|
- <https://github.com/acidanthera/OpenCorePkg/tree/master/Utilities/macrecovery>
|
||||||
- <https://www.kraxel.org/blog/2017/09/running-macos-as-guest-in-kvm/>
|
- <https://www.kraxel.org/blog/2017/09/running-macos-as-guest-in-kvm/>
|
||||||
- <https://www.nicksherlock.com/2017/10/passthrough-of-advanced-cpu-features-for-macos-high-sierra-guests/>
|
- <https://www.nicksherlock.com/2017/10/passthrough-of-advanced-cpu-features-for-macos-high-sierra-guests/>
|
||||||
- <http://philjordan.eu/osx-virt/>
|
- <http://philjordan.eu/osx-virt/>
|
||||||
- <https://github.com/Dids/clover-builder>
|
- <https://github.com/Dids/clover-builder>
|
||||||
- [OpenCore
|
- [OpenCore Configurator](https://mackie100projects.altervista.org)
|
||||||
Configurator](https://mackie100projects.altervista.org)
|
|
||||||
- Windows
|
- Windows
|
||||||
- <https://www.heiko-sieger.info/running-windows-10-on-linux-using-kvm-with-vga-passthrough/>
|
- <https://www.heiko-sieger.info/running-windows-10-on-linux-using-kvm-with-vga-passthrough/>
|
||||||
- <https://leduccc.medium.com/improving-the-performance-of-a-windows-10-guest-on-qemu-a5b3f54d9cf5>
|
- <https://leduccc.medium.com/improving-the-performance-of-a-windows-10-guest-on-qemu-a5b3f54d9cf5>
|
||||||
|
@ -727,4 +851,4 @@ Submit bug reports online at:
|
||||||
|
|
||||||
Full sources at: <https://github.com/quickemu-project/quickemu>
|
Full sources at: <https://github.com/quickemu-project/quickemu>
|
||||||
|
|
||||||
quickemu_conf(1), quickget(1), quickgui(1)
|
quickemu_conf(5), quickget(1), quickgui(1)
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
.\" Automatically generated by Pandoc 3.1.9
|
.\" Automatically generated by Pandoc 3.6.1
|
||||||
.\"
|
.\"
|
||||||
.TH "QUICKEMU_CONF" "1" "November 26, 2023" "quickemu_conf" "Quickemu Configuration Manual"
|
.TH "QUICKEMU_CONF" "5" "December 30, 2024" "quickemu_conf" "Quickemu Configuration Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
quickemu_conf - Options and parameters in the quickemu <vm>.conf
|
quickemu_conf \- Options and parameters in the quickemu <vm>.conf
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
\f[B]quickemu\f[R] will create and run highly optimised desktop virtual
|
\f[B]quickemu\f[R] will create and run highly optimised desktop virtual
|
||||||
machines for Linux, macOS and Windows.
|
machines for Linux, macOS and Windows.
|
||||||
|
@ -50,7 +50,7 @@ serial_telnet_host=\[dq]localhost\[dq]
|
||||||
usb_controller=\[dq]ehci\[dq]
|
usb_controller=\[dq]ehci\[dq]
|
||||||
# options: ps2, usb, virtio
|
# options: ps2, usb, virtio
|
||||||
keyboard=\[dq]usb\[dq]
|
keyboard=\[dq]usb\[dq]
|
||||||
keyboard_layout=\[dq]en-us\[dq]
|
keyboard_layout=\[dq]en\-us\[dq]
|
||||||
# options: ps2, usb, tablet, virtio
|
# options: ps2, usb, tablet, virtio
|
||||||
mouse=\[dq]tablet\[dq]
|
mouse=\[dq]tablet\[dq]
|
||||||
.EE
|
.EE
|
||||||
|
@ -58,16 +58,16 @@ mouse=\[dq]tablet\[dq]
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
guest_os=\[dq]linux\[dq]
|
guest_os=\[dq]linux\[dq]
|
||||||
disk_img=\[dq]debian-bullseye/disk.qcow2\[dq]
|
disk_img=\[dq]debian\-bullseye/disk.qcow2\[dq]
|
||||||
iso=\[dq]debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso\[dq]
|
iso=\[dq]debian\-bullseye/firmware\-11.0.0\-amd64\-DVD\-1.iso\[dq]
|
||||||
.EE
|
.EE
|
||||||
.PP
|
.PP
|
||||||
The default macOS configuration looks like this:
|
The default macOS configuration looks like this:
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
guest_os=\[dq]macos\[dq]
|
guest_os=\[dq]macos\[dq]
|
||||||
img=\[dq]macos-catalina/RecoveryImage.img\[dq]
|
img=\[dq]macos\-catalina/RecoveryImage.img\[dq]
|
||||||
disk_img=\[dq]macos-catalina/disk.qcow2\[dq]
|
disk_img=\[dq]macos\-catalina/disk.qcow2\[dq]
|
||||||
macos_release=\[dq]catalina\[dq]
|
macos_release=\[dq]catalina\[dq]
|
||||||
.EE
|
.EE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -89,9 +89,9 @@ The default Windows 11 configuration looks like this:
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
guest_os=\[dq]windows\[dq]
|
guest_os=\[dq]windows\[dq]
|
||||||
disk_img=\[dq]windows-11/disk.qcow2\[dq]
|
disk_img=\[dq]windows\-11/disk.qcow2\[dq]
|
||||||
iso=\[dq]windows-11/Win11_EnglishInternational_x64.iso\[dq]
|
iso=\[dq]windows\-11/Win11_EnglishInternational_x64.iso\[dq]
|
||||||
fixed_iso=\[dq]windows-11/virtio-win.iso\[dq]
|
fixed_iso=\[dq]windows\-11/virtio\-win.iso\[dq]
|
||||||
tpm=\[dq]on\[dq]
|
tpm=\[dq]on\[dq]
|
||||||
secureboot=\[dq]on\[dq]
|
secureboot=\[dq]on\[dq]
|
||||||
.EE
|
.EE
|
||||||
|
@ -104,13 +104,13 @@ drivers.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]tpm=\[dq]on\[dq]\f[R] instructs \f[CR]quickemu\f[R] to create a
|
\f[CR]tpm=\[dq]on\[dq]\f[R] instructs \f[CR]quickemu\f[R] to create a
|
||||||
software emulated TPM device using \f[CR]swtpm\f[R].
|
software emulated TPM device using \f[CR]swtpm\f[R].
|
||||||
.SH BIOS and EFI
|
.SS BIOS and EFI
|
||||||
Since Quickemu 2.1.0 \f[CR]efi\f[R] is the default boot option.
|
Since Quickemu 2.1.0 \f[CR]efi\f[R] is the default boot option.
|
||||||
If you want to override this behaviour then add the following line to
|
If you want to override this behaviour then add the following line to
|
||||||
you VM configuration to enable legacy BIOS.
|
you VM configuration to enable legacy BIOS.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]boot=\[dq]legacy\[dq]\f[R] - Enable Legacy BIOS boot
|
\f[CR]boot=\[dq]legacy\[dq]\f[R] \- Enable Legacy BIOS boot
|
||||||
.SH Tuning CPU cores, RAM & disks
|
.SS Tuning CPU cores, RAM & disks
|
||||||
By default, Quickemu will calculate the number of CPUs cores and RAM to
|
By default, Quickemu will calculate the number of CPUs cores and RAM to
|
||||||
allocate to a VM based on the specifications of your host computer.
|
allocate to a VM based on the specifications of your host computer.
|
||||||
You can override this default behaviour and tune the VM configuration to
|
You can override this default behaviour and tune the VM configuration to
|
||||||
|
@ -118,13 +118,13 @@ your liking.
|
||||||
.PP
|
.PP
|
||||||
Add additional lines to your virtual machine configuration:
|
Add additional lines to your virtual machine configuration:
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]cpu_cores=\[dq]4\[dq]\f[R] - Specify the number of CPU cores
|
\f[CR]cpu_cores=\[dq]4\[dq]\f[R] \- Specify the number of CPU cores
|
||||||
allocated to the VM
|
allocated to the VM
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ram=\[dq]4G\[dq]\f[R] - Specify the amount of RAM to allocate to
|
\f[CR]ram=\[dq]4G\[dq]\f[R] \- Specify the amount of RAM to allocate to
|
||||||
the VM
|
the VM
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]disk_size=\[dq]16G\[dq]\f[R] - Specify the size of the virtual
|
\f[CR]disk_size=\[dq]16G\[dq]\f[R] \- Specify the size of the virtual
|
||||||
disk allocated to the VM
|
disk allocated to the VM
|
||||||
.SS Disk preallocation
|
.SS Disk preallocation
|
||||||
Preallocation mode (allowed values: \f[CR]off\f[R] (default),
|
Preallocation mode (allowed values: \f[CR]off\f[R] (default),
|
||||||
|
@ -137,32 +137,32 @@ the system disk image by adding a line like this to your VM
|
||||||
configuration.
|
configuration.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]preallocation=\[dq]metadata\[dq]\f[R]
|
\f[CR]preallocation=\[dq]metadata\[dq]\f[R]
|
||||||
.SS CD-ROM disks
|
.SS CD\-ROM disks
|
||||||
If you want to expose an ISO image from the host to guest add the
|
If you want to expose an ISO image from the host to guest add the
|
||||||
following line to the VM configuration:
|
following line to the VM configuration:
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]fixed_iso=\[dq]/path/to/image.iso\[dq]\f[R]
|
\f[CR]fixed_iso=\[dq]/path/to/image.iso\[dq]\f[R]
|
||||||
.SS Floppy disks
|
.SS Floppy disks
|
||||||
If you\[cq]re like \c
|
If you\[aq]re like \c
|
||||||
.UR https://popey.com
|
.UR https://popey.com
|
||||||
Alan Pope
|
Alan Pope
|
||||||
.UE \c
|
.UE \c
|
||||||
\ you\[cq]ll probably want to mount a floppy disk image in the guest.
|
\ you\[aq]ll probably want to mount a floppy disk image in the guest.
|
||||||
To do so add the following line to the VM configuration:
|
To do so add the following line to the VM configuration:
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]floppy=\[dq]/path/to/floppy.img\[dq]\f[R]
|
\f[CR]floppy=\[dq]/path/to/floppy.img\[dq]\f[R]
|
||||||
.SH File Sharing
|
.SS File Sharing
|
||||||
All File Sharing options will only expose \f[CR]\[ti]/Public\f[R] (or
|
All File Sharing options will only expose \f[CR]\[ti]/Public\f[R] (or
|
||||||
localised variations) for the current user to the guest VMs.
|
localised variations) for the current user to the guest VMs.
|
||||||
.SS Samba 🐧 🍏 🪟
|
.SS Samba 🐧 🍏 🪟
|
||||||
If \f[CR]smbd\f[R] is available on the host, Quickemu will automatically
|
If \f[CR]smbd\f[R] is available on the host, Quickemu will automatically
|
||||||
enable the built-in QEMU support for exposing a Samba share from the
|
enable the built\-in QEMU support for exposing a Samba share from the
|
||||||
host to the guest.
|
host to the guest.
|
||||||
.PP
|
.PP
|
||||||
You can install the minimal Samba components on Ubuntu using:
|
You can install the minimal Samba components on Ubuntu using:
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
sudo apt install --no-install-recommends samba
|
sudo apt install \-\-no\-install\-recommends samba
|
||||||
.EE
|
.EE
|
||||||
.PP
|
.PP
|
||||||
If everything is set up correctly, the \f[CR]smbd\f[R] address will be
|
If everything is set up correctly, the \f[CR]smbd\f[R] address will be
|
||||||
|
@ -170,20 +170,21 @@ printed when the virtual machine is started.
|
||||||
For example:
|
For example:
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
- smbd: On guest: smb://10.0.2.4/qemu
|
\- smbd: On guest: smb://10.0.2.4/qemu
|
||||||
.EE
|
.EE
|
||||||
.PP
|
.PP
|
||||||
If using a Windows guest, right-click on \[lq]This PC\[rq], click
|
If using a Windows guest, right\-click on \[dq]This PC\[dq], click
|
||||||
\[lq]Add a network location\[rq], and paste this address, removing
|
\[dq]Add a network location\[dq], and paste this address, removing
|
||||||
\f[CR]smb:\f[R] and replacing forward slashes with backslashes (in this
|
\f[CR]smb:\f[R] and replacing forward slashes with backslashes (in this
|
||||||
example \f[CR]\[rs]\[rs]10.0.2.4\[rs]qemu\f[R]).
|
example \f[CR]\[rs]\[rs]10.0.2.4\[rs]qemu\f[R]).
|
||||||
.SS SPICE WebDAV 🐧 🪟
|
.SS SPICE WebDAV 🐧 🪟
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
TBD
|
TBD
|
||||||
.SS VirtIO-9P 🐧 🍏
|
.SS VirtIO\-9P 🐧 🍏
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
TBD
|
TBD
|
||||||
.SH Network port forwarding
|
.SS Networking
|
||||||
|
.SS Port forwarding
|
||||||
Add an additional line to your virtual machine configuration.
|
Add an additional line to your virtual machine configuration.
|
||||||
For example:
|
For example:
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -194,12 +195,12 @@ In the example above:
|
||||||
Port 8123 on the host is forwarded to port 8123 on the guest.
|
Port 8123 on the host is forwarded to port 8123 on the guest.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Port 8888 on the host is forwarded to port 80 on the guest.
|
Port 8888 on the host is forwarded to port 80 on the guest.
|
||||||
.SH Disable networking
|
.SS Disable networking
|
||||||
To completely disable all network interfaces in a guest VM add this
|
To completely disable all network interfaces in a guest VM add this
|
||||||
additional line to your virtual machine configuration:
|
additional line to your virtual machine configuration:
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]network=\[dq]none\[dq]\f[R]
|
\f[CR]network=\[dq]none\[dq]\f[R]
|
||||||
.SH Restricted networking
|
.SS Restricted networking
|
||||||
You can isolate the guest from the host (and broader network) using the
|
You can isolate the guest from the host (and broader network) using the
|
||||||
restrict option, which will restrict networking to just the guest and
|
restrict option, which will restrict networking to just the guest and
|
||||||
any virtual devices.
|
any virtual devices.
|
||||||
|
@ -209,7 +210,7 @@ phoning home while still providing a network inside the guest.
|
||||||
Add this additional line to your virtual machine configuration:
|
Add this additional line to your virtual machine configuration:
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]network=\[dq]restrict\[dq]\f[R]
|
\f[CR]network=\[dq]restrict\[dq]\f[R]
|
||||||
.SH Bridged networking
|
.SS Bridged networking
|
||||||
Connect your virtual machine to a preconfigured network bridge.
|
Connect your virtual machine to a preconfigured network bridge.
|
||||||
Add an additional line to your virtual machine configuration:
|
Add an additional line to your virtual machine configuration:
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -219,21 +220,76 @@ If you want to have a persistent MAC address for your bridged network
|
||||||
interface in the guest VM you can add \f[CR]macaddr\f[R] to the virtual
|
interface in the guest VM you can add \f[CR]macaddr\f[R] to the virtual
|
||||||
machine configuration.
|
machine configuration.
|
||||||
QEMU requires that the MAC address is in the range:
|
QEMU requires that the MAC address is in the range:
|
||||||
\f[B]52:54:00:AB:00:00 - 52:54:00:AB:FF:FF\f[R]
|
\f[B]52:54:00:AB:00:00 \- 52:54:00:AB:FF:FF\f[R]
|
||||||
.PP
|
.PP
|
||||||
So you can generate your own MAC addresses with:
|
So you can generate your own MAC addresses with:
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]macaddr=\[dq]52:54:00:AB:51:AE\[dq]\f[R]
|
\f[CR]macaddr=\[dq]52:54:00:AB:51:AE\[dq]\f[R]
|
||||||
.SH USB redirection
|
.SS USB redirection
|
||||||
Quickemu supports USB redirection via SPICE pass-through and host
|
Quickemu supports USB redirection via SPICE pass\-through and host
|
||||||
pass-through.
|
pass\-through.
|
||||||
|
Quickemu supports USB redirection via SPICE pass\-through and host
|
||||||
|
pass\-through.
|
||||||
|
.PP
|
||||||
|
\f[B]NOTE!\f[R] When a USB device is redirected from the host, it will
|
||||||
|
not be usable by host operating system until the guest redirection is
|
||||||
|
stopped.
|
||||||
|
Therefore, do not redirect the input devices, such as the keyboard and
|
||||||
|
mouse, as it will be difficult (or impossible) to revert the situation.
|
||||||
.SS SPICE redirection (recommended)
|
.SS SPICE redirection (recommended)
|
||||||
Using SPICE for USB pass-through is easiest as it doesn\[cq]t require
|
Using SPICE for USB pass\-through is easiest as it doesn\[aq]t require
|
||||||
any elevated permission, start Quickemu with \f[CR]--display spice\f[R]
|
any elevated permission:
|
||||||
and then select \f[CR]Input\f[R] ->
|
.PP
|
||||||
|
Both \f[CR]spicy\f[R] from \c
|
||||||
|
.UR https://www.spice-space.org/spice-gtk.html
|
||||||
|
spice\-gtk
|
||||||
|
.UE \c
|
||||||
|
\ (\f[I]Input \-> Select USB Devices for redirection\f[R]) and
|
||||||
|
\f[CR]remote\-viewer\f[R] from \c
|
||||||
|
.UR https://gitlab.com/virt-viewer/virt-viewer
|
||||||
|
virt\-viewer
|
||||||
|
.UE \c
|
||||||
|
\ (\f[I]File \-> USB device selection\f[R]) support this feature.
|
||||||
|
.IP \[bu] 2
|
||||||
|
Start Quickemu with \f[CR]\-\-display spice\f[R] and then
|
||||||
|
.IP \[bu] 2
|
||||||
|
Select \f[CR]Input\f[R] \-> \f[CR]Select USB Device for redirection\f[R]
|
||||||
|
from the menu to choose which device(s) you want to attach to the guest.
|
||||||
|
.IP \[bu] 2
|
||||||
|
**\f[CR]spicy\f[R] (default)
|
||||||
|
.RS 2
|
||||||
|
.IP \[bu] 2
|
||||||
|
**Select \f[CR]Input\f[R] \->
|
||||||
\f[CR]Select USB Device for redirection\f[R] from the menu to choose
|
\f[CR]Select USB Device for redirection\f[R] from the menu to choose
|
||||||
which device(s) you want to attach to the guest.
|
which device(s) you want to attach to the guest.
|
||||||
.SS Host redirection \f[B]NOT Recommended\f[R]
|
.RE
|
||||||
|
.IP \[bu] 2
|
||||||
|
**\f[CR]remote\-viewer\f[R]
|
||||||
|
.RS 2
|
||||||
|
.IP \[bu] 2
|
||||||
|
**Select \f[CR]File\f[R] \-> \f[CR]USB device selection\f[R] from the
|
||||||
|
menu to choose which device(s) you want to attach to the guest.
|
||||||
|
.RE
|
||||||
|
.PP
|
||||||
|
To ensure that this functionality works as expected, make sure that you
|
||||||
|
have installed the necessary SPICE Guest Tools on the virtual machine.
|
||||||
|
.SS Enabling SPICE redirection on NixOS
|
||||||
|
On NixOS, if you encounter this error:
|
||||||
|
.IP
|
||||||
|
.EX
|
||||||
|
Error setting facl: Operation not permitted
|
||||||
|
.EE
|
||||||
|
.PP
|
||||||
|
Try setting \c
|
||||||
|
.UR https://search.nixos.org/options?channel=23.11&show=virtualisation.spiceUSBRedirection.enable&from=0&size=50&sort=relevance&type=packages&query=spiceusbredirec
|
||||||
|
the following option
|
||||||
|
.UE \c
|
||||||
|
:
|
||||||
|
.IP
|
||||||
|
.EX
|
||||||
|
virtualisation.spiceUSBRedirection.enable = true;
|
||||||
|
.EE
|
||||||
|
.SS Host redirection (\f[B]NOT Recommended\f[R])
|
||||||
\f[B]USB host redirection is not recommended\f[R], it is provided purely
|
\f[B]USB host redirection is not recommended\f[R], it is provided purely
|
||||||
for backwards compatibility to older versions of Quickemu.
|
for backwards compatibility to older versions of Quickemu.
|
||||||
Using SPICE is preferred, see above.
|
Using SPICE is preferred, see above.
|
||||||
|
@ -256,12 +312,12 @@ the appropriate commands to modify the USB device(s) access permissions,
|
||||||
like this:
|
like this:
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
- USB: Host pass-through requested:
|
\- USB: Host pass\-through requested:
|
||||||
- Sennheiser Communications EPOS GTW 270 on bus 001 device 005 needs permission changes:
|
\- Sennheiser Communications EPOS GTW 270 on bus 001 device 005 needs permission changes:
|
||||||
sudo chown -v root:user /dev/bus/usb/001/005
|
sudo chown \-v root:user /dev/bus/usb/001/005
|
||||||
ERROR! USB permission changes are required 👆
|
ERROR! USB permission changes are required 👆
|
||||||
.EE
|
.EE
|
||||||
.SH TPM
|
.SS TPM
|
||||||
Since Quickemu 2.2.0 a software emulated TPM device can be added to
|
Since Quickemu 2.2.0 a software emulated TPM device can be added to
|
||||||
guest virtual machines.
|
guest virtual machines.
|
||||||
Just add \f[CR]tpm=\[dq]on\[dq]\f[R] to your VM configuration.
|
Just add \f[CR]tpm=\[dq]on\[dq]\f[R] to your VM configuration.
|
|
@ -1,9 +1,9 @@
|
||||||
---
|
---
|
||||||
author: Martin Wimpress
|
author: Martin Wimpress
|
||||||
date: November 26, 2023
|
date: December 30, 2024
|
||||||
footer: quickemu_conf
|
footer: quickemu_conf
|
||||||
header: Quickemu Configuration Manual
|
header: Quickemu Configuration Manual
|
||||||
section: 1
|
section: 5
|
||||||
title: QUICKEMU_CONF
|
title: QUICKEMU_CONF
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ installation ISO and QEMU disk for the installed VM
|
||||||
|
|
||||||
These are the options and defaults for the \<vm\>.conf file
|
These are the options and defaults for the \<vm\>.conf file
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
# Lowercase variables are used in the VM config file only
|
# Lowercase variables are used in the VM config file only
|
||||||
boot="efi"
|
boot="efi"
|
||||||
cpu_cores=""
|
cpu_cores=""
|
||||||
|
@ -67,7 +67,7 @@ mouse="tablet"
|
||||||
|
|
||||||
# EXAMPLES
|
# EXAMPLES
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
guest_os="linux"
|
guest_os="linux"
|
||||||
disk_img="debian-bullseye/disk.qcow2"
|
disk_img="debian-bullseye/disk.qcow2"
|
||||||
iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
|
iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
|
||||||
|
@ -75,7 +75,7 @@ iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
|
||||||
|
|
||||||
The default macOS configuration looks like this:
|
The default macOS configuration looks like this:
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
guest_os="macos"
|
guest_os="macos"
|
||||||
img="macos-catalina/RecoveryImage.img"
|
img="macos-catalina/RecoveryImage.img"
|
||||||
disk_img="macos-catalina/disk.qcow2"
|
disk_img="macos-catalina/disk.qcow2"
|
||||||
|
@ -85,14 +85,14 @@ macos_release="catalina"
|
||||||
- `guest_os="macos"` instructs Quickemu to optimise for macOS.
|
- `guest_os="macos"` instructs Quickemu to optimise for macOS.
|
||||||
- `macos_release="catalina"` instructs Quickemu to optimise for a
|
- `macos_release="catalina"` instructs Quickemu to optimise for a
|
||||||
particular macOS release.
|
particular macOS release.
|
||||||
- For example VirtIO Network and Memory Ballooning are available
|
- For example VirtIO Network and Memory Ballooning are available in
|
||||||
in Big Sur and newer, but not previous releases.
|
Big Sur and newer, but not previous releases.
|
||||||
- And VirtIO Block Media (disks) are supported/stable in Catalina
|
- And VirtIO Block Media (disks) are supported/stable in Catalina and
|
||||||
and newer.
|
newer.
|
||||||
|
|
||||||
The default Windows 11 configuration looks like this:
|
The default Windows 11 configuration looks like this:
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
guest_os="windows"
|
guest_os="windows"
|
||||||
disk_img="windows-11/disk.qcow2"
|
disk_img="windows-11/disk.qcow2"
|
||||||
iso="windows-11/Win11_EnglishInternational_x64.iso"
|
iso="windows-11/Win11_EnglishInternational_x64.iso"
|
||||||
|
@ -106,7 +106,7 @@ secureboot="on"
|
||||||
- `tpm="on"` instructs `quickemu` to create a software emulated TPM
|
- `tpm="on"` instructs `quickemu` to create a software emulated TPM
|
||||||
device using `swtpm`.
|
device using `swtpm`.
|
||||||
|
|
||||||
# BIOS and EFI
|
### BIOS and EFI
|
||||||
|
|
||||||
Since Quickemu 2.1.0 `efi` is the default boot option. If you want to
|
Since Quickemu 2.1.0 `efi` is the default boot option. If you want to
|
||||||
override this behaviour then add the following line to you VM
|
override this behaviour then add the following line to you VM
|
||||||
|
@ -114,7 +114,7 @@ configuration to enable legacy BIOS.
|
||||||
|
|
||||||
- `boot="legacy"` - Enable Legacy BIOS boot
|
- `boot="legacy"` - Enable Legacy BIOS boot
|
||||||
|
|
||||||
# Tuning CPU cores, RAM & disks
|
### Tuning CPU cores, RAM & disks
|
||||||
|
|
||||||
By default, Quickemu will calculate the number of CPUs cores and RAM to
|
By default, Quickemu will calculate the number of CPUs cores and RAM to
|
||||||
allocate to a VM based on the specifications of your host computer. You
|
allocate to a VM based on the specifications of your host computer. You
|
||||||
|
@ -123,13 +123,12 @@ your liking.
|
||||||
|
|
||||||
Add additional lines to your virtual machine configuration:
|
Add additional lines to your virtual machine configuration:
|
||||||
|
|
||||||
- `cpu_cores="4"` - Specify the number of CPU cores allocated to the
|
- `cpu_cores="4"` - Specify the number of CPU cores allocated to the VM
|
||||||
VM
|
|
||||||
- `ram="4G"` - Specify the amount of RAM to allocate to the VM
|
- `ram="4G"` - Specify the amount of RAM to allocate to the VM
|
||||||
- `disk_size="16G"` - Specify the size of the virtual disk allocated
|
- `disk_size="16G"` - Specify the size of the virtual disk allocated to
|
||||||
to the VM
|
the VM
|
||||||
|
|
||||||
## Disk preallocation
|
### Disk preallocation
|
||||||
|
|
||||||
Preallocation mode (allowed values: `off` (default), `metadata`,
|
Preallocation mode (allowed values: `off` (default), `metadata`,
|
||||||
`falloc`, `full`). An image with preallocated metadata is initially
|
`falloc`, `full`). An image with preallocated metadata is initially
|
||||||
|
@ -141,14 +140,14 @@ configuration.
|
||||||
|
|
||||||
- `preallocation="metadata"`
|
- `preallocation="metadata"`
|
||||||
|
|
||||||
## CD-ROM disks
|
### CD-ROM disks
|
||||||
|
|
||||||
If you want to expose an ISO image from the host to guest add the
|
If you want to expose an ISO image from the host to guest add the
|
||||||
following line to the VM configuration:
|
following line to the VM configuration:
|
||||||
|
|
||||||
- `fixed_iso="/path/to/image.iso"`
|
- `fixed_iso="/path/to/image.iso"`
|
||||||
|
|
||||||
## Floppy disks
|
### Floppy disks
|
||||||
|
|
||||||
If you're like [Alan Pope](https://popey.com) you'll probably want to
|
If you're like [Alan Pope](https://popey.com) you'll probably want to
|
||||||
mount a floppy disk image in the guest. To do so add the following line
|
mount a floppy disk image in the guest. To do so add the following line
|
||||||
|
@ -156,12 +155,12 @@ to the VM configuration:
|
||||||
|
|
||||||
- `floppy="/path/to/floppy.img"`
|
- `floppy="/path/to/floppy.img"`
|
||||||
|
|
||||||
# File Sharing
|
### File Sharing
|
||||||
|
|
||||||
All File Sharing options will only expose `~/Public` (or localised
|
All File Sharing options will only expose `~/Public` (or localised
|
||||||
variations) for the current user to the guest VMs.
|
variations) for the current user to the guest VMs.
|
||||||
|
|
||||||
## Samba 🐧 🍏 🪟
|
#### Samba 🐧 🍏 🪟
|
||||||
|
|
||||||
If `smbd` is available on the host, Quickemu will automatically enable
|
If `smbd` is available on the host, Quickemu will automatically enable
|
||||||
the built-in QEMU support for exposing a Samba share from the host to
|
the built-in QEMU support for exposing a Samba share from the host to
|
||||||
|
@ -169,7 +168,7 @@ the guest.
|
||||||
|
|
||||||
You can install the minimal Samba components on Ubuntu using:
|
You can install the minimal Samba components on Ubuntu using:
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
sudo apt install --no-install-recommends samba
|
sudo apt install --no-install-recommends samba
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -182,15 +181,17 @@ If using a Windows guest, right-click on "This PC", click "Add a network
|
||||||
location", and paste this address, removing `smb:` and replacing forward
|
location", and paste this address, removing `smb:` and replacing forward
|
||||||
slashes with backslashes (in this example `\\10.0.2.4\qemu`).
|
slashes with backslashes (in this example `\\10.0.2.4\qemu`).
|
||||||
|
|
||||||
## SPICE WebDAV 🐧 🪟
|
#### SPICE WebDAV 🐧 🪟
|
||||||
|
|
||||||
- TBD
|
- TBD
|
||||||
|
|
||||||
## VirtIO-9P 🐧 🍏
|
#### VirtIO-9P 🐧 🍏
|
||||||
|
|
||||||
- TBD
|
- TBD
|
||||||
|
|
||||||
# Network port forwarding
|
### Networking
|
||||||
|
|
||||||
|
#### Port forwarding
|
||||||
|
|
||||||
Add an additional line to your virtual machine configuration. For
|
Add an additional line to your virtual machine configuration. For
|
||||||
example:
|
example:
|
||||||
|
@ -202,14 +203,14 @@ In the example above:
|
||||||
- Port 8123 on the host is forwarded to port 8123 on the guest.
|
- Port 8123 on the host is forwarded to port 8123 on the guest.
|
||||||
- Port 8888 on the host is forwarded to port 80 on the guest.
|
- Port 8888 on the host is forwarded to port 80 on the guest.
|
||||||
|
|
||||||
# Disable networking
|
#### Disable networking
|
||||||
|
|
||||||
To completely disable all network interfaces in a guest VM add this
|
To completely disable all network interfaces in a guest VM add this
|
||||||
additional line to your virtual machine configuration:
|
additional line to your virtual machine configuration:
|
||||||
|
|
||||||
- `network="none"`
|
- `network="none"`
|
||||||
|
|
||||||
# Restricted networking
|
#### Restricted networking
|
||||||
|
|
||||||
You can isolate the guest from the host (and broader network) using the
|
You can isolate the guest from the host (and broader network) using the
|
||||||
restrict option, which will restrict networking to just the guest and
|
restrict option, which will restrict networking to just the guest and
|
||||||
|
@ -221,7 +222,7 @@ additional line to your virtual machine configuration:
|
||||||
|
|
||||||
- `network="restrict"`
|
- `network="restrict"`
|
||||||
|
|
||||||
# Bridged networking
|
#### Bridged networking
|
||||||
|
|
||||||
Connect your virtual machine to a preconfigured network bridge. Add an
|
Connect your virtual machine to a preconfigured network bridge. Add an
|
||||||
additional line to your virtual machine configuration:
|
additional line to your virtual machine configuration:
|
||||||
|
@ -237,19 +238,55 @@ So you can generate your own MAC addresses with:
|
||||||
|
|
||||||
- `macaddr="52:54:00:AB:51:AE"`
|
- `macaddr="52:54:00:AB:51:AE"`
|
||||||
|
|
||||||
# USB redirection
|
### USB redirection
|
||||||
|
|
||||||
Quickemu supports USB redirection via SPICE pass-through and host
|
Quickemu supports USB redirection via SPICE pass-through and host
|
||||||
pass-through.
|
pass-through. Quickemu supports USB redirection via SPICE pass-through
|
||||||
|
and host pass-through.
|
||||||
|
|
||||||
## SPICE redirection (recommended)
|
**NOTE!** When a USB device is redirected from the host, it will not be
|
||||||
|
usable by host operating system until the guest redirection is stopped.
|
||||||
|
Therefore, do not redirect the input devices, such as the keyboard and
|
||||||
|
mouse, as it will be difficult (or impossible) to revert the situation.
|
||||||
|
|
||||||
|
#### SPICE redirection (recommended)
|
||||||
|
|
||||||
Using SPICE for USB pass-through is easiest as it doesn't require any
|
Using SPICE for USB pass-through is easiest as it doesn't require any
|
||||||
elevated permission, start Quickemu with `--display spice` and then
|
elevated permission:
|
||||||
select `Input` -\> `Select USB Device for redirection` from the menu to
|
|
||||||
choose which device(s) you want to attach to the guest.
|
|
||||||
|
|
||||||
## Host redirection **NOT Recommended**
|
Both `spicy` from
|
||||||
|
[spice-gtk](https://www.spice-space.org/spice-gtk.html) (*Input -\>
|
||||||
|
Select USB Devices for redirection*) and `remote-viewer` from
|
||||||
|
[virt-viewer](https://gitlab.com/virt-viewer/virt-viewer) (*File -\> USB
|
||||||
|
device selection*) support this feature.
|
||||||
|
|
||||||
|
- Start Quickemu with `--display spice` and then
|
||||||
|
- Select `Input` -\> `Select USB Device for redirection` from the menu
|
||||||
|
to choose which device(s) you want to attach to the guest.
|
||||||
|
- \*\*`spicy` (default)
|
||||||
|
- \*\*Select `Input` -\> `Select USB Device for redirection` from the
|
||||||
|
menu to choose which device(s) you want to attach to the guest.
|
||||||
|
- \*\*`remote-viewer`
|
||||||
|
- \*\*Select `File` -\> `USB device selection` from the menu to choose
|
||||||
|
which device(s) you want to attach to the guest.
|
||||||
|
|
||||||
|
To ensure that this functionality works as expected, make sure that you
|
||||||
|
have installed the necessary SPICE Guest Tools on the virtual machine.
|
||||||
|
|
||||||
|
##### Enabling SPICE redirection on NixOS
|
||||||
|
|
||||||
|
On NixOS, if you encounter this error:
|
||||||
|
|
||||||
|
Error setting facl: Operation not permitted
|
||||||
|
|
||||||
|
Try setting [the following
|
||||||
|
option](https://search.nixos.org/options?channel=23.11&show=virtualisation.spiceUSBRedirection.enable&from=0&size=50&sort=relevance&type=packages&query=spiceusbredirec):
|
||||||
|
|
||||||
|
``` nix
|
||||||
|
virtualisation.spiceUSBRedirection.enable = true;
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Host redirection (**NOT Recommended**)
|
||||||
|
|
||||||
**USB host redirection is not recommended**, it is provided purely for
|
**USB host redirection is not recommended**, it is provided purely for
|
||||||
backwards compatibility to older versions of Quickemu. Using SPICE is
|
backwards compatibility to older versions of Quickemu. Using SPICE is
|
||||||
|
@ -262,10 +299,10 @@ example:
|
||||||
|
|
||||||
In the example above:
|
In the example above:
|
||||||
|
|
||||||
- The USB device with vendor_id 046d and product_id 082d will be
|
- The USB device with vendor_id 046d and product_id 082d will be exposed
|
||||||
exposed to the guest.
|
to the guest.
|
||||||
- The USB device with vendor_id 046d and product_id 085e will be
|
- The USB device with vendor_id 046d and product_id 085e will be exposed
|
||||||
exposed to the guest.
|
to the guest.
|
||||||
|
|
||||||
If the USB devices are not writable, `quickemu` will display the
|
If the USB devices are not writable, `quickemu` will display the
|
||||||
appropriate commands to modify the USB device(s) access permissions,
|
appropriate commands to modify the USB device(s) access permissions,
|
||||||
|
@ -276,7 +313,7 @@ like this:
|
||||||
sudo chown -v root:user /dev/bus/usb/001/005
|
sudo chown -v root:user /dev/bus/usb/001/005
|
||||||
ERROR! USB permission changes are required 👆
|
ERROR! USB permission changes are required 👆
|
||||||
|
|
||||||
# TPM
|
### TPM
|
||||||
|
|
||||||
Since Quickemu 2.2.0 a software emulated TPM device can be added to
|
Since Quickemu 2.2.0 a software emulated TPM device can be added to
|
||||||
guest virtual machines. Just add `tpm="on"` to your VM configuration.
|
guest virtual machines. Just add `tpm="on"` to your VM configuration.
|
379
docs/quickget.1
379
docs/quickget.1
|
@ -1,8 +1,8 @@
|
||||||
.\" Automatically generated by Pandoc 3.1.9
|
.\" Automatically generated by Pandoc 3.6.1
|
||||||
.\"
|
.\"
|
||||||
.TH "QUICKGET" "1" "November 26, 2023" "quickget" "Quickget User Manual"
|
.TH "QUICKGET" "1" "December 30, 2024" "quickget" "Quickget User Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
quickget - download and prepare materials for building a quickemu VM
|
quickget \- download and prepare materials for building a quickemu VM
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
\f[B]quickget\f[R] [\f[I]os\f[R]] [\f[I]release\f[R]]
|
\f[B]quickget\f[R] [\f[I]os\f[R]] [\f[I]release\f[R]]
|
||||||
[\f[I]edition\f[R]] | [\f[I]OPTION\f[R]]*
|
[\f[I]edition\f[R]] | [\f[I]OPTION\f[R]]*
|
||||||
|
@ -11,70 +11,95 @@ quickget - download and prepare materials for building a quickemu VM
|
||||||
configuration for \f[CR]quickemu\f[R] to use to build and run
|
configuration for \f[CR]quickemu\f[R] to use to build and run
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.TP
|
.TP
|
||||||
\f[B]version | -version | \[en]version\f[R]
|
|
||||||
show version (from Quickemu)
|
|
||||||
.TP
|
|
||||||
\f[B]list | list_csv | list_json\f[R]
|
|
||||||
provide a csv list of all supported guest OSes, versions and variants.
|
|
||||||
.TP
|
|
||||||
\f[B]\f[CB]--show-iso-url\f[B] | -s\f[R] {\f[B]os\f[R]} {\f[B]release\f[R]} [\f[B]edition\f[R]]
|
|
||||||
show ISO download URL
|
|
||||||
.TP
|
|
||||||
\f[B]\f[CB]--test-iso-url\f[B] | -t\f[R] {\f[B]os\f[R]} {\f[B]release\f[R]} [\f[B]edition\f[R]]
|
|
||||||
test if ISO is available
|
|
||||||
.TP
|
|
||||||
\f[B]\f[CB]--open-distro-homepage\f[B] | -o\f[R] {\f[B]os\f[R]}
|
|
||||||
open OS homepage in browser
|
|
||||||
.TP
|
|
||||||
\f[B][OS] [Release] [Edition]\f[R]
|
\f[B][OS] [Release] [Edition]\f[R]
|
||||||
specify the OS and release (and optional edition) if insufficient input
|
specify the OS and release (and optional edition) if insufficient input
|
||||||
is provided a list of missing options will be reported and the script
|
is provided a list of missing options will be reported and the script
|
||||||
will exit.
|
will exit.
|
||||||
Editions may not apply and will be defaulted if not provided.
|
Editions may not apply and will be defaulted if not provided.
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-download\f[R] [edition]
|
||||||
|
Download image; no VM configuration
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-create\-config\f[R] [path/url]
|
||||||
|
Create VM config for a OS image
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-open\-homepage\f[R]
|
||||||
|
Open homepage for the OS
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-show\f[R] [os]
|
||||||
|
Show OS information
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-url\f[R] [os] [release] [edition]
|
||||||
|
Show image URL(s)
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-check\f[R] [os] [release] [edition]
|
||||||
|
Check image URL(s)
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-list\f[R]
|
||||||
|
List all supported systems
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-list\-csv\f[R]
|
||||||
|
List everything in csv format
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-list\-json\f[R]
|
||||||
|
List everything in json format
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-version\f[R]
|
||||||
|
Show version
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-help\f[R]
|
||||||
|
Show this help message
|
||||||
.SH NOTES
|
.SH NOTES
|
||||||
.SS Ubuntu Guest
|
.SS Creating Linux guests 🐧
|
||||||
|
.SS Ubuntu
|
||||||
\f[CR]quickget\f[R] will automatically download an Ubuntu release and
|
\f[CR]quickget\f[R] will automatically download an Ubuntu release and
|
||||||
create the virtual machine configuration.
|
create the virtual machine configuration.
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
quickget ubuntu 22.04
|
quickget ubuntu 22.04
|
||||||
quickemu --vm ubuntu-22.04.conf
|
quickemu \-\-vm ubuntu\-22.04.conf
|
||||||
.EE
|
.EE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Complete the installation as normal.
|
Complete the installation as normal.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Post-install:
|
Post\-install:
|
||||||
.RS 2
|
.RS 2
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Install the SPICE agent (\f[CR]spice-vdagent\f[R]) in the guest to
|
Install the SPICE agent (\f[CR]spice\-vdagent\f[R]) in the guest to
|
||||||
enable copy/paste and USB redirection
|
enable copy/paste and USB redirection
|
||||||
.RS 2
|
.RS 2
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]sudo apt install spice-vdagent\f[R]
|
\f[CR]sudo apt install spice\-vdagent\f[R]
|
||||||
.RE
|
.RE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Install the SPICE WebDAV agent (\f[CR]spice-webdavd\f[R]) in the guest
|
Install the SPICE WebDAV agent (\f[CR]spice\-webdavd\f[R]) in the guest
|
||||||
to enable file sharing.
|
to enable file sharing.
|
||||||
.RS 2
|
.RS 2
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]sudo apt install spice-webdavd\f[R]
|
\f[CR]sudo apt install spice\-webdavd\f[R]
|
||||||
.RE
|
.RE
|
||||||
.RE
|
.RE
|
||||||
.SS Ubuntu devel (daily-live) images
|
.SS Ubuntu daily\-live images
|
||||||
\f[CR]quickget\f[R] can also download/refresh devel images via
|
\f[CR]quickget\f[R] can also download/refresh daily\-live images via
|
||||||
\f[CR]zsync\f[R] for Ubuntu developers and testers.
|
\f[CR]zsync\f[R] for Ubuntu developers and testers.
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
quickget ubuntu devel
|
quickget ubuntu daily\-live
|
||||||
quickemu --vm ubuntu-devel.conf
|
quickemu \-\-vm ubuntu\-daily\-live.conf
|
||||||
.EE
|
.EE
|
||||||
.PP
|
.PP
|
||||||
You can run \f[CR]quickget ubuntu devel\f[R] to refresh your daily
|
You can run \f[CR]quickget ubuntu daily\-live\f[R] to refresh your daily
|
||||||
development image as often as you like, it will even automatically
|
development image as often as you like, it will even automatically
|
||||||
switch to a new series.
|
switch to a new series.
|
||||||
.SS Ubuntu Flavours
|
.SS Ubuntu Flavours
|
||||||
All the official Ubuntu flavours are supported, just replace
|
All the official Ubuntu flavours are supported, just replace
|
||||||
\f[CR]ubuntu\f[R] with your preferred flavour.
|
\f[CR]ubuntu\f[R] with your preferred flavour.
|
||||||
|
.PP
|
||||||
|
The project \c
|
||||||
|
.UR https://github.com/quickemu-project/quickemu/wiki/02-Create-Linux-virtual-machines
|
||||||
|
wiki
|
||||||
|
.UE \c
|
||||||
|
\ may have further information.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]edubuntu\f[R] (Edubuntu)
|
\f[CR]edubuntu\f[R] (Edubuntu)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -82,42 +107,66 @@ All the official Ubuntu flavours are supported, just replace
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]lubuntu\f[R] (Lubuntu)
|
\f[CR]lubuntu\f[R] (Lubuntu)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ubuntu-budgie\f[R] (Ubuntu Budgie)
|
\f[CR]ubuntu\-budgie\f[R] (Ubuntu Budgie)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ubuntucinnamon\f[R] (Ubuntu Cinnamon)
|
\f[CR]ubuntucinnamon\f[R] (Ubuntu Cinnamon)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ubuntukylin\f[R] (Ubuntu Kylin)
|
\f[CR]ubuntukylin\f[R] (Ubuntu Kylin)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ubuntu-mate\f[R] (Ubuntu MATE)
|
\f[CR]ubuntu\-mate\f[R] (Ubuntu MATE)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ubuntu-server\f[R] (Ubuntu Server)
|
\f[CR]ubuntu\-server\f[R] (Ubuntu Server)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ubuntustudio\f[R] (Ubuntu Studio)
|
\f[CR]ubuntustudio\f[R] (Ubuntu Studio)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ubuntu\f[R] (Ubuntu)
|
\f[CR]ubuntu\f[R] (Ubuntu)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ubuntu-unity\f[R] (Ubuntu Unity)
|
\f[CR]ubuntu\-unity\f[R] (Ubuntu Unity)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]xubuntu\f[R] (Xubuntu)
|
\f[CR]xubuntu\f[R] (Xubuntu)
|
||||||
.PP
|
.PP
|
||||||
You can also use \f[CR]quickget\f[R] with options to:
|
You can also use \f[CR]quickget\f[R] with advanced options :
|
||||||
|
.IP
|
||||||
|
.EX
|
||||||
|
\-\-download <os> <release> [edition] : Download image; no VM configuration
|
||||||
|
\-\-create\-config <os> [path/url] [flags] : Create VM config for an OS image
|
||||||
|
\-\-open\-homepage <os> : Open homepage for the OS
|
||||||
|
\-\-show [os] : Show OS information
|
||||||
|
\-\-version : Show version
|
||||||
|
\-\-help : Show this help message
|
||||||
|
\-\-disable\-unattended : Force quickget not to set up an unattended installation
|
||||||
|
\-\-url [os] [release] [edition] : Show image URL(s)
|
||||||
|
\-\-check [os] [release] [edition] : Check image URL(s)
|
||||||
|
\-\-list : List all supported systems
|
||||||
|
\-\-list\-csv : List everything in csv format
|
||||||
|
\-\-list\-json : List everything in json format
|
||||||
|
.EE
|
||||||
|
.PP
|
||||||
|
Here are some typical uses
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
# show an OS ISO download URL for {os} {release} [edition]
|
# show an OS ISO download URL for {os} {release} [edition]
|
||||||
quickget --show-iso-url fedora 38 Silverblue
|
quickget \-\-url fedora 38 Silverblue
|
||||||
# test if and OS ISO is available for {os} {release} [edition]
|
# test if an OS ISO is available for {os} {release} [edition]
|
||||||
quickget --test-iso-url nixos 23.05 plasma5
|
quickget \-\-check nixos unstable plasma5
|
||||||
# open an OS distribution homepage in a browser
|
# open an OS distribution homepage in a browser
|
||||||
quickget --open-distro-homepage ubuntu-mate
|
quickget \-\-open\-homepage ubuntu\-mate
|
||||||
|
# Only download image file into current directory, without creating VM
|
||||||
|
quickget \-\-download elementary 7.1
|
||||||
.EE
|
.EE
|
||||||
.PP
|
.PP
|
||||||
The \f[CR]--show-iso-url\f[R] and \f[CR]--test-iso-url\f[R] options
|
The \f[CR]\-\-url\f[R], \f[CR]\-\-check\f[R], and
|
||||||
\f[B]do not\f[R] work for \f[CR]Windows\f[R] (\f[CR]quickget\f[R] will
|
\f[CR]\-\-download\f[R] options are fully functional for all operating
|
||||||
begin downloading the requested release and edition of windows)
|
systems, including Windows and macOS.
|
||||||
|
.PP
|
||||||
|
Further information is available from the project \c
|
||||||
|
.UR https://github.com/quickemu-project/quickemu/wiki/06-Advanced-quickget-features
|
||||||
|
wiki
|
||||||
|
.UE \c
|
||||||
.SS Other Operating Systems
|
.SS Other Operating Systems
|
||||||
\f[CR]quickget\f[R] also supports:
|
\f[CR]quickget\f[R] also supports:
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]alma\f[R] (Alma Linux)
|
\f[CR]alma\f[R] (AlmaLinux)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]alpine\f[R] (Alpine Linux)
|
\f[CR]alpine\f[R] (Alpine Linux)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -131,17 +180,29 @@ begin downloading the requested release and edition of windows)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]arcolinux\f[R] (Arco Linux)
|
\f[CR]arcolinux\f[R] (Arco Linux)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]artixlinux\f[R] (Artix Linux)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]athenaos\f[R] (Athena OS)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]batocera\f[R] (Batocera)
|
\f[CR]batocera\f[R] (Batocera)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]bazzite\f[R] (Bazzite)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]biglinux\f[R] (BigLinux)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]blendos\f[R] (BlendOS)
|
\f[CR]blendos\f[R] (BlendOS)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]bodhi\f[R] (Bodhi)
|
\f[CR]bodhi\f[R] (Bodhi)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]bunsenlabs\f[R] (Bunsenlabs)
|
\f[CR]bunsenlabs\f[R] (BunsenLabs)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]cachyos\f[R] (CachyOS)
|
\f[CR]cachyos\f[R] (CachyOS)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]centos-stream\f[R] (CentOS Stream)
|
\f[CR]centos\-stream\f[R] (CentOS Stream)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]chimeralinux\f[R] (Chimera Linux)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]crunchbang++\f[R] (Crunchbangplusplus)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]debian\f[R] (Debian)
|
\f[CR]debian\f[R] (Debian)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -151,6 +212,8 @@ begin downloading the requested release and edition of windows)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]dragonflybsd\f[R] (DragonFlyBSD)
|
\f[CR]dragonflybsd\f[R] (DragonFlyBSD)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]easyos\f[R] (EasyOS)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]elementary\f[R] (elementary OS)
|
\f[CR]elementary\f[R] (elementary OS)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]endeavouros\f[R] (EndeavourOS)
|
\f[CR]endeavouros\f[R] (EndeavourOS)
|
||||||
|
@ -169,9 +232,13 @@ begin downloading the requested release and edition of windows)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ghostbsd\f[R] (GhostBSD)
|
\f[CR]ghostbsd\f[R] (GhostBSD)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]gnomeos\f[R] (GNOME OS)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]guix\f[R] (Guix)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]haiku\f[R] (Haiku)
|
\f[CR]haiku\f[R] (Haiku)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]holoiso\f[R] (SteamOS HoloISO)
|
\f[CR]holoiso\f[R] (HoloISO)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]kali\f[R] (Kali)
|
\f[CR]kali\f[R] (Kali)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -185,6 +252,8 @@ begin downloading the requested release and edition of windows)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]lmde\f[R] (Linux Mint Debian Edition)
|
\f[CR]lmde\f[R] (Linux Mint Debian Edition)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]maboxlinux\f[R] (Mabox Linux)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]mageia\f[R] (Mageia)
|
\f[CR]mageia\f[R] (Mageia)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]manjaro\f[R] (Manjaro)
|
\f[CR]manjaro\f[R] (Manjaro)
|
||||||
|
@ -195,8 +264,12 @@ begin downloading the requested release and edition of windows)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]netbsd\f[R] (NetBSD)
|
\f[CR]netbsd\f[R] (NetBSD)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]nitrux\f[R] (Nitrux)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]nixos\f[R] (NixOS)
|
\f[CR]nixos\f[R] (NixOS)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]nwg\-shell\f[R] (nwg\-shell)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]openbsd\f[R] (OpenBSD)
|
\f[CR]openbsd\f[R] (OpenBSD)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]openindiana\f[R] (OpenIndiana)
|
\f[CR]openindiana\f[R] (OpenIndiana)
|
||||||
|
@ -205,12 +278,20 @@ begin downloading the requested release and edition of windows)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]oraclelinux\f[R] (Oracle Linux)
|
\f[CR]oraclelinux\f[R] (Oracle Linux)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]parrotsec\f[R] (Parrot Security)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]peppermint\f[R] (PeppermintOS)
|
\f[CR]peppermint\f[R] (PeppermintOS)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]popos\f[R] (Pop!_OS)
|
\f[CR]popos\f[R] (Pop!_OS)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]porteus\f[R] (Porteus)
|
\f[CR]porteus\f[R] (Porteus)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]primtux\f[R] (PrimTux)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]proxmox\-ve\f[R] (Proxmox VE)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]pureos\f[R] (PureOS)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]reactos\f[R] (ReactOS)
|
\f[CR]reactos\f[R] (ReactOS)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]rebornos\f[R] (RebornOS)
|
\f[CR]rebornos\f[R] (RebornOS)
|
||||||
|
@ -221,19 +302,29 @@ begin downloading the requested release and edition of windows)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]slackware\f[R] (Slackware)
|
\f[CR]slackware\f[R] (Slackware)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]slax\f[R] (Slax)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]slint\f[R] (Slint)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]slitaz\f[R] (SliTaz)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]solus\f[R] (Solus)
|
\f[CR]solus\f[R] (Solus)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]spiral\f[R] (Spiral)
|
\f[CR]sparkylinux\f[R] (SparkyLinux)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]spirallinux\f[R] (SpiralLinux)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]tails\f[R] (Tails)
|
\f[CR]tails\f[R] (Tails)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]tinycore\f[R] (Tiny Core Linux)
|
\f[CR]tinycore\f[R] (Tiny Core Linux)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]trisquel\f[R] (Trisquel)
|
\f[CR]trisquel\f[R] (Trisquel\-)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]truenas-core\f[R] (TrueNAS Core)
|
\f[CR]truenas\-core\f[R] (TrueNAS Core)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]truenas-scale\f[R] (TrueNAS Scale)
|
\f[CR]truenas\-scale\f[R] (TrueNAS Scale)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]tuxedo\-os\f[R] (Tuxedo OS)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]vanillaos\f[R] (Vanilla OS)
|
\f[CR]vanillaos\f[R] (Vanilla OS)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -241,52 +332,69 @@ begin downloading the requested release and edition of windows)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]vxlinux\f[R] (VX Linux)
|
\f[CR]vxlinux\f[R] (VX Linux)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]xerolinux\f[R] (XeroLinux)
|
|
||||||
.IP \[bu] 2
|
|
||||||
\f[CR]zorin\f[R] (Zorin OS)
|
\f[CR]zorin\f[R] (Zorin OS)
|
||||||
.PP
|
.SS \c
|
||||||
|
.UR https://github.com/quickemu-project/quickemu/wiki/02-Create-Linux-virtual-machines#manually-create-linux-guests
|
||||||
|
Custom Linux guests
|
||||||
|
.UE \c
|
||||||
Or you can download a Linux image and manually create a VM
|
Or you can download a Linux image and manually create a VM
|
||||||
configuration.
|
configuration.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Download a .iso image of a Linux distribution
|
Download a .iso image of a Linux distribution
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Create a VM configuration file; for example
|
Create a VM configuration file; for example
|
||||||
\f[CR]debian-bullseye.conf\f[R]
|
\f[CR]debian\-bullseye.conf\f[R]
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
guest_os=\[dq]linux\[dq]
|
guest_os=\[dq]linux\[dq]
|
||||||
disk_img=\[dq]debian-bullseye/disk.qcow2\[dq]
|
disk_img=\[dq]debian\-bullseye/disk.qcow2\[dq]
|
||||||
iso=\[dq]debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso\[dq]
|
iso=\[dq]debian\-bullseye/firmware\-11.0.0\-amd64\-DVD\-1.iso\[dq]
|
||||||
.EE
|
.EE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Use \f[CR]quickemu\f[R] to start the virtual machine:
|
Use \f[CR]quickemu\f[R] to start the virtual machine:
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
quickemu --vm debian-bullseye.conf
|
quickemu \-\-vm debian\-bullseye.conf
|
||||||
.EE
|
.EE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Complete the installation as normal.
|
Complete the installation as normal.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Post-install:
|
Post\-install:
|
||||||
.RS 2
|
.RS 2
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Install the SPICE agent (\f[CR]spice-vdagent\f[R]) in the guest to
|
Install the SPICE agent (\f[CR]spice\-vdagent\f[R]) in the guest to
|
||||||
enable copy/paste and USB redirection.
|
enable copy/paste and USB redirection.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Install the SPICE WebDAV agent (\f[CR]spice-webdavd\f[R]) in the guest
|
Install the SPICE WebDAV agent (\f[CR]spice\-webdavd\f[R]) in the guest
|
||||||
to enable file sharing.
|
to enable file sharing.
|
||||||
.RE
|
.RE
|
||||||
.SS macOS Guest
|
.SS Supporting old Linux distros
|
||||||
|
If you want to run an old Linux , from 2016 or earlier, change the
|
||||||
|
\f[CR]guest_os\f[R] to \f[CR]linux_old\f[R].
|
||||||
|
This will enable the \f[CR]vmware\-svga\f[R] graphics driver which is
|
||||||
|
better supported on older distros.
|
||||||
|
.SS \c
|
||||||
|
.UR https://github.com/quickemu-project/quickemu/wiki/03-Create-macOS-virtual-machines#automatically-create-macos-guests
|
||||||
|
Creating macOS Guests
|
||||||
|
.UE \c
|
||||||
|
\ 🍏
|
||||||
|
\f[B]Installing macOS in a VM can be a bit finicky, if you encounter
|
||||||
|
problems, \c
|
||||||
|
.UR https://github.com/quickemu-project/quickemu/discussions
|
||||||
|
check the Discussions
|
||||||
|
.UE \c
|
||||||
|
\ for solutions or ask for help there\f[R] 🛟
|
||||||
|
.PP
|
||||||
\f[CR]quickget\f[R] automatically downloads a macOS recovery image and
|
\f[CR]quickget\f[R] automatically downloads a macOS recovery image and
|
||||||
creates a virtual machine configuration.
|
creates a virtual machine configuration.
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
quickget macos catalina
|
quickget macos big\-sur
|
||||||
quickemu --vm macos-catalina.conf
|
quickemu \-\-vm macos\-big\-sur.conf
|
||||||
.EE
|
.EE
|
||||||
.PP
|
.PP
|
||||||
macOS \f[CR]high-sierra\f[R], \f[CR]mojave\f[R], \f[CR]catalina\f[R],
|
macOS \f[CR]mojave\f[R], \f[CR]catalina\f[R], \f[CR]big\-sur\f[R],
|
||||||
\f[CR]big-sur\f[R], \f[CR]monterey\f[R] and \f[CR]ventura\f[R] are
|
\f[CR]monterey\f[R], \f[CR]ventura\f[R] and \f[CR]sonoma\f[R] are
|
||||||
supported.
|
supported.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Use cursor keys and enter key to select the \f[B]macOS Base System\f[R]
|
Use cursor keys and enter key to select the \f[B]macOS Base System\f[R]
|
||||||
|
@ -303,8 +411,9 @@ click \f[B]Erase\f[R].
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Enter a \f[CR]Name:\f[R] for the disk
|
Enter a \f[CR]Name:\f[R] for the disk
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
If you are installing macOS Mojave or later (Catalina, Big Sur, Monterey
|
If you are installing macOS Mojave or later (Catalina, Big Sur,
|
||||||
and Ventura), choose any of the APFS options as the filesystem.
|
Monterey, Ventura and Sonoma), choose any of the APFS options as the
|
||||||
|
filesystem.
|
||||||
MacOS Extended may not work.
|
MacOS Extended may not work.
|
||||||
.RE
|
.RE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -332,10 +441,10 @@ disk you named
|
||||||
.RE
|
.RE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Once you have finished installing macOS you will be presented with an
|
Once you have finished installing macOS you will be presented with an
|
||||||
the out-of-the-box first-start wizard to configure various options and
|
the out\-of\-the\-box first\-start wizard to configure various options
|
||||||
set up your username and password
|
and set up your username and password
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
OPTIONAL: After you have concluded the out-of-the-box wizard, you may
|
OPTIONAL: After you have concluded the out\-of\-the\-box wizard, you may
|
||||||
want to enable the TRIM feature that the computer industry created for
|
want to enable the TRIM feature that the computer industry created for
|
||||||
SSD disks.
|
SSD disks.
|
||||||
This feature in our macOS installation will allow QuickEmu to compact
|
This feature in our macOS installation will allow QuickEmu to compact
|
||||||
|
@ -354,20 +463,21 @@ on the hard disk when files are deleted:
|
||||||
sudo trimforce enable
|
sudo trimforce enable
|
||||||
.EE
|
.EE
|
||||||
.PP
|
.PP
|
||||||
You will be prompted to enter your account\[cq]s password to gain the
|
You will be prompted to enter your account\[aq]s password to gain the
|
||||||
privilege needed.
|
privilege needed.
|
||||||
Once you\[cq]ve entered your password and pressed enter the command will
|
Once you\[aq]ve entered your password and pressed enter the command will
|
||||||
request confirmation in the form of two questions that require you to
|
request confirmation in the form of two questions that require you to
|
||||||
type y (for a \[lq]yes\[rq] response) followed by enter to confirm.
|
type y (for a \[dq]yes\[dq] response) followed by enter to confirm.
|
||||||
|
.PP
|
||||||
If you press enter without first typing y the system will consider that
|
If you press enter without first typing y the system will consider that
|
||||||
a negative response as though you said \[lq]no\[rq]:
|
a negative response as though you said \[dq]no\[dq]:
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
IMPORTANT NOTICE: This tool force-enables TRIM for all relevant attached devices, even though such devices may not have been validated for data integrity while using TRIM. Use of this tool to enable TRIM may result in unintended data loss or data corruption. It should not be used in a commercial operating environment or with important data. Before using this tool, you should back up all of your data and regularly back up data while TRIM is enabled. This tool is provided on an \[dq]as is\[dq] basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THIS TOOL OR ITS USE ALONE OR IN COMBINATION WITH YOUR DEVICES, SYSTEMS, OR SERVICES. BY USING THIS TOOL TO ENABLE TRIM, YOU AGREE THAT, TO THE EXTENT PERMITTED BY APPLICABLE LAW, USE OF THE TOOL IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU.
|
IMPORTANT NOTICE: This tool force\-enables TRIM for all relevant attached devices, even though such devices may not have been validated for data integrity while using TRIM. Use of this tool to enable TRIM may result in unintended data loss or data corruption. It should not be used in a commercial operating environment or with important data. Before using this tool, you should back up all of your data and regularly back up data while TRIM is enabled. This tool is provided on an \[dq]as is\[dq] basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON\-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THIS TOOL OR ITS USE ALONE OR IN COMBINATION WITH YOUR DEVICES, SYSTEMS, OR SERVICES. BY USING THIS TOOL TO ENABLE TRIM, YOU AGREE THAT, TO THE EXTENT PERMITTED BY APPLICABLE LAW, USE OF THE TOOL IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU.
|
||||||
Are you sure you with to proceed (y/N)?
|
Are you sure you with to proceed (y/N)?
|
||||||
.EE
|
.EE
|
||||||
.PP
|
.PP
|
||||||
And a second confirmation once you\[cq]ve confirmed the previous one:
|
And a second confirmation once you\[aq]ve confirmed the previous one:
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
Your system will immediately reboot when this is complete.
|
Your system will immediately reboot when this is complete.
|
||||||
|
@ -381,15 +491,15 @@ The default macOS configuration looks like this:
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
guest_os=\[dq]macos\[dq]
|
guest_os=\[dq]macos\[dq]
|
||||||
img=\[dq]macos-catalina/RecoveryImage.img\[dq]
|
img=\[dq]macos\- big\-sur/RecoveryImage.img\[dq]
|
||||||
disk_img=\[dq]macos-catalina/disk.qcow2\[dq]
|
disk_img=\[dq]macos\- big\-sur/disk.qcow2\[dq]
|
||||||
macos_release=\[dq]catalina\[dq]
|
macos_release=\[dq] big\-sur\[dq]
|
||||||
.EE
|
.EE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]guest_os=\[dq]macos\[dq]\f[R] instructs Quickemu to optimise for
|
\f[CR]guest_os=\[dq]macos\[dq]\f[R] instructs Quickemu to optimise for
|
||||||
macOS.
|
macOS.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]macos_release=\[dq]catalina\[dq]\f[R] instructs Quickemu to
|
\f[CR]macos_release=\[dq] big\-sur\[dq]\f[R] instructs Quickemu to
|
||||||
optimise for a particular macOS release.
|
optimise for a particular macOS release.
|
||||||
.RS 2
|
.RS 2
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -399,23 +509,23 @@ Sur and newer, but not previous releases.
|
||||||
And VirtIO Block Media (disks) are supported/stable in Catalina and
|
And VirtIO Block Media (disks) are supported/stable in Catalina and
|
||||||
newer.
|
newer.
|
||||||
.RE
|
.RE
|
||||||
.SS macOS compatibility
|
.SH macOS compatibility
|
||||||
There are some considerations when running macOS via Quickemu.
|
There are some considerations when running macOS via Quickemu.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Supported macOS releases:
|
Supported macOS releases:
|
||||||
.RS 2
|
.RS 2
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
High Sierra
|
|
||||||
.IP \[bu] 2
|
|
||||||
Mojave
|
Mojave
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Catalina \f[B](Recommended)\f[R]
|
Catalina
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Big Sur
|
Big Sur
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Monterey
|
Monterey
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Ventura
|
Ventura
|
||||||
|
.IP \[bu] 2
|
||||||
|
Sonoma
|
||||||
.RE
|
.RE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]quickemu\f[R] will automatically download the required \c
|
\f[CR]quickemu\f[R] will automatically download the required \c
|
||||||
|
@ -424,7 +534,7 @@ OpenCore
|
||||||
.UE \c
|
.UE \c
|
||||||
\ bootloader and OVMF firmware from \c
|
\ bootloader and OVMF firmware from \c
|
||||||
.UR https://github.com/kholia/OSX-KVM
|
.UR https://github.com/kholia/OSX-KVM
|
||||||
OSX-KVM
|
OSX\-KVM
|
||||||
.UE \c
|
.UE \c
|
||||||
\&.
|
\&.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -441,18 +551,18 @@ VirtIO Block Media
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\c
|
\c
|
||||||
.UR http://philjordan.eu/osx-virt/
|
.UR http://philjordan.eu/osx-virt/
|
||||||
VirtIO \f[CR]usb-tablet\f[R]
|
VirtIO \f[CR]usb\-tablet\f[R]
|
||||||
.UE \c
|
.UE \c
|
||||||
\ is used for the mouse.
|
\ is used for the mouse.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
VirtIO Network (\f[CR]virtio-net\f[R]) is supported and enabled on macOS
|
VirtIO Network (\f[CR]virtio\-net\f[R]) is supported and enabled on
|
||||||
Big Sur and newer but previous releases use \f[CR]vmxnet3\f[R].
|
macOS Big Sur and newer, but earlier releases use \f[CR]vmxnet3\f[R].
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
VirtIO Memory Ballooning is supported and enabled on macOS Big Sur and
|
VirtIO Memory Ballooning is supported and enabled on macOS Big Sur and
|
||||||
newer but disabled for other support macOS releases.
|
newer but disabled for other support macOS releases.
|
||||||
.RE
|
.RE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
USB host and SPICE pass-through is:
|
USB host and SPICE pass\-through is:
|
||||||
.RS 2
|
.RS 2
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
UHCI (USB 2.0) on macOS Catalina and earlier.
|
UHCI (USB 2.0) on macOS Catalina and earlier.
|
||||||
|
@ -460,13 +570,15 @@ UHCI (USB 2.0) on macOS Catalina and earlier.
|
||||||
XHCI (USB 3.0) on macOS Big Sur and newer.
|
XHCI (USB 3.0) on macOS Big Sur and newer.
|
||||||
.RE
|
.RE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Display resolution can only be changed via macOS System Preferences.
|
Display resolution can be changed via \f[CR]quickemu\f[R] using
|
||||||
|
\f[CR]\-\-width\f[R] and \f[CR]\-\-height\f[R] command line arguments.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[B]Full Duplex audio requires \c
|
\f[B]Full Duplex audio requires \c
|
||||||
.UR https://github.com/chris1111/VoodooHDA-OC
|
.UR https://github.com/chris1111/VoodooHDA-OC
|
||||||
VoodooHDA OC
|
VoodooHDA OC
|
||||||
.UE \c
|
.UE \c
|
||||||
\ or pass-through a USB audio-device to the macOS guest VM\f[R].
|
\ or pass\-through a USB audio\-device to the macOS guest VM\f[R].
|
||||||
|
.RS 2
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
NOTE!
|
NOTE!
|
||||||
\c
|
\c
|
||||||
|
@ -474,15 +586,15 @@ NOTE!
|
||||||
Gatekeeper
|
Gatekeeper
|
||||||
.UE \c
|
.UE \c
|
||||||
\ and \c
|
\ and \c
|
||||||
.UR
|
.UR https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection
|
||||||
https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection
|
|
||||||
System Integrity Protection (SIP)
|
System Integrity Protection (SIP)
|
||||||
.UE \c
|
.UE \c
|
||||||
\ need to be disabled to install VoodooHDA OC
|
\ need to be disabled to install VoodooHDA OC
|
||||||
|
.RE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
File sharing between guest and host is available via \c
|
File sharing between guest and host is available via \c
|
||||||
.UR https://wiki.qemu.org/Documentation/9psetup
|
.UR https://wiki.qemu.org/Documentation/9psetup
|
||||||
virtio-9p
|
virtio\-9p
|
||||||
.UE \c
|
.UE \c
|
||||||
\ and \c
|
\ and \c
|
||||||
.UR https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24
|
.UR https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24
|
||||||
|
@ -491,14 +603,14 @@ SPICE webdavd
|
||||||
\&.
|
\&.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Copy/paste via SPICE agent is \f[B]not available on macOS\f[R].
|
Copy/paste via SPICE agent is \f[B]not available on macOS\f[R].
|
||||||
.SS macOS App Store
|
.SH macOS App Store
|
||||||
If you see \f[I]\[lq]Your device or computer could not be
|
If you see \f[I]\[dq]Your device or computer could not be
|
||||||
verified\[rq]\f[R] when you try to login to the App Store, make sure
|
verified\[dq]\f[R] when you try to login to the App Store, make sure
|
||||||
that your wired ethernet device is \f[CR]en0\f[R].
|
that your wired ethernet device is \f[CR]en0\f[R].
|
||||||
Use \f[CR]ifconfig\f[R] in a terminal to verify this.
|
Use \f[CR]ifconfig\f[R] in a terminal to verify this.
|
||||||
.PP
|
.PP
|
||||||
If the wired ethernet device is not \f[CR]en0\f[R], then then go to
|
If the wired ethernet device is not \f[CR]en0\f[R], then then go to
|
||||||
\f[I]System Preferences\f[R] -> \f[I]Network\f[R], delete all the
|
\f[I]System Preferences\f[R] \-> \f[I]Network\f[R], delete all the
|
||||||
network devices and apply the changes.
|
network devices and apply the changes.
|
||||||
Next, open a terminal and run the following:
|
Next, open a terminal and run the following:
|
||||||
.IP
|
.IP
|
||||||
|
@ -507,14 +619,25 @@ sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
|
||||||
.EE
|
.EE
|
||||||
.PP
|
.PP
|
||||||
Now reboot, and the App Store should work.
|
Now reboot, and the App Store should work.
|
||||||
.SS Windows 8, 10 & 11 Guests
|
.PP
|
||||||
|
There may be further advice and information about macOS guests in the
|
||||||
|
project \c
|
||||||
|
.UR https://github.com/quickemu-project/quickemu/wiki/03-Create-macOS-virtual-machines#automatically-create-macos-guests
|
||||||
|
wiki
|
||||||
|
.UE \c
|
||||||
|
\&.
|
||||||
|
.SS \c
|
||||||
|
.UR https://github.com/quickemu-project/quickemu/wiki/04-Create-Windows-virtual-machines
|
||||||
|
Creating Windows guests
|
||||||
|
.UE \c
|
||||||
|
\ 🪟
|
||||||
\f[CR]quickget\f[R] can download \c
|
\f[CR]quickget\f[R] can download \c
|
||||||
.UR https://www.microsoft.com/software-download/windows10
|
.UR https://www.microsoft.com/software-download/windows10
|
||||||
Windows10
|
\f[B]Windows 10\f[R]
|
||||||
.UE \c
|
.UE \c
|
||||||
\ and \c
|
\ and \c
|
||||||
.UR https://www.microsoft.com/software-download/windows11
|
.UR https://www.microsoft.com/software-download/windows11
|
||||||
Windows 11
|
\f[B]Windows 11\f[R]
|
||||||
.UE \c
|
.UE \c
|
||||||
\ automatically and create an optimised virtual machine configuration.
|
\ automatically and create an optimised virtual machine configuration.
|
||||||
This configuration also includes the \c
|
This configuration also includes the \c
|
||||||
|
@ -523,12 +646,35 @@ VirtIO drivers for Windows
|
||||||
.UE \c
|
.UE \c
|
||||||
\&.
|
\&.
|
||||||
.PP
|
.PP
|
||||||
Windows 8.1 is also supported but doesn\[cq]t feature any automated
|
\f[B]Windows 8.1\f[R] is also supported but doesn\[aq]t feature any
|
||||||
installation or driver optimisation.
|
automated installation or driver optimisation.
|
||||||
|
.PP
|
||||||
|
\f[CR]quickget\f[R] can also download \c
|
||||||
|
.UR https://www.microsoft.com/en-us/evalcenter/download-windows-10-enterprise
|
||||||
|
Windows 10 LTSC
|
||||||
|
.UE \c
|
||||||
|
\ and Windows Server \c
|
||||||
|
.UR https://www.microsoft.com/en-us/evalcenter/download-windows-server-2012-r2
|
||||||
|
2012\-r2
|
||||||
|
.UE \c
|
||||||
|
, \c
|
||||||
|
.UR https://www.microsoft.com/en-us/evalcenter/download-windows-server-2016
|
||||||
|
2016
|
||||||
|
.UE \c
|
||||||
|
, \c
|
||||||
|
.UR https://www.microsoft.com/en-us/evalcenter/download-windows-server-2019
|
||||||
|
2019
|
||||||
|
.UE \c
|
||||||
|
, and \c
|
||||||
|
.UR https://www.microsoft.com/en-us/evalcenter/download-windows-server-2022
|
||||||
|
2022
|
||||||
|
.UE \c
|
||||||
|
\&.
|
||||||
|
No automated installation is supported for these releases.
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
quickget windows 11
|
quickget windows 11
|
||||||
quickemu --vm windows-11.conf
|
quickemu \-\-vm windows\-11.conf
|
||||||
.EE
|
.EE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Complete the installation as you normally would.
|
Complete the installation as you normally would.
|
||||||
|
@ -544,25 +690,10 @@ Username: \f[CR]Quickemu\f[R]
|
||||||
Password: \f[CR]quickemu\f[R]
|
Password: \f[CR]quickemu\f[R]
|
||||||
.RE
|
.RE
|
||||||
.PP
|
.PP
|
||||||
The default Windows 11 configuration looks like this:
|
Further information is available from the project \c
|
||||||
.IP
|
.UR https://github.com/quickemu-project/quickemu/wiki/04-Create-Windows-virtual-machines
|
||||||
.EX
|
wiki
|
||||||
guest_os=\[dq]windows\[dq]
|
.UE \c
|
||||||
disk_img=\[dq]windows-11/disk.qcow2\[dq]
|
|
||||||
iso=\[dq]windows-11/windows-11.iso\[dq]
|
|
||||||
fixed_iso=\[dq]windows-11/virtio-win.iso\[dq]
|
|
||||||
tpm=\[dq]on\[dq]
|
|
||||||
secureboot=\[dq]off\[dq]
|
|
||||||
.EE
|
|
||||||
.IP \[bu] 2
|
|
||||||
\f[CR]guest_os=\[dq]windows\[dq]\f[R] instructs \f[CR]quickemu\f[R] to
|
|
||||||
optimise for Windows.
|
|
||||||
.IP \[bu] 2
|
|
||||||
\f[CR]fixed_iso=\f[R] specifies the ISO image that provides VirtIO
|
|
||||||
drivers.
|
|
||||||
.IP \[bu] 2
|
|
||||||
\f[CR]tpm=\[dq]on\[dq]\f[R] instructs \f[CR]quickemu\f[R] to create a
|
|
||||||
software emulated TPM device using \f[CR]swtpm\f[R].
|
|
||||||
.SH AUTHORS
|
.SH AUTHORS
|
||||||
Written by Martin Wimpress.
|
Written by Martin Wimpress.
|
||||||
.SH BUGS
|
.SH BUGS
|
||||||
|
@ -574,6 +705,6 @@ Full sources at: \c
|
||||||
.UR https://github.com/quickemu-project/quickemu
|
.UR https://github.com/quickemu-project/quickemu
|
||||||
.UE \c
|
.UE \c
|
||||||
.PP
|
.PP
|
||||||
quickemu(1), quickemu_conf(1), quickgui(1)
|
quickemu(1), quickemu_conf(5), quickgui(1)
|
||||||
.SH AUTHORS
|
.SH AUTHORS
|
||||||
Martin Wimpress.
|
Martin Wimpress.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
author: Martin Wimpress
|
author: Martin Wimpress
|
||||||
date: November 26, 2023
|
date: December 30, 2024
|
||||||
footer: quickget
|
footer: quickget
|
||||||
header: Quickget User Manual
|
header: Quickget User Manual
|
||||||
section: 1
|
section: 1
|
||||||
|
@ -22,36 +22,55 @@ configuration for `quickemu` to use to build and run
|
||||||
|
|
||||||
# OPTIONS
|
# OPTIONS
|
||||||
|
|
||||||
**version \| -version \| --version**
|
|
||||||
: show version (from Quickemu)
|
|
||||||
|
|
||||||
**list \| list_csv \| list_json**
|
|
||||||
: provide a csv list of all supported guest OSes, versions and
|
|
||||||
variants.
|
|
||||||
|
|
||||||
**`--show-iso-url` \| -s** {**os**} {**release**} \[**edition**\]
|
|
||||||
: show ISO download URL
|
|
||||||
|
|
||||||
**`--test-iso-url` \| -t** {**os**} {**release**} \[**edition**\]
|
|
||||||
: test if ISO is available
|
|
||||||
|
|
||||||
**`--open-distro-homepage` \| -o** {**os**}
|
|
||||||
: open OS homepage in browser
|
|
||||||
|
|
||||||
**\[OS\] \[Release\] \[Edition\]**
|
**\[OS\] \[Release\] \[Edition\]**
|
||||||
: specify the OS and release (and optional edition) if insufficient
|
: specify the OS and release (and optional edition) if insufficient
|
||||||
input is provided a list of missing options will be reported and the
|
input is provided a list of missing options will be reported and the
|
||||||
script will exit. Editions may not apply and will be defaulted if
|
script will exit. Editions may not apply and will be defaulted if
|
||||||
not provided.
|
not provided.
|
||||||
|
|
||||||
|
**--download** <os> <release> \[edition\]
|
||||||
|
: Download image; no VM configuration
|
||||||
|
|
||||||
|
**--create-config** <os> \[path/url\]
|
||||||
|
: Create VM config for a OS image
|
||||||
|
|
||||||
|
**--open-homepage** <os>
|
||||||
|
: Open homepage for the OS
|
||||||
|
|
||||||
|
**--show** \[os\]
|
||||||
|
: Show OS information
|
||||||
|
|
||||||
|
**--url** \[os\] \[release\] \[edition\]
|
||||||
|
: Show image URL(s)
|
||||||
|
|
||||||
|
**--check** \[os\] \[release\] \[edition\]
|
||||||
|
: Check image URL(s)
|
||||||
|
|
||||||
|
**--list**
|
||||||
|
: List all supported systems
|
||||||
|
|
||||||
|
**--list-csv**
|
||||||
|
: List everything in csv format
|
||||||
|
|
||||||
|
**--list-json**
|
||||||
|
: List everything in json format
|
||||||
|
|
||||||
|
**--version**
|
||||||
|
: Show version
|
||||||
|
|
||||||
|
**--help**
|
||||||
|
: Show this help message
|
||||||
|
|
||||||
# NOTES
|
# NOTES
|
||||||
|
|
||||||
## Ubuntu Guest
|
## Creating Linux guests 🐧
|
||||||
|
|
||||||
|
### Ubuntu
|
||||||
|
|
||||||
`quickget` will automatically download an Ubuntu release and create the
|
`quickget` will automatically download an Ubuntu release and create the
|
||||||
virtual machine configuration.
|
virtual machine configuration.
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
quickget ubuntu 22.04
|
quickget ubuntu 22.04
|
||||||
quickemu --vm ubuntu-22.04.conf
|
quickemu --vm ubuntu-22.04.conf
|
||||||
```
|
```
|
||||||
|
@ -65,25 +84,29 @@ quickemu --vm ubuntu-22.04.conf
|
||||||
enable file sharing.
|
enable file sharing.
|
||||||
- `sudo apt install spice-webdavd`
|
- `sudo apt install spice-webdavd`
|
||||||
|
|
||||||
### Ubuntu devel (daily-live) images
|
### Ubuntu daily-live images
|
||||||
|
|
||||||
`quickget` can also download/refresh devel images via `zsync` for Ubuntu
|
`quickget` can also download/refresh daily-live images via `zsync` for
|
||||||
developers and testers.
|
Ubuntu developers and testers.
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
quickget ubuntu devel
|
quickget ubuntu daily-live
|
||||||
quickemu --vm ubuntu-devel.conf
|
quickemu --vm ubuntu-daily-live.conf
|
||||||
```
|
```
|
||||||
|
|
||||||
You can run `quickget ubuntu devel` to refresh your daily development
|
You can run `quickget ubuntu daily-live` to refresh your daily
|
||||||
image as often as you like, it will even automatically switch to a new
|
development image as often as you like, it will even automatically
|
||||||
series.
|
switch to a new series.
|
||||||
|
|
||||||
### Ubuntu Flavours
|
### Ubuntu Flavours
|
||||||
|
|
||||||
All the official Ubuntu flavours are supported, just replace `ubuntu`
|
All the official Ubuntu flavours are supported, just replace `ubuntu`
|
||||||
with your preferred flavour.
|
with your preferred flavour.
|
||||||
|
|
||||||
|
The project
|
||||||
|
[wiki](https://github.com/quickemu-project/quickemu/wiki/02-Create-Linux-virtual-machines)
|
||||||
|
may have further information.
|
||||||
|
|
||||||
- `edubuntu` (Edubuntu)
|
- `edubuntu` (Edubuntu)
|
||||||
- `kubuntu` (Kubuntu)
|
- `kubuntu` (Kubuntu)
|
||||||
- `lubuntu` (Lubuntu)
|
- `lubuntu` (Lubuntu)
|
||||||
|
@ -97,42 +120,70 @@ with your preferred flavour.
|
||||||
- `ubuntu-unity` (Ubuntu Unity)
|
- `ubuntu-unity` (Ubuntu Unity)
|
||||||
- `xubuntu` (Xubuntu)
|
- `xubuntu` (Xubuntu)
|
||||||
|
|
||||||
You can also use `quickget` with options to:
|
You can also use `quickget` with advanced options :
|
||||||
|
|
||||||
|
``` text
|
||||||
|
--download <os> <release> [edition] : Download image; no VM configuration
|
||||||
|
--create-config <os> [path/url] [flags] : Create VM config for an OS image
|
||||||
|
--open-homepage <os> : Open homepage for the OS
|
||||||
|
--show [os] : Show OS information
|
||||||
|
--version : Show version
|
||||||
|
--help : Show this help message
|
||||||
|
--disable-unattended : Force quickget not to set up an unattended installation
|
||||||
|
--url [os] [release] [edition] : Show image URL(s)
|
||||||
|
--check [os] [release] [edition] : Check image URL(s)
|
||||||
|
--list : List all supported systems
|
||||||
|
--list-csv : List everything in csv format
|
||||||
|
--list-json : List everything in json format
|
||||||
|
```
|
||||||
|
|
||||||
|
Here are some typical uses
|
||||||
|
|
||||||
``` shell
|
``` shell
|
||||||
# show an OS ISO download URL for {os} {release} [edition]
|
# show an OS ISO download URL for {os} {release} [edition]
|
||||||
quickget --show-iso-url fedora 38 Silverblue
|
quickget --url fedora 38 Silverblue
|
||||||
# test if and OS ISO is available for {os} {release} [edition]
|
# test if an OS ISO is available for {os} {release} [edition]
|
||||||
quickget --test-iso-url nixos 23.05 plasma5
|
quickget --check nixos unstable plasma5
|
||||||
# open an OS distribution homepage in a browser
|
# open an OS distribution homepage in a browser
|
||||||
quickget --open-distro-homepage ubuntu-mate
|
quickget --open-homepage ubuntu-mate
|
||||||
|
# Only download image file into current directory, without creating VM
|
||||||
|
quickget --download elementary 7.1
|
||||||
```
|
```
|
||||||
|
|
||||||
The `--show-iso-url` and `--test-iso-url` options **do not** work for
|
The `--url`, `--check`, and `--download` options are fully functional
|
||||||
`Windows` (`quickget` will begin downloading the requested release and
|
for all operating systems, including Windows and macOS.
|
||||||
edition of windows)
|
|
||||||
|
|
||||||
## Other Operating Systems
|
Further information is available from the project
|
||||||
|
[wiki](https://github.com/quickemu-project/quickemu/wiki/06-Advanced-quickget-features)
|
||||||
|
|
||||||
|
### Other Operating Systems
|
||||||
|
|
||||||
`quickget` also supports:
|
`quickget` also supports:
|
||||||
|
|
||||||
- `alma` (Alma Linux)
|
- `alma` (AlmaLinux)
|
||||||
- `alpine` (Alpine Linux)
|
- `alpine` (Alpine Linux)
|
||||||
- `android` (Android x86)
|
- `android` (Android x86)
|
||||||
- `antix` (Antix)
|
- `antix` (Antix)
|
||||||
- `archcraft` (Archcraft)
|
- `archcraft` (Archcraft)
|
||||||
- `archlinux` (Arch Linux)
|
- `archlinux` (Arch Linux)
|
||||||
- `arcolinux` (Arco Linux)
|
- `arcolinux` (Arco Linux)
|
||||||
|
- `artixlinux` (Artix Linux)
|
||||||
|
- `athenaos` (Athena OS)
|
||||||
- `batocera` (Batocera)
|
- `batocera` (Batocera)
|
||||||
|
- `bazzite` (Bazzite)
|
||||||
|
- `biglinux` (BigLinux)
|
||||||
- `blendos` (BlendOS)
|
- `blendos` (BlendOS)
|
||||||
- `bodhi` (Bodhi)
|
- `bodhi` (Bodhi)
|
||||||
- `bunsenlabs` (Bunsenlabs)
|
- `bunsenlabs` (BunsenLabs)
|
||||||
- `cachyos` (CachyOS)
|
- `cachyos` (CachyOS)
|
||||||
- `centos-stream` (CentOS Stream)
|
- `centos-stream` (CentOS Stream)
|
||||||
|
- `chimeralinux` (Chimera Linux)
|
||||||
|
- `crunchbang++` (Crunchbangplusplus)
|
||||||
- `debian` (Debian)
|
- `debian` (Debian)
|
||||||
- `deepin` (Deepin)
|
- `deepin` (Deepin)
|
||||||
- `devuan` (Devuan)
|
- `devuan` (Devuan)
|
||||||
- `dragonflybsd` (DragonFlyBSD)
|
- `dragonflybsd` (DragonFlyBSD)
|
||||||
|
- `easyos` (EasyOS)
|
||||||
- `elementary` (elementary OS)
|
- `elementary` (elementary OS)
|
||||||
- `endeavouros` (EndeavourOS)
|
- `endeavouros` (EndeavourOS)
|
||||||
- `endless` (Endless OS)
|
- `endless` (Endless OS)
|
||||||
|
@ -142,52 +193,67 @@ edition of windows)
|
||||||
- `garuda` (Garuda Linux)
|
- `garuda` (Garuda Linux)
|
||||||
- `gentoo` (Gentoo)
|
- `gentoo` (Gentoo)
|
||||||
- `ghostbsd` (GhostBSD)
|
- `ghostbsd` (GhostBSD)
|
||||||
|
- `gnomeos` (GNOME OS)
|
||||||
|
- `guix` (Guix)
|
||||||
- `haiku` (Haiku)
|
- `haiku` (Haiku)
|
||||||
- `holoiso` (SteamOS HoloISO)
|
- `holoiso` (HoloISO)
|
||||||
- `kali` (Kali)
|
- `kali` (Kali)
|
||||||
- `kdeneon` (KDE Neon)
|
- `kdeneon` (KDE Neon)
|
||||||
- `kolibrios` (KolibriOS)
|
- `kolibrios` (KolibriOS)
|
||||||
- `linuxlite` (Linux Lite)
|
- `linuxlite` (Linux Lite)
|
||||||
- `linuxmint` (Linux Mint)
|
- `linuxmint` (Linux Mint)
|
||||||
- `lmde` (Linux Mint Debian Edition)
|
- `lmde` (Linux Mint Debian Edition)
|
||||||
|
- `maboxlinux` (Mabox Linux)
|
||||||
- `mageia` (Mageia)
|
- `mageia` (Mageia)
|
||||||
- `manjaro` (Manjaro)
|
- `manjaro` (Manjaro)
|
||||||
- `mxlinux` (MX Linux)
|
- `mxlinux` (MX Linux)
|
||||||
- `netboot` (netboot.xyz)
|
- `netboot` (netboot.xyz)
|
||||||
- `netbsd` (NetBSD)
|
- `netbsd` (NetBSD)
|
||||||
|
- `nitrux` (Nitrux)
|
||||||
- `nixos` (NixOS)
|
- `nixos` (NixOS)
|
||||||
|
- `nwg-shell` (nwg-shell)
|
||||||
- `openbsd` (OpenBSD)
|
- `openbsd` (OpenBSD)
|
||||||
- `openindiana` (OpenIndiana)
|
- `openindiana` (OpenIndiana)
|
||||||
- `opensuse` (openSUSE)
|
- `opensuse` (openSUSE)
|
||||||
- `oraclelinux` (Oracle Linux)
|
- `oraclelinux` (Oracle Linux)
|
||||||
|
- `parrotsec` (Parrot Security)
|
||||||
- `peppermint` (PeppermintOS)
|
- `peppermint` (PeppermintOS)
|
||||||
- `popos` (Pop!\_OS)
|
- `popos` (Pop!\_OS)
|
||||||
- `porteus` (Porteus)
|
- `porteus` (Porteus)
|
||||||
|
- `primtux` (PrimTux)
|
||||||
|
- `proxmox-ve` (Proxmox VE)
|
||||||
|
- `pureos` (PureOS)
|
||||||
- `reactos` (ReactOS)
|
- `reactos` (ReactOS)
|
||||||
- `rebornos` (RebornOS)
|
- `rebornos` (RebornOS)
|
||||||
- `rockylinux` (Rocky Linux)
|
- `rockylinux` (Rocky Linux)
|
||||||
- `siduction` (Siduction)
|
- `siduction` (Siduction)
|
||||||
- `slackware` (Slackware)
|
- `slackware` (Slackware)
|
||||||
|
- `slax` (Slax)
|
||||||
|
- `slint` (Slint)
|
||||||
|
- `slitaz` (SliTaz)
|
||||||
- `solus` (Solus)
|
- `solus` (Solus)
|
||||||
- `spiral` (Spiral)
|
- `sparkylinux` (SparkyLinux)
|
||||||
|
- `spirallinux` (SpiralLinux)
|
||||||
- `tails` (Tails)
|
- `tails` (Tails)
|
||||||
- `tinycore` (Tiny Core Linux)
|
- `tinycore` (Tiny Core Linux)
|
||||||
- `trisquel` (Trisquel)
|
- `trisquel` (Trisquel-)
|
||||||
- `truenas-core` (TrueNAS Core)
|
- `truenas-core` (TrueNAS Core)
|
||||||
- `truenas-scale` (TrueNAS Scale)
|
- `truenas-scale` (TrueNAS Scale)
|
||||||
|
- `tuxedo-os` (Tuxedo OS)
|
||||||
- `vanillaos` (Vanilla OS)
|
- `vanillaos` (Vanilla OS)
|
||||||
- `void` (Void Linux)
|
- `void` (Void Linux)
|
||||||
- `vxlinux` (VX Linux)
|
- `vxlinux` (VX Linux)
|
||||||
- `xerolinux` (XeroLinux)
|
|
||||||
- `zorin` (Zorin OS)
|
- `zorin` (Zorin OS)
|
||||||
|
|
||||||
|
### [Custom Linux guests](https://github.com/quickemu-project/quickemu/wiki/02-Create-Linux-virtual-machines#manually-create-linux-guests)
|
||||||
|
|
||||||
Or you can download a Linux image and manually create a VM
|
Or you can download a Linux image and manually create a VM
|
||||||
configuration.
|
configuration.
|
||||||
|
|
||||||
- Download a .iso image of a Linux distribution
|
- Download a .iso image of a Linux distribution
|
||||||
- Create a VM configuration file; for example `debian-bullseye.conf`
|
- Create a VM configuration file; for example `debian-bullseye.conf`
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
guest_os="linux"
|
guest_os="linux"
|
||||||
disk_img="debian-bullseye/disk.qcow2"
|
disk_img="debian-bullseye/disk.qcow2"
|
||||||
iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
|
iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
|
||||||
|
@ -195,7 +261,7 @@ iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
|
||||||
|
|
||||||
- Use `quickemu` to start the virtual machine:
|
- Use `quickemu` to start the virtual machine:
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
quickemu --vm debian-bullseye.conf
|
quickemu --vm debian-bullseye.conf
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -206,67 +272,76 @@ quickemu --vm debian-bullseye.conf
|
||||||
- Install the SPICE WebDAV agent (`spice-webdavd`) in the guest to
|
- Install the SPICE WebDAV agent (`spice-webdavd`) in the guest to
|
||||||
enable file sharing.
|
enable file sharing.
|
||||||
|
|
||||||
## macOS Guest
|
## Supporting old Linux distros
|
||||||
|
|
||||||
|
If you want to run an old Linux , from 2016 or earlier, change the
|
||||||
|
`guest_os` to `linux_old`. This will enable the `vmware-svga` graphics
|
||||||
|
driver which is better supported on older distros.
|
||||||
|
|
||||||
|
## [Creating macOS Guests](https://github.com/quickemu-project/quickemu/wiki/03-Create-macOS-virtual-machines#automatically-create-macos-guests) 🍏
|
||||||
|
|
||||||
|
**Installing macOS in a VM can be a bit finicky, if you encounter
|
||||||
|
problems, [check the
|
||||||
|
Discussions](https://github.com/quickemu-project/quickemu/discussions)
|
||||||
|
for solutions or ask for help there** 🛟
|
||||||
|
|
||||||
`quickget` automatically downloads a macOS recovery image and creates a
|
`quickget` automatically downloads a macOS recovery image and creates a
|
||||||
virtual machine configuration.
|
virtual machine configuration.
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
quickget macos catalina
|
quickget macos big-sur
|
||||||
quickemu --vm macos-catalina.conf
|
quickemu --vm macos-big-sur.conf
|
||||||
```
|
```
|
||||||
|
|
||||||
macOS `high-sierra`, `mojave`, `catalina`, `big-sur`, `monterey` and
|
macOS `mojave`, `catalina`, `big-sur`, `monterey`, `ventura` and
|
||||||
`ventura` are supported.
|
`sonoma` are supported.
|
||||||
|
|
||||||
- Use cursor keys and enter key to select the **macOS Base System**
|
- Use cursor keys and enter key to select the **macOS Base System**
|
||||||
- From **macOS Utilities**
|
- From **macOS Utilities**
|
||||||
- Click **Disk Utility** and **Continue**
|
- Click **Disk Utility** and **Continue**
|
||||||
- Select `QEMU HARDDISK Media` (\~103.08GB) from the list (on
|
- Select `QEMU HARDDISK Media` (~103.08GB) from the list (on Big Sur
|
||||||
Big Sur and above use `Apple Inc. VirtIO Block Device`) and
|
and above use `Apple Inc. VirtIO Block Device`) and click
|
||||||
click **Erase**.
|
**Erase**.
|
||||||
- Enter a `Name:` for the disk
|
- Enter a `Name:` for the disk
|
||||||
- If you are installing macOS Mojave or later (Catalina, Big
|
- If you are installing macOS Mojave or later (Catalina, Big Sur,
|
||||||
Sur, Monterey and Ventura), choose any of the APFS options
|
Monterey, Ventura and Sonoma), choose any of the APFS options as
|
||||||
as the filesystem. MacOS Extended may not work.
|
the filesystem. MacOS Extended may not work.
|
||||||
- Click **Erase**.
|
- Click **Erase**.
|
||||||
- Click **Done**.
|
- Click **Done**.
|
||||||
- Close Disk Utility
|
- Close Disk Utility
|
||||||
- From **macOS Utilities**
|
- From **macOS Utilities**
|
||||||
- Click **Reinstall macOS** and **Continue**
|
- Click **Reinstall macOS** and **Continue**
|
||||||
- Complete the installation as you normally would.
|
- Complete the installation as you normally would.
|
||||||
- On the first reboot use cursor keys and enter key to select
|
- On the first reboot use cursor keys and enter key to select **macOS
|
||||||
**macOS Installer**
|
Installer**
|
||||||
- On the subsequent reboots use cursor keys and enter key to
|
- On the subsequent reboots use cursor keys and enter key to select
|
||||||
select the disk you named
|
the disk you named
|
||||||
- Once you have finished installing macOS you will be presented with
|
- Once you have finished installing macOS you will be presented with an
|
||||||
an the out-of-the-box first-start wizard to configure various
|
the out-of-the-box first-start wizard to configure various options and
|
||||||
options and set up your username and password
|
set up your username and password
|
||||||
- OPTIONAL: After you have concluded the out-of-the-box wizard, you
|
- OPTIONAL: After you have concluded the out-of-the-box wizard, you may
|
||||||
may want to enable the TRIM feature that the computer industry
|
want to enable the TRIM feature that the computer industry created for
|
||||||
created for SSD disks. This feature in our macOS installation will
|
SSD disks. This feature in our macOS installation will allow QuickEmu
|
||||||
allow QuickEmu to compact (shrink) your macOS disk image whenever
|
to compact (shrink) your macOS disk image whenever you delete files
|
||||||
you delete files inside the Virtual Machine. Without this step your
|
inside the Virtual Machine. Without this step your macOS disk image
|
||||||
macOS disk image will only ever get larger and will not shrink even
|
will only ever get larger and will not shrink even when you delete
|
||||||
when you delete lots of data inside macOS.
|
lots of data inside macOS.
|
||||||
- To enable TRIM, open the Terminal application and type the
|
- To enable TRIM, open the Terminal application and type the following
|
||||||
following command followed by pressing
|
command followed by pressing <kbd>enter</kbd> to tell macos to use
|
||||||
`<kbd>`{=html}enter`</kbd>`{=html} to tell macos to use the TRIM
|
the TRIM command on the hard disk when files are deleted:
|
||||||
command on the hard disk when files are deleted:
|
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
sudo trimforce enable
|
sudo trimforce enable
|
||||||
```
|
```
|
||||||
|
|
||||||
You will be prompted to enter your account's password to gain the
|
You will be prompted to enter your account's password to gain the
|
||||||
privilege needed. Once you've entered your password and pressed
|
privilege needed. Once you've entered your password and pressed
|
||||||
`<kbd>`{=html}enter`</kbd>`{=html} the command will request confirmation
|
<kbd>enter</kbd> the command will request confirmation in the form of
|
||||||
in the form of two questions that require you to type
|
two questions that require you to type <kbd>y</kbd> (for a "yes"
|
||||||
`<kbd>`{=html}y`</kbd>`{=html} (for a "yes" response) followed by
|
response) followed by <kbd>enter</kbd> to confirm.
|
||||||
`<kbd>`{=html}enter`</kbd>`{=html} to confirm. If you press
|
|
||||||
`<kbd>`{=html}enter`</kbd>`{=html} without first typing
|
If you press <kbd>enter</kbd> without first typing <kbd>y</kbd> the
|
||||||
`<kbd>`{=html}y`</kbd>`{=html} the system will consider that a negative
|
system will consider that a negative response as though you said "no":
|
||||||
response as though you said "no":
|
|
||||||
|
|
||||||
``` plain
|
``` plain
|
||||||
IMPORTANT NOTICE: This tool force-enables TRIM for all relevant attached devices, even though such devices may not have been validated for data integrity while using TRIM. Use of this tool to enable TRIM may result in unintended data loss or data corruption. It should not be used in a commercial operating environment or with important data. Before using this tool, you should back up all of your data and regularly back up data while TRIM is enabled. This tool is provided on an "as is" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THIS TOOL OR ITS USE ALONE OR IN COMBINATION WITH YOUR DEVICES, SYSTEMS, OR SERVICES. BY USING THIS TOOL TO ENABLE TRIM, YOU AGREE THAT, TO THE EXTENT PERMITTED BY APPLICABLE LAW, USE OF THE TOOL IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU.
|
IMPORTANT NOTICE: This tool force-enables TRIM for all relevant attached devices, even though such devices may not have been validated for data integrity while using TRIM. Use of this tool to enable TRIM may result in unintended data loss or data corruption. It should not be used in a commercial operating environment or with important data. Before using this tool, you should back up all of your data and regularly back up data while TRIM is enabled. This tool is provided on an "as is" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THIS TOOL OR ITS USE ALONE OR IN COMBINATION WITH YOUR DEVICES, SYSTEMS, OR SERVICES. BY USING THIS TOOL TO ENABLE TRIM, YOU AGREE THAT, TO THE EXTENT PERMITTED BY APPLICABLE LAW, USE OF THE TOOL IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU.
|
||||||
|
@ -285,55 +360,55 @@ soon as the command completes.
|
||||||
|
|
||||||
The default macOS configuration looks like this:
|
The default macOS configuration looks like this:
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
guest_os="macos"
|
guest_os="macos"
|
||||||
img="macos-catalina/RecoveryImage.img"
|
img="macos- big-sur/RecoveryImage.img"
|
||||||
disk_img="macos-catalina/disk.qcow2"
|
disk_img="macos- big-sur/disk.qcow2"
|
||||||
macos_release="catalina"
|
macos_release=" big-sur"
|
||||||
```
|
```
|
||||||
|
|
||||||
- `guest_os="macos"` instructs Quickemu to optimise for macOS.
|
- `guest_os="macos"` instructs Quickemu to optimise for macOS.
|
||||||
- `macos_release="catalina"` instructs Quickemu to optimise for a
|
- `macos_release=" big-sur"` instructs Quickemu to optimise for a
|
||||||
particular macOS release.
|
particular macOS release.
|
||||||
- For example VirtIO Network and Memory Ballooning are available
|
- For example VirtIO Network and Memory Ballooning are available in
|
||||||
in Big Sur and newer, but not previous releases.
|
Big Sur and newer, but not previous releases.
|
||||||
- And VirtIO Block Media (disks) are supported/stable in Catalina
|
- And VirtIO Block Media (disks) are supported/stable in Catalina and
|
||||||
and newer.
|
newer.
|
||||||
|
|
||||||
### macOS compatibility
|
# macOS compatibility
|
||||||
|
|
||||||
There are some considerations when running macOS via Quickemu.
|
There are some considerations when running macOS via Quickemu.
|
||||||
|
|
||||||
- Supported macOS releases:
|
- Supported macOS releases:
|
||||||
- High Sierra
|
|
||||||
- Mojave
|
- Mojave
|
||||||
- Catalina **(Recommended)**
|
- Catalina
|
||||||
- Big Sur
|
- Big Sur
|
||||||
- Monterey
|
- Monterey
|
||||||
- Ventura
|
- Ventura
|
||||||
|
- Sonoma
|
||||||
- `quickemu` will automatically download the required
|
- `quickemu` will automatically download the required
|
||||||
[OpenCore](https://github.com/acidanthera/OpenCorePkg) bootloader
|
[OpenCore](https://github.com/acidanthera/OpenCorePkg) bootloader and
|
||||||
and OVMF firmware from [OSX-KVM](https://github.com/kholia/OSX-KVM).
|
OVMF firmware from [OSX-KVM](https://github.com/kholia/OSX-KVM).
|
||||||
- Optimised by default, but no GPU acceleration is available.
|
- Optimised by default, but no GPU acceleration is available.
|
||||||
- Host CPU vendor is detected and guest CPU is optimised
|
- Host CPU vendor is detected and guest CPU is optimised accordingly.
|
||||||
accordingly.
|
|
||||||
- [VirtIO Block
|
- [VirtIO Block
|
||||||
Media](https://www.kraxel.org/blog/2019/06/macos-qemu-guest/) is
|
Media](https://www.kraxel.org/blog/2019/06/macos-qemu-guest/) is
|
||||||
used for the system disk where supported.
|
used for the system disk where supported.
|
||||||
- [VirtIO `usb-tablet`](http://philjordan.eu/osx-virt/) is used
|
- [VirtIO `usb-tablet`](http://philjordan.eu/osx-virt/) is used for
|
||||||
for the mouse.
|
the mouse.
|
||||||
- VirtIO Network (`virtio-net`) is supported and enabled on macOS
|
- VirtIO Network (`virtio-net`) is supported and enabled on macOS Big
|
||||||
Big Sur and newer but previous releases use `vmxnet3`.
|
Sur and newer, but earlier releases use `vmxnet3`.
|
||||||
- VirtIO Memory Ballooning is supported and enabled on macOS Big
|
- VirtIO Memory Ballooning is supported and enabled on macOS Big Sur
|
||||||
Sur and newer but disabled for other support macOS releases.
|
and newer but disabled for other support macOS releases.
|
||||||
- USB host and SPICE pass-through is:
|
- USB host and SPICE pass-through is:
|
||||||
- UHCI (USB 2.0) on macOS Catalina and earlier.
|
- UHCI (USB 2.0) on macOS Catalina and earlier.
|
||||||
- XHCI (USB 3.0) on macOS Big Sur and newer.
|
- XHCI (USB 3.0) on macOS Big Sur and newer.
|
||||||
- Display resolution can only be changed via macOS System Preferences.
|
- Display resolution can be changed via `quickemu` using `--width` and
|
||||||
|
`--height` command line arguments.
|
||||||
- **Full Duplex audio requires [VoodooHDA
|
- **Full Duplex audio requires [VoodooHDA
|
||||||
OC](https://github.com/chris1111/VoodooHDA-OC) or pass-through a USB
|
OC](https://github.com/chris1111/VoodooHDA-OC) or pass-through a USB
|
||||||
audio-device to the macOS guest VM**.
|
audio-device to the macOS guest VM**.
|
||||||
- NOTE! [Gatekeeper](https://disable-gatekeeper.github.io/) and
|
- NOTE! [Gatekeeper](https://disable-gatekeeper.github.io/) and
|
||||||
[System Integrity Protection
|
[System Integrity Protection
|
||||||
(SIP)](https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection)
|
(SIP)](https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection)
|
||||||
need to be disabled to install VoodooHDA OC
|
need to be disabled to install VoodooHDA OC
|
||||||
|
@ -342,7 +417,7 @@ There are some considerations when running macOS via Quickemu.
|
||||||
webdavd](https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24).
|
webdavd](https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24).
|
||||||
- Copy/paste via SPICE agent is **not available on macOS**.
|
- Copy/paste via SPICE agent is **not available on macOS**.
|
||||||
|
|
||||||
### macOS App Store
|
# macOS App Store
|
||||||
|
|
||||||
If you see *"Your device or computer could not be verified"* when you
|
If you see *"Your device or computer could not be verified"* when you
|
||||||
try to login to the App Store, make sure that your wired ethernet device
|
try to login to the App Store, make sure that your wired ethernet device
|
||||||
|
@ -352,25 +427,39 @@ If the wired ethernet device is not `en0`, then then go to *System
|
||||||
Preferences* -\> *Network*, delete all the network devices and apply the
|
Preferences* -\> *Network*, delete all the network devices and apply the
|
||||||
changes. Next, open a terminal and run the following:
|
changes. Next, open a terminal and run the following:
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
|
sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
|
||||||
```
|
```
|
||||||
|
|
||||||
Now reboot, and the App Store should work.
|
Now reboot, and the App Store should work.
|
||||||
|
|
||||||
## Windows 8, 10 & 11 Guests
|
There may be further advice and information about macOS guests in the
|
||||||
|
project
|
||||||
|
[wiki](https://github.com/quickemu-project/quickemu/wiki/03-Create-macOS-virtual-machines#automatically-create-macos-guests).
|
||||||
|
|
||||||
`quickget` can download
|
## [Creating Windows guests](https://github.com/quickemu-project/quickemu/wiki/04-Create-Windows-virtual-machines) 🪟
|
||||||
[Windows10](https://www.microsoft.com/software-download/windows10) and
|
|
||||||
[Windows 11](https://www.microsoft.com/software-download/windows11)
|
`quickget` can download [**Windows
|
||||||
|
10**](https://www.microsoft.com/software-download/windows10) and
|
||||||
|
[**Windows 11**](https://www.microsoft.com/software-download/windows11)
|
||||||
automatically and create an optimised virtual machine configuration.
|
automatically and create an optimised virtual machine configuration.
|
||||||
This configuration also includes the [VirtIO drivers for
|
This configuration also includes the [VirtIO drivers for
|
||||||
Windows](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/).
|
Windows](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/).
|
||||||
|
|
||||||
Windows 8.1 is also supported but doesn't feature any automated
|
**Windows 8.1** is also supported but doesn't feature any automated
|
||||||
installation or driver optimisation.
|
installation or driver optimisation.
|
||||||
|
|
||||||
``` bash
|
`quickget` can also download [Windows 10
|
||||||
|
LTSC](https://www.microsoft.com/en-us/evalcenter/download-windows-10-enterprise)
|
||||||
|
and Windows Server
|
||||||
|
[2012-r2](https://www.microsoft.com/en-us/evalcenter/download-windows-server-2012-r2),
|
||||||
|
[2016](https://www.microsoft.com/en-us/evalcenter/download-windows-server-2016),
|
||||||
|
[2019](https://www.microsoft.com/en-us/evalcenter/download-windows-server-2019),
|
||||||
|
and
|
||||||
|
[2022](https://www.microsoft.com/en-us/evalcenter/download-windows-server-2022).
|
||||||
|
No automated installation is supported for these releases.
|
||||||
|
|
||||||
|
``` shell
|
||||||
quickget windows 11
|
quickget windows 11
|
||||||
quickemu --vm windows-11.conf
|
quickemu --vm windows-11.conf
|
||||||
```
|
```
|
||||||
|
@ -382,21 +471,8 @@ quickemu --vm windows-11.conf
|
||||||
- Username: `Quickemu`
|
- Username: `Quickemu`
|
||||||
- Password: `quickemu`
|
- Password: `quickemu`
|
||||||
|
|
||||||
The default Windows 11 configuration looks like this:
|
Further information is available from the project
|
||||||
|
[wiki](https://github.com/quickemu-project/quickemu/wiki/04-Create-Windows-virtual-machines)
|
||||||
``` bash
|
|
||||||
guest_os="windows"
|
|
||||||
disk_img="windows-11/disk.qcow2"
|
|
||||||
iso="windows-11/windows-11.iso"
|
|
||||||
fixed_iso="windows-11/virtio-win.iso"
|
|
||||||
tpm="on"
|
|
||||||
secureboot="off"
|
|
||||||
```
|
|
||||||
|
|
||||||
- `guest_os="windows"` instructs `quickemu` to optimise for Windows.
|
|
||||||
- `fixed_iso=` specifies the ISO image that provides VirtIO drivers.
|
|
||||||
- `tpm="on"` instructs `quickemu` to create a software emulated TPM
|
|
||||||
device using `swtpm`.
|
|
||||||
|
|
||||||
# AUTHORS
|
# AUTHORS
|
||||||
|
|
||||||
|
@ -411,4 +487,4 @@ Submit bug reports online at:
|
||||||
|
|
||||||
Full sources at: <https://github.com/quickemu-project/quickemu>
|
Full sources at: <https://github.com/quickemu-project/quickemu>
|
||||||
|
|
||||||
quickemu(1), quickemu_conf(1), quickgui(1)
|
quickemu(1), quickemu_conf(5), quickgui(1)
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-schemas": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1721999734,
|
||||||
|
"narHash": "sha256-G5CxYeJVm4lcEtaO87LKzOsVnWeTcHGKbKxNamNWgOw=",
|
||||||
|
"rev": "0a5c42297d870156d9c57d8f99e476b738dcd982",
|
||||||
|
"revCount": 75,
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.1.5/0190ef2f-61e0-794b-ba14-e82f225e55e6/source.tar.gz"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://flakehub.com/f/DeterminateSystems/flake-schemas/%2A.tar.gz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1756217674,
|
||||||
|
"narHash": "sha256-TH1SfSP523QI7kcPiNtMAEuwZR3Jdz0MCDXPs7TS8uo=",
|
||||||
|
"rev": "4e7667a90c167f7a81d906e5a75cba4ad8bee620",
|
||||||
|
"revCount": 808864,
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2505.808864%2Brev-4e7667a90c167f7a81d906e5a75cba4ad8bee620/0198eaa3-105a-74fa-a9b2-0a930acea8de/source.tar.gz"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://flakehub.com/f/NixOS/nixpkgs/%2A.tar.gz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-schemas": "flake-schemas",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
{
|
||||||
|
description = "Quickemu flake";
|
||||||
|
inputs = {
|
||||||
|
flake-schemas.url = "https://flakehub.com/f/DeterminateSystems/flake-schemas/*.tar.gz";
|
||||||
|
nixpkgs.url = "https://flakehub.com/f/NixOS/nixpkgs/*.tar.gz";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = {
|
||||||
|
self,
|
||||||
|
flake-schemas,
|
||||||
|
nixpkgs,
|
||||||
|
}: let
|
||||||
|
# Define supported systems and a helper function for generating system-specific outputs
|
||||||
|
supportedSystems = [ "x86_64-linux" "x86_64-darwin" "aarch64-darwin" "aarch64-linux" ];
|
||||||
|
|
||||||
|
forEachSupportedSystem = f: nixpkgs.lib.genAttrs supportedSystems (system: f {
|
||||||
|
system = system;
|
||||||
|
pkgs = import nixpkgs { inherit system; };
|
||||||
|
});
|
||||||
|
in {
|
||||||
|
# Define schemas for the flake's outputs
|
||||||
|
schemas = flake-schemas.schemas;
|
||||||
|
|
||||||
|
# Define overlays for each supported system
|
||||||
|
overlays = {
|
||||||
|
default = final: prev: {
|
||||||
|
quickemu = final.callPackage ./package.nix { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Define packages for each supported system
|
||||||
|
packages = forEachSupportedSystem ({pkgs, system, ...}: rec {
|
||||||
|
quickemu = pkgs.callPackage ./package.nix { };
|
||||||
|
default = quickemu;
|
||||||
|
});
|
||||||
|
|
||||||
|
# Define devShells for each supported system
|
||||||
|
devShells = forEachSupportedSystem ({pkgs, system, ...}: {
|
||||||
|
default = pkgs.callPackage ./devshell.nix { };
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
518
macrecovery
518
macrecovery
|
@ -1,518 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
"""
|
|
||||||
Gather recovery information for Macs.
|
|
||||||
|
|
||||||
Copyright (c) 2019, vit9696
|
|
||||||
"""
|
|
||||||
|
|
||||||
from __future__ import print_function
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import binascii
|
|
||||||
import datetime
|
|
||||||
import hashlib
|
|
||||||
import json
|
|
||||||
import linecache
|
|
||||||
import os
|
|
||||||
import random
|
|
||||||
import struct
|
|
||||||
import sys
|
|
||||||
import textwrap
|
|
||||||
import time
|
|
||||||
|
|
||||||
try:
|
|
||||||
from urllib.request import Request,HTTPError,urlopen
|
|
||||||
from urllib.parse import urlencode,urlparse
|
|
||||||
except ImportError:
|
|
||||||
from urllib2 import Request,HTTPError,urlopen
|
|
||||||
from urllib import urlencode
|
|
||||||
from urlparse import urlparse
|
|
||||||
|
|
||||||
SELF_DIR = os.path.dirname(os.path.realpath(__file__))
|
|
||||||
|
|
||||||
RECENT_MAC = 'Mac-7BA5B2D9E42DDD94'
|
|
||||||
MLB_ZERO = '00000000000000000'
|
|
||||||
MLB_VALID = 'C02749200YGJ803AX'
|
|
||||||
MLB_PRODUCT = '00000000000J80300'
|
|
||||||
|
|
||||||
TYPE_SID = 16
|
|
||||||
TYPE_K = 64
|
|
||||||
TYPE_FG = 64
|
|
||||||
|
|
||||||
INFO_PRODUCT = 'AP'
|
|
||||||
INFO_IMAGE_LINK = 'AU'
|
|
||||||
INFO_IMAGE_HASH = 'AH'
|
|
||||||
INFO_IMAGE_SESS = 'AT'
|
|
||||||
INFO_SIGN_LINK = 'CU'
|
|
||||||
INFO_SIGN_HASH = 'CH'
|
|
||||||
INFO_SIGN_SESS = 'CT'
|
|
||||||
INFO_REQURED = [ INFO_PRODUCT, INFO_IMAGE_LINK, INFO_IMAGE_HASH, INFO_IMAGE_SESS,
|
|
||||||
INFO_SIGN_LINK, INFO_SIGN_HASH, INFO_SIGN_SESS ]
|
|
||||||
|
|
||||||
def run_query(url, headers, post=None, raw=False):
|
|
||||||
if post is not None:
|
|
||||||
data = '\n'.join([entry + '=' + post[entry] for entry in post])
|
|
||||||
if sys.version_info[0] >= 3:
|
|
||||||
data = data.encode('utf-8')
|
|
||||||
else:
|
|
||||||
data = None
|
|
||||||
|
|
||||||
req = Request(url=url, headers=headers, data=data)
|
|
||||||
try:
|
|
||||||
response = urlopen(req)
|
|
||||||
if raw: return response
|
|
||||||
return dict(response.info()), response.read()
|
|
||||||
except HTTPError as e:
|
|
||||||
print('ERROR: "{}" when connecting to {}'.format(e, url))
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
def generate_id(type, id=None):
|
|
||||||
valid_chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']
|
|
||||||
if id is None:
|
|
||||||
return ''.join(random.choice(valid_chars) for i in range(type))
|
|
||||||
return id
|
|
||||||
|
|
||||||
def product_mlb(mlb):
|
|
||||||
return '00000000000' + mlb[11] + mlb[12] + mlb[13] + mlb[14] + '00'
|
|
||||||
|
|
||||||
def mlb_from_eeee(eeee):
|
|
||||||
if len(eeee) != 4:
|
|
||||||
print('ERROR: Invalid EEEE code length!')
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
return '00000000000' + eeee + '00'
|
|
||||||
|
|
||||||
def int_from_unsigned_bytes(bytes, byteorder):
|
|
||||||
if byteorder == 'little': bytes = bytes[::-1]
|
|
||||||
encoded = binascii.hexlify(bytes)
|
|
||||||
return int(encoded, 16)
|
|
||||||
|
|
||||||
# zhangyoufu https://gist.github.com/MCJack123/943eaca762730ca4b7ae460b731b68e7#gistcomment-3061078 2021-10-08
|
|
||||||
Apple_EFI_ROM_public_key_1 = 0xC3E748CAD9CD384329E10E25A91E43E1A762FF529ADE578C935BDDF9B13F2179D4855E6FC89E9E29CA12517D17DFA1EDCE0BEBF0EA7B461FFE61D94E2BDF72C196F89ACD3536B644064014DAE25A15DB6BB0852ECBD120916318D1CCDEA3C84C92ED743FC176D0BACA920D3FCF3158AFF731F88CE0623182A8ED67E650515F75745909F07D415F55FC15A35654D118C55A462D37A3ACDA08612F3F3F6571761EFCCBCC299AEE99B3A4FD6212CCFFF5EF37A2C334E871191F7E1C31960E010A54E86FA3F62E6D6905E1CD57732410A3EB0C6B4DEFDABE9F59BF1618758C751CD56CEF851D1C0EAA1C558E37AC108DA9089863D20E2E7E4BF475EC66FE6B3EFDCF
|
|
||||||
|
|
||||||
ChunkListHeader = struct.Struct('<4sIBBBxQQQ')
|
|
||||||
assert ChunkListHeader.size == 0x24
|
|
||||||
|
|
||||||
Chunk = struct.Struct('<I32s')
|
|
||||||
assert Chunk.size == 0x24
|
|
||||||
|
|
||||||
def verify_chunklist(cnkpath):
|
|
||||||
with open(cnkpath, 'rb') as f:
|
|
||||||
hash_ctx = hashlib.sha256()
|
|
||||||
data = f.read(ChunkListHeader.size)
|
|
||||||
hash_ctx.update(data)
|
|
||||||
magic, header_size, file_version, chunk_method, signature_method, chunk_count, chunk_offset, signature_offset = ChunkListHeader.unpack(data)
|
|
||||||
assert magic == b'CNKL'
|
|
||||||
assert header_size == ChunkListHeader.size
|
|
||||||
assert file_version == 1
|
|
||||||
assert chunk_method == 1
|
|
||||||
assert signature_method in [1, 2]
|
|
||||||
assert chunk_count > 0
|
|
||||||
assert chunk_offset == 0x24
|
|
||||||
assert signature_offset == chunk_offset + Chunk.size * chunk_count
|
|
||||||
for i in range(chunk_count):
|
|
||||||
data = f.read(Chunk.size)
|
|
||||||
hash_ctx.update(data)
|
|
||||||
chunk_size, chunk_sha256 = Chunk.unpack(data)
|
|
||||||
yield chunk_size, chunk_sha256
|
|
||||||
digest = hash_ctx.digest()
|
|
||||||
if signature_method == 1:
|
|
||||||
data = f.read(256)
|
|
||||||
assert len(data) == 256
|
|
||||||
signature = int_from_unsigned_bytes(data, 'little')
|
|
||||||
plaintext = 0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003031300d0609608648016503040201050004200000000000000000000000000000000000000000000000000000000000000000 | int_from_unsigned_bytes(digest, 'big')
|
|
||||||
assert pow(signature, 0x10001, Apple_EFI_ROM_public_key_1) == plaintext
|
|
||||||
elif signature_method == 2:
|
|
||||||
data = f.read(32)
|
|
||||||
assert data == digest
|
|
||||||
raise RuntimeError('Chunklist missing digital signature')
|
|
||||||
else:
|
|
||||||
raise NotImplementedError
|
|
||||||
assert f.read(1) == b''
|
|
||||||
|
|
||||||
def get_session(args):
|
|
||||||
headers = {
|
|
||||||
'Host' : 'osrecovery.apple.com',
|
|
||||||
'Connection': 'close',
|
|
||||||
'User-Agent': 'InternetRecovery/1.0',
|
|
||||||
}
|
|
||||||
|
|
||||||
headers, output = run_query('http://osrecovery.apple.com/', headers)
|
|
||||||
|
|
||||||
if args.verbose:
|
|
||||||
print('Session headers:')
|
|
||||||
for header in headers:
|
|
||||||
print('{}: {}'.format(header, headers[header]))
|
|
||||||
|
|
||||||
for header in headers:
|
|
||||||
if header.lower() == 'set-cookie':
|
|
||||||
cookies = headers[header].split('; ')
|
|
||||||
for cookie in cookies:
|
|
||||||
if cookie.startswith('session='):
|
|
||||||
return cookie
|
|
||||||
|
|
||||||
raise RuntimeError('No session in headers ' + str(headers))
|
|
||||||
|
|
||||||
def get_image_info(session, bid, mlb=MLB_ZERO, diag = False, os_type = 'default', cid=None):
|
|
||||||
headers = {
|
|
||||||
'Host' : 'osrecovery.apple.com',
|
|
||||||
'Connection' : 'close',
|
|
||||||
'User-Agent' : 'InternetRecovery/1.0',
|
|
||||||
'Cookie' : session,
|
|
||||||
'Content-Type': 'text/plain',
|
|
||||||
}
|
|
||||||
|
|
||||||
post = {
|
|
||||||
'cid': generate_id(TYPE_SID, cid),
|
|
||||||
'sn' : mlb,
|
|
||||||
'bid': bid,
|
|
||||||
'k' : generate_id(TYPE_K),
|
|
||||||
'fg' : generate_id(TYPE_FG)
|
|
||||||
}
|
|
||||||
|
|
||||||
if diag:
|
|
||||||
url = 'http://osrecovery.apple.com/InstallationPayload/Diagnostics'
|
|
||||||
else:
|
|
||||||
url = 'http://osrecovery.apple.com/InstallationPayload/RecoveryImage'
|
|
||||||
post['os'] = os_type
|
|
||||||
|
|
||||||
headers, output = run_query(url, headers, post)
|
|
||||||
|
|
||||||
if sys.version_info[0] >= 3:
|
|
||||||
output = output.decode('utf-8')
|
|
||||||
|
|
||||||
info = {}
|
|
||||||
for line in output.split('\n'):
|
|
||||||
try:
|
|
||||||
key, value = line.split(': ')
|
|
||||||
info[key] = value
|
|
||||||
except:
|
|
||||||
continue
|
|
||||||
|
|
||||||
for k in INFO_REQURED:
|
|
||||||
if k not in info:
|
|
||||||
raise RuntimeError('Missing key ' + k)
|
|
||||||
|
|
||||||
return info
|
|
||||||
|
|
||||||
def save_image(url, sess, filename='', dir=''):
|
|
||||||
purl = urlparse(url)
|
|
||||||
headers = {
|
|
||||||
'Host' : purl.hostname,
|
|
||||||
'Connection': 'close',
|
|
||||||
'User-Agent': 'InternetRecovery/1.0',
|
|
||||||
'Cookie' : '='.join(['AssetToken', sess])
|
|
||||||
}
|
|
||||||
|
|
||||||
if filename == '':
|
|
||||||
filename = os.path.basename(purl.path)
|
|
||||||
if filename.find('/') >= 0 or filename == '':
|
|
||||||
raise RuntimeError('Invalid save path ' + filename)
|
|
||||||
|
|
||||||
print('Saving ' + url + ' to ' + filename + '...')
|
|
||||||
|
|
||||||
with open (os.path.join(dir, filename), 'wb') as fh:
|
|
||||||
response = run_query(url, headers, raw=True)
|
|
||||||
size = 0
|
|
||||||
while True:
|
|
||||||
chunk = response.read(2**20)
|
|
||||||
if not chunk:
|
|
||||||
break
|
|
||||||
fh.write(chunk)
|
|
||||||
size += len(chunk)
|
|
||||||
print('\r{} MBs downloaded...'.format(size / (2**20)), end='')
|
|
||||||
sys.stdout.flush()
|
|
||||||
print('\rDownload complete!')
|
|
||||||
|
|
||||||
return os.path.join(dir, os.path.basename(filename))
|
|
||||||
|
|
||||||
def verify_image(dmgpath, cnkpath):
|
|
||||||
print('Verifying image with chunklist...')
|
|
||||||
|
|
||||||
with open (dmgpath, 'rb') as dmgf:
|
|
||||||
cnkcount = 0
|
|
||||||
for cnksize, cnkhash in verify_chunklist(cnkpath):
|
|
||||||
cnkcount += 1
|
|
||||||
print('\rChunk {} ({} bytes)'.format(cnkcount, cnksize), end='')
|
|
||||||
sys.stdout.flush()
|
|
||||||
cnk = dmgf.read(cnksize)
|
|
||||||
if len(cnk) != cnksize:
|
|
||||||
raise RuntimeError('Invalid chunk {} size: expected {}, read {}'.format(cnkcount, cnksize, len(cnk)))
|
|
||||||
if hashlib.sha256(cnk).digest() != cnkhash:
|
|
||||||
raise RuntimeError('Invalid chunk {}: hash mismatch'.format(cnkcount))
|
|
||||||
if dmgf.read(1) != b'':
|
|
||||||
raise RuntimeError('Invalid image: larger than chunklist')
|
|
||||||
print('\rImage verification complete!')
|
|
||||||
|
|
||||||
def action_download(args):
|
|
||||||
"""
|
|
||||||
Reference information for queries:
|
|
||||||
|
|
||||||
Recovery latest:
|
|
||||||
cid=3076CE439155BA14
|
|
||||||
sn=...
|
|
||||||
bid=Mac-E43C1C25D4880AD6
|
|
||||||
k=4BE523BB136EB12B1758C70DB43BDD485EBCB6A457854245F9E9FF0587FB790C
|
|
||||||
os=latest
|
|
||||||
fg=B2E6AA07DB9088BE5BDB38DB2EA824FDDFB6C3AC5272203B32D89F9D8E3528DC
|
|
||||||
|
|
||||||
Recovery default:
|
|
||||||
cid=4A35CB95FF396EE7
|
|
||||||
sn=...
|
|
||||||
bid=Mac-E43C1C25D4880AD6
|
|
||||||
k=0A385E6FFC3DDD990A8A1F4EC8B98C92CA5E19C9FF1DD26508C54936D8523121
|
|
||||||
os=default
|
|
||||||
fg=B2E6AA07DB9088BE5BDB38DB2EA824FDDFB6C3AC5272203B32D89F9D8E3528DC
|
|
||||||
|
|
||||||
Diagnostics:
|
|
||||||
cid=050C59B51497CEC8
|
|
||||||
sn=...
|
|
||||||
bid=Mac-E43C1C25D4880AD6
|
|
||||||
k=37D42A8282FE04A12A7D946304F403E56A2155B9622B385F3EB959A2FBAB8C93
|
|
||||||
fg=B2E6AA07DB9088BE5BDB38DB2EA824FDDFB6C3AC5272203B32D89F9D8E3528DC
|
|
||||||
"""
|
|
||||||
|
|
||||||
session = get_session(args)
|
|
||||||
info = get_image_info(session, bid=args.board_id, mlb=args.mlb,
|
|
||||||
diag=args.diagnostics, os_type=args.os_type)
|
|
||||||
if args.verbose:
|
|
||||||
print(info)
|
|
||||||
print('Downloading ' + info[INFO_PRODUCT] + '...')
|
|
||||||
dmgname = '' if args.basename == '' else args.basename + '.dmg'
|
|
||||||
dmgpath = save_image(info[INFO_IMAGE_LINK], info[INFO_IMAGE_SESS], dmgname, args.outdir)
|
|
||||||
cnkname = '' if args.basename == '' else args.basename + '.chunklist'
|
|
||||||
cnkpath = save_image(info[INFO_SIGN_LINK], info[INFO_SIGN_SESS], cnkname, args.outdir)
|
|
||||||
try:
|
|
||||||
verify_image(dmgpath, cnkpath)
|
|
||||||
return 0
|
|
||||||
except Exception as err:
|
|
||||||
if isinstance(err, AssertionError) and str(err)=='':
|
|
||||||
try:
|
|
||||||
tb = sys.exc_info()[2]
|
|
||||||
while tb.tb_next:
|
|
||||||
tb = tb.tb_next
|
|
||||||
err = linecache.getline(tb.tb_frame.f_code.co_filename, tb.tb_lineno, tb.tb_frame.f_globals).strip()
|
|
||||||
except:
|
|
||||||
err = "Invalid chunklist"
|
|
||||||
print('\rImage verification failed. ({})'.format(err))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
def action_selfcheck(args):
|
|
||||||
"""
|
|
||||||
Sanity check server logic for recovery:
|
|
||||||
|
|
||||||
if not valid(bid):
|
|
||||||
return error()
|
|
||||||
ppp = get_ppp(sn)
|
|
||||||
if not valid(ppp):
|
|
||||||
return latest_recovery(bid = bid) # Returns newest for bid.
|
|
||||||
if valid(sn):
|
|
||||||
if os == 'default':
|
|
||||||
return default_recovery(sn = sn, ppp = ppp) # Returns oldest for sn.
|
|
||||||
else:
|
|
||||||
return latest_recovery(sn = sn, ppp = ppp) # Returns newest for sn.
|
|
||||||
return default_recovery(ppp = ppp) # Returns oldest.
|
|
||||||
"""
|
|
||||||
|
|
||||||
session = get_session(args)
|
|
||||||
valid_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_VALID,
|
|
||||||
diag=False, os_type='default')
|
|
||||||
valid_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_VALID,
|
|
||||||
diag=False, os_type='latest')
|
|
||||||
product_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_PRODUCT,
|
|
||||||
diag=False, os_type='default')
|
|
||||||
product_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_PRODUCT,
|
|
||||||
diag=False, os_type='latest')
|
|
||||||
generic_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
|
|
||||||
diag=False, os_type='default')
|
|
||||||
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
|
|
||||||
diag=False, os_type='latest')
|
|
||||||
|
|
||||||
if args.verbose:
|
|
||||||
print(valid_default)
|
|
||||||
print(valid_latest)
|
|
||||||
print(product_default)
|
|
||||||
print(product_latest)
|
|
||||||
print(generic_default)
|
|
||||||
print(generic_latest)
|
|
||||||
|
|
||||||
if valid_default[INFO_PRODUCT] == valid_latest[INFO_PRODUCT]:
|
|
||||||
# Valid MLB must give different default and latest if this is not a too new product.
|
|
||||||
print('ERROR: Cannot determine any previous product, got {}'.format(valid_default[INFO_PRODUCT]))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
if product_default[INFO_PRODUCT] != product_latest[INFO_PRODUCT]:
|
|
||||||
# Product-only MLB must give the same value for default and latest.
|
|
||||||
print('ERROR: Latest and default do not match for product MLB, got {} and {}'.format(
|
|
||||||
product_default[INFO_PRODUCT], product_latest[INFO_PRODUCT]))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
if generic_default[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
|
|
||||||
# Zero MLB always give the same value for default and latest.
|
|
||||||
print('ERROR: Generic MLB gives different product, got {} and {}'.format(
|
|
||||||
generic_default[INFO_PRODUCT], generic_latest[INFO_PRODUCT]))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
if valid_latest[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
|
|
||||||
# Valid MLB must always equal generic MLB.
|
|
||||||
print('ERROR: Cannot determine unified latest product, got {} and {}'.format(
|
|
||||||
valid_latest[INFO_PRODUCT], generic_latest[INFO_PRODUCT]))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
if product_default[INFO_PRODUCT] != valid_default[INFO_PRODUCT]:
|
|
||||||
# Product-only MLB can give the same value with valid default MLB.
|
|
||||||
# This is not an error for all models, but for our chosen code it is.
|
|
||||||
print('ERROR: Valid and product MLB give mismatch, got {} and {}'.format(
|
|
||||||
product_default[INFO_PRODUCT], valid_default[INFO_PRODUCT]))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
print('SUCCESS: Found no discrepancies with MLB validation algorithm!')
|
|
||||||
return 0
|
|
||||||
|
|
||||||
def action_verify(args):
|
|
||||||
"""
|
|
||||||
Try to verify MLB serial number.
|
|
||||||
"""
|
|
||||||
session = get_session(args)
|
|
||||||
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
|
|
||||||
diag=False, os_type='latest')
|
|
||||||
uvalid_default = get_image_info(session, bid=args.board_id, mlb=args.mlb,
|
|
||||||
diag=False, os_type='default')
|
|
||||||
uvalid_latest = get_image_info(session, bid=args.board_id, mlb=args.mlb,
|
|
||||||
diag=False, os_type='latest')
|
|
||||||
uproduct_default = get_image_info(session, bid=args.board_id, mlb=product_mlb(args.mlb),
|
|
||||||
diag=False, os_type='default')
|
|
||||||
|
|
||||||
if args.verbose:
|
|
||||||
print(generic_latest)
|
|
||||||
print(uvalid_default)
|
|
||||||
print(uvalid_latest)
|
|
||||||
print(uproduct_default)
|
|
||||||
|
|
||||||
# Verify our MLB number.
|
|
||||||
if uvalid_default[INFO_PRODUCT] != uvalid_latest[INFO_PRODUCT]:
|
|
||||||
if uvalid_latest[INFO_PRODUCT] == generic_latest[INFO_PRODUCT]:
|
|
||||||
print('SUCCESS: {} MLB looks valid and supported!'.format(args.mlb))
|
|
||||||
else:
|
|
||||||
print('SUCCESS: {} MLB looks valid, but probably unsupported!'.format(args.mlb))
|
|
||||||
return 0
|
|
||||||
|
|
||||||
print('UNKNOWN: Run selfcheck, check your board-id, or try again later!')
|
|
||||||
|
|
||||||
# Here we have matching default and latest products. This can only be true for very
|
|
||||||
# new models. These models get either latest or special builds.
|
|
||||||
if uvalid_default[INFO_PRODUCT] == generic_latest[INFO_PRODUCT]:
|
|
||||||
print('UNKNOWN: {} MLB can be valid if very new!'.format(args.mlb))
|
|
||||||
return 0
|
|
||||||
if uproduct_default[INFO_PRODUCT] != uvalid_default[INFO_PRODUCT]:
|
|
||||||
print('UNKNOWN: {} MLB looks invalid, other models use product {} instead of {}!'.format(
|
|
||||||
args.mlb, uproduct_default[INFO_PRODUCT], uvalid_default[INFO_PRODUCT]))
|
|
||||||
return 0
|
|
||||||
print('UNKNOWN: {} MLB can be valid if very new and using special builds!'.format(args.mlb))
|
|
||||||
return 0
|
|
||||||
|
|
||||||
def action_guess(args):
|
|
||||||
"""
|
|
||||||
Attempt to guess which model does this MLB belong.
|
|
||||||
"""
|
|
||||||
|
|
||||||
mlb = args.mlb
|
|
||||||
anon = mlb.startswith('000')
|
|
||||||
|
|
||||||
with open(args.board_db, 'r') as fh:
|
|
||||||
db = json.load(fh)
|
|
||||||
|
|
||||||
supported = {}
|
|
||||||
|
|
||||||
session = get_session(args)
|
|
||||||
|
|
||||||
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
|
|
||||||
diag=False, os_type='latest')
|
|
||||||
|
|
||||||
for model in db:
|
|
||||||
try:
|
|
||||||
if anon:
|
|
||||||
# For anonymous lookup check when given model does not match latest.
|
|
||||||
model_latest = get_image_info(session, bid=model, mlb=MLB_ZERO,
|
|
||||||
diag=False, os_type='latest')
|
|
||||||
|
|
||||||
if model_latest[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
|
|
||||||
if db[model] == 'current':
|
|
||||||
print('WARN: Skipped {} due to using latest product {} instead of {}'.format(
|
|
||||||
model, model_latest[INFO_PRODUCT], generic_latest[INFO_PRODUCT]))
|
|
||||||
continue
|
|
||||||
|
|
||||||
user_default = get_image_info(session, bid=model, mlb=mlb,
|
|
||||||
diag=False, os_type='default')
|
|
||||||
|
|
||||||
if user_default[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
|
|
||||||
supported[model] = [db[model], user_default[INFO_PRODUCT], generic_latest[INFO_PRODUCT]]
|
|
||||||
else:
|
|
||||||
# For normal lookup check when given model has mismatching normal and latest.
|
|
||||||
user_latest = get_image_info(session, bid=model, mlb=mlb,
|
|
||||||
diag=False, os_type='latest')
|
|
||||||
|
|
||||||
user_default = get_image_info(session, bid=model, mlb=mlb,
|
|
||||||
diag=False, os_type='default')
|
|
||||||
|
|
||||||
if user_latest[INFO_PRODUCT] != user_default[INFO_PRODUCT]:
|
|
||||||
supported[model] = [db[model], user_default[INFO_PRODUCT], user_latest[INFO_PRODUCT]]
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print('WARN: Failed to check {}, exception: {}'.format(model, str(e)))
|
|
||||||
|
|
||||||
if len(supported) > 0:
|
|
||||||
print('SUCCESS: MLB {} looks supported for:'.format(mlb))
|
|
||||||
for model in supported:
|
|
||||||
print('- {}, up to {}, default: {}, latest: {}'.format(model, supported[model][0],
|
|
||||||
supported[model][1], supported[model][2]))
|
|
||||||
return 0
|
|
||||||
|
|
||||||
print('UNKNOWN: Failed to determine supported models for MLB {}!'.format(mlb))
|
|
||||||
|
|
||||||
def main():
|
|
||||||
parser = argparse.ArgumentParser(description='Gather recovery information for Macs')
|
|
||||||
parser.add_argument('action', choices = ['download', 'selfcheck', 'verify', 'guess'],
|
|
||||||
help='Action to perform: "download" - performs recovery downloading,'
|
|
||||||
' "selfcheck" checks whether MLB serial validation is possible, "verify" performs'
|
|
||||||
' MLB serial verification, "guess" tries to find suitable mac model for MLB.')
|
|
||||||
parser.add_argument('-o', '--outdir', type=str, default=os.getcwd(),
|
|
||||||
help='customise output directory for downloading, defaults to current directory')
|
|
||||||
parser.add_argument('-n', '--basename', type=str, default='',
|
|
||||||
help='customise base name for downloading, defaults to remote name')
|
|
||||||
parser.add_argument('-b', '--board-id', type=str, default=RECENT_MAC,
|
|
||||||
help='use specified board identifier for downloading, defaults to ' + RECENT_MAC)
|
|
||||||
parser.add_argument('-m', '--mlb', type=str, default=MLB_ZERO,
|
|
||||||
help='use specified logic board serial for downloading, defaults to ' + MLB_ZERO)
|
|
||||||
parser.add_argument('-e', '--code', type=str, default='',
|
|
||||||
help='generate product logic board serial with specified product EEEE code')
|
|
||||||
parser.add_argument('-os', '--os-type', type=str, default='default', choices = ['default', 'latest'],
|
|
||||||
help='use specified os type, defaults to default ' + MLB_ZERO)
|
|
||||||
parser.add_argument('-diag', '--diagnostics', action='store_true', help='download diagnostics image')
|
|
||||||
parser.add_argument('-v', '--verbose', action='store_true', help='print debug information')
|
|
||||||
parser.add_argument('-db', '--board-db', type=str, default=os.path.join(SELF_DIR, 'boards.json'),
|
|
||||||
help='use custom board list for checking, defaults to boards.json')
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
if args.code != '':
|
|
||||||
args.mlb = mlb_from_eeee(args.code)
|
|
||||||
|
|
||||||
if len(args.mlb) != 17:
|
|
||||||
print('ERROR: Cannot use MLBs in non 17 character format!')
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
if args.action == 'download':
|
|
||||||
return action_download(args)
|
|
||||||
elif args.action == 'selfcheck':
|
|
||||||
return action_selfcheck(args)
|
|
||||||
elif args.action == 'verify':
|
|
||||||
return action_verify(args)
|
|
||||||
elif args.action == 'guess':
|
|
||||||
return action_guess(args)
|
|
||||||
else:
|
|
||||||
assert(False)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.exit(main())
|
|
|
@ -0,0 +1,107 @@
|
||||||
|
{ lib
|
||||||
|
, fetchFromGitHub
|
||||||
|
, installShellFiles
|
||||||
|
, makeWrapper
|
||||||
|
, stdenv
|
||||||
|
, testers
|
||||||
|
, cdrtools
|
||||||
|
, curl
|
||||||
|
, gawk
|
||||||
|
, glxinfo
|
||||||
|
, gnugrep
|
||||||
|
, gnused
|
||||||
|
, jq
|
||||||
|
, pciutils
|
||||||
|
, procps
|
||||||
|
, python3
|
||||||
|
, qemu_full
|
||||||
|
, samba
|
||||||
|
, socat
|
||||||
|
, spice-gtk
|
||||||
|
, swtpm
|
||||||
|
, unzip
|
||||||
|
, usbutils
|
||||||
|
, util-linux
|
||||||
|
, xdg-user-dirs
|
||||||
|
, xrandr
|
||||||
|
, zsync
|
||||||
|
, OVMF
|
||||||
|
, OVMFFull
|
||||||
|
, quickemu
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
runtimePaths = [
|
||||||
|
cdrtools
|
||||||
|
curl
|
||||||
|
gawk
|
||||||
|
gnugrep
|
||||||
|
gnused
|
||||||
|
jq
|
||||||
|
pciutils
|
||||||
|
procps
|
||||||
|
python3
|
||||||
|
qemu_full
|
||||||
|
samba
|
||||||
|
socat
|
||||||
|
swtpm
|
||||||
|
unzip
|
||||||
|
util-linux
|
||||||
|
xrandr
|
||||||
|
zsync
|
||||||
|
OVMF
|
||||||
|
OVMFFull
|
||||||
|
] ++ lib.optionals stdenv.isLinux [
|
||||||
|
glxinfo
|
||||||
|
usbutils
|
||||||
|
xdg-user-dirs
|
||||||
|
];
|
||||||
|
versionMatches =
|
||||||
|
builtins.match ''
|
||||||
|
.*
|
||||||
|
readonly[[:blank:]]VERSION="([[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+)"
|
||||||
|
.*
|
||||||
|
'' (builtins.readFile ./quickemu);
|
||||||
|
in
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
pname = "quickemu";
|
||||||
|
version = builtins.concatStringsSep "" versionMatches;
|
||||||
|
src = lib.cleanSource ./.;
|
||||||
|
|
||||||
|
postPatch = ''
|
||||||
|
sed -i \
|
||||||
|
-e '/OVMF_CODE_4M.secboot.fd/s|ovmfs=(|ovmfs=("${OVMFFull.firmware}","${OVMFFull.variables}" |' \
|
||||||
|
-e '/OVMF_CODE_4M.fd/s|ovmfs=(|ovmfs=("${OVMF.firmware}","${OVMF.variables}" |' \
|
||||||
|
-e '/cp "''${VARS_IN}" "''${VARS_OUT}"/a chmod +w "''${VARS_OUT}"' \
|
||||||
|
-e 's,\$(command -v smbd),${samba}/bin/smbd,' \
|
||||||
|
quickemu
|
||||||
|
'';
|
||||||
|
|
||||||
|
nativeBuildInputs = [ makeWrapper installShellFiles ];
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
runHook preInstall
|
||||||
|
|
||||||
|
installManPage docs/quickget.1 docs/quickemu.1 docs/quickemu_conf.5
|
||||||
|
install -Dm755 -t "$out/bin" chunkcheck quickemu quickget quickreport
|
||||||
|
|
||||||
|
# spice-gtk needs to be put in suffix so that when virtualisation.spiceUSBRedirection
|
||||||
|
# is enabled, the wrapped spice-client-glib-usb-acl-helper is used
|
||||||
|
for f in chunkcheck quickget quickemu quickreport; do
|
||||||
|
wrapProgram $out/bin/$f \
|
||||||
|
--prefix PATH : "${lib.makeBinPath runtimePaths}" \
|
||||||
|
--suffix PATH : "${lib.makeBinPath [ spice-gtk ]}"
|
||||||
|
done
|
||||||
|
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru.tests = testers.testVersion { package = quickemu; };
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "Quickly create and run optimised Windows, macOS and Linux virtual machines";
|
||||||
|
homepage = "https://github.com/quickemu-project/quickemu";
|
||||||
|
mainProgram = "quickemu";
|
||||||
|
license = lib.licenses.mit;
|
||||||
|
maintainers = with lib.maintainers; [ fedx-sudo flexiondotorg ];
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,121 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
quick_report() {
|
||||||
|
local GPUS
|
||||||
|
local OS_KERNEL
|
||||||
|
local PRETTY_NAME
|
||||||
|
local QUICKEMU
|
||||||
|
local VERSION
|
||||||
|
OS_KERNEL=$(uname -s)
|
||||||
|
|
||||||
|
if [ "${OS_KERNEL}" == "Darwin" ]; then
|
||||||
|
# Get macOS product name and version using swvers
|
||||||
|
if [ -x "$(command -v sw_vers)" ]; then
|
||||||
|
PRETTY_NAME="$(sw_vers -productName) $(sw_vers -productVersion)"
|
||||||
|
else
|
||||||
|
PRETTY_NAME="macOS"
|
||||||
|
fi
|
||||||
|
elif [ -e /etc/os-release ]; then
|
||||||
|
PRETTY_NAME=$(grep PRETTY_NAME /etc/os-release | cut -d'"' -f2)
|
||||||
|
else
|
||||||
|
PRETTY_NAME="Unknown OS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
CWD="$(dirname "${0}")"
|
||||||
|
if [ -x "${CWD}/quickemu" ]; then
|
||||||
|
QUICKEMU="${CWD}/quickemu"
|
||||||
|
elif [ -x "$(command -v quickemu)" ]; then
|
||||||
|
QUICKEMU="$(command -v quickemu)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "${QUICKEMU}" ]; then
|
||||||
|
VERSION=$(${QUICKEMU} --version)
|
||||||
|
echo \
|
||||||
|
"----------------------------------
|
||||||
|
Quickemu ${VERSION}
|
||||||
|
----------------------------------"
|
||||||
|
echo -e "Distro:\t${PRETTY_NAME}"
|
||||||
|
echo -e "Kernel:\t$(uname -s -r -m)"
|
||||||
|
|
||||||
|
if [ "${OS_KERNEL}" == "Darwin" ]; then
|
||||||
|
echo -e "Memory:\t$(($(sysctl -n hw.memsize) / (1048576*1024)))G"
|
||||||
|
else
|
||||||
|
# Determine the number of gigabytes of RAM in the host by extracting the first numerical value from the output.
|
||||||
|
echo -e "Memory:\t$(free --giga -h | tr ' ' '\n' | grep -m 1 "[0-9]" | cut -d'G' -f 1)G"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Break IFS on new line
|
||||||
|
IFS=$'\n'
|
||||||
|
if [ "${OS_KERNEL}" == "Darwin" ]; then
|
||||||
|
# Get GPU information using system_profiler
|
||||||
|
GPUS=$(system_profiler SPDisplaysDataType | grep "Chipset Model" | awk -F: '{print $2}' | sed 's/^ *//')
|
||||||
|
else
|
||||||
|
GPUS=$(lspci | grep -i vga | cut -d':' -f3)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$(echo "${GPUS}" | wc -l)" -eq 1 ]; then
|
||||||
|
echo "GPU:"
|
||||||
|
else
|
||||||
|
echo "GPUs:"
|
||||||
|
fi
|
||||||
|
for GPU in ${GPUS}; do
|
||||||
|
echo " -${GPU}"
|
||||||
|
done
|
||||||
|
else
|
||||||
|
echo \
|
||||||
|
"----------------------------------
|
||||||
|
Quickemu missing!
|
||||||
|
----------------------------------"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command -v curl &> /dev/null; then
|
||||||
|
VERSION=$(curl --version)
|
||||||
|
echo \
|
||||||
|
"----------------------------------
|
||||||
|
curl $(echo "${VERSION}" | head -n 1 | cut -d' ' -f2)
|
||||||
|
----------------------------------"
|
||||||
|
echo -e "Libraries:$(echo "${VERSION}" | head -n 1 | cut -d')' -f2-)"
|
||||||
|
echo -e "Protocols:$(echo "${VERSION}" | tail -n +3 | head -n 1 | cut -d':' -f2-)"
|
||||||
|
echo -e "Features: $(echo "${VERSION}" | tail -n +4 | head -n 1 | cut -d':' -f2-)"
|
||||||
|
else
|
||||||
|
echo \
|
||||||
|
"----------------------------------
|
||||||
|
curl missing
|
||||||
|
----------------------------------"
|
||||||
|
fi
|
||||||
|
|
||||||
|
local HOST_ARCH
|
||||||
|
HOST_ARCH=$(uname -m)
|
||||||
|
local QEMU_ARCH="${HOST_ARCH}"
|
||||||
|
if [ "${HOST_ARCH}" == "arm64" ]; then
|
||||||
|
QEMU_ARCH="aarch64"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command -v "qemu-system-${QEMU_ARCH}" &> /dev/null; then
|
||||||
|
VERSION=$("qemu-system-${QEMU_ARCH}" --version | head -n 1 | cut -d' ' -f4)
|
||||||
|
echo \
|
||||||
|
"----------------------------------
|
||||||
|
QEMU ${VERSION}
|
||||||
|
----------------------------------"
|
||||||
|
"qemu-system-${QEMU_ARCH}" -cpu help
|
||||||
|
else
|
||||||
|
echo \
|
||||||
|
"----------------------------------
|
||||||
|
QEMU missing
|
||||||
|
----------------------------------"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo \
|
||||||
|
"----------------------------------
|
||||||
|
CPU
|
||||||
|
----------------------------------"
|
||||||
|
if [ "${OS_KERNEL}" == "Darwin" ]; then
|
||||||
|
sysctl -n machdep.cpu.brand_string
|
||||||
|
else
|
||||||
|
lscpu
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
clear
|
||||||
|
quick_report | tee quickreport.txt
|
85
windowskey
85
windowskey
|
@ -1,85 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
|
|
||||||
import html.parser
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import urllib.request
|
|
||||||
|
|
||||||
|
|
||||||
"""
|
|
||||||
Download Windows product keys from MicroSoft
|
|
||||||
"""
|
|
||||||
|
|
||||||
key_page_url = "https://docs.microsoft.com/en-us/windows-server/get-started/kms-client-activation-keys"
|
|
||||||
|
|
||||||
|
|
||||||
def usage():
|
|
||||||
script = os.path.basename(sys.argv[0])
|
|
||||||
message = f"""Usage: {script} [windows-version]
|
|
||||||
|
|
||||||
To specify the version of Windows you'd like, pass a string that matches the
|
|
||||||
name of the operating system you'd like to download. Case doesn't matter, so
|
|
||||||
you can use "windows 10" or "Windows 10".
|
|
||||||
|
|
||||||
e.g.
|
|
||||||
|
|
||||||
{script} "Windows 10"
|
|
||||||
{script} "enterprise"
|
|
||||||
|
|
||||||
"""
|
|
||||||
print(message, file=sys.stderr)
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
|
|
||||||
def download_page(url):
|
|
||||||
response = urllib.request.urlopen(url)
|
|
||||||
return response.read().decode("utf-8")
|
|
||||||
|
|
||||||
|
|
||||||
class WindowsKeyPageParser(html.parser.HTMLParser):
|
|
||||||
def __init__(self, *, convert_charrefs=True):
|
|
||||||
super().__init__(convert_charrefs=True)
|
|
||||||
self.product_keys = {}
|
|
||||||
self.parsing_os = False
|
|
||||||
|
|
||||||
def handle_starttag(self, tag, attrs):
|
|
||||||
self.parsing_os = tag == "td"
|
|
||||||
|
|
||||||
def handle_endtag(self, tag):
|
|
||||||
self.parsing_os = False
|
|
||||||
|
|
||||||
def handle_data(self, data):
|
|
||||||
if self.parsing_os:
|
|
||||||
self.stash_table_cell(data)
|
|
||||||
|
|
||||||
def stash_table_cell(self, data):
|
|
||||||
if "Windows" in data:
|
|
||||||
self.current_os = data
|
|
||||||
else:
|
|
||||||
product_key = data
|
|
||||||
self.product_keys[self.current_os] = product_key
|
|
||||||
|
|
||||||
|
|
||||||
def find_keys_for_all_versions(markup):
|
|
||||||
parser = WindowsKeyPageParser()
|
|
||||||
parser.feed(markup)
|
|
||||||
return parser.product_keys
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
try:
|
|
||||||
arg = sys.argv[1]
|
|
||||||
except IndexError:
|
|
||||||
windows_version = ""
|
|
||||||
else:
|
|
||||||
if arg in ["-h", "--help"]:
|
|
||||||
usage()
|
|
||||||
windows_version = arg
|
|
||||||
|
|
||||||
markup = download_page(key_page_url)
|
|
||||||
product_keys = find_keys_for_all_versions(markup)
|
|
||||||
|
|
||||||
for os_name, product_key in product_keys.items():
|
|
||||||
if windows_version.lower() in os_name.lower():
|
|
||||||
print(f"{os_name}: {product_key}")
|
|
Loading…
Reference in New Issue