Compare commits
1115 Commits
Author | SHA1 | Date |
---|---|---|
|
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 | |
|
0c8e1a5205 | |
|
81856322a5 | |
|
132ae1c81c | |
|
841807afe6 | |
|
962ef63ad3 | |
|
708070739c | |
|
c58e5c5b98 | |
|
d958ae1dbe | |
|
a34221e63e | |
|
961a8a1820 | |
|
7a724e43f3 | |
|
b284e411a3 | |
|
7bee31c666 | |
|
b05dd50aea | |
|
acca8cc224 | |
|
b232bbfcfe | |
|
f217e63189 | |
|
d65d19211b | |
|
99e7677665 | |
|
66757f4b57 | |
|
6ea88b058d | |
|
8d4d82ccb5 | |
|
207f83c8ce | |
|
9383ce0eb7 | |
|
5d2cbb7790 | |
|
702f314589 | |
|
ba1a3f4f3b | |
|
e0fce7b1df | |
|
c52171e797 | |
|
62ddfc3a2c | |
|
26774bde57 | |
|
5ffd8c0626 | |
|
df5cb3c1b7 | |
|
75b97b4294 | |
|
58e69834cb | |
|
a1679d2566 | |
|
2a7fca0c7f | |
|
ae536570a4 | |
|
c3ae35b1f8 | |
|
5bff2110b3 | |
|
b67e31db16 | |
|
ca7faf6fad | |
|
2a5067f277 | |
|
a6c8b6b8b1 | |
|
9ebf81ba46 | |
|
055af8d741 | |
|
1e637c0c1e | |
|
f26a88bc5f | |
|
195959a0a9 | |
|
6706192132 | |
|
1a0867b771 | |
|
265be79777 | |
|
ad0f1f2d3d | |
|
1b3c113f8d | |
|
c0a8fe27a7 | |
|
5ac9a5706d | |
|
be81b6892f | |
|
39de883c40 | |
|
9f9b6183e2 | |
|
218e87990f | |
|
4906752519 | |
|
834be37c86 | |
|
b3846a549a | |
|
3665309a88 | |
|
b816a4aa89 | |
|
05c7511b2f | |
|
2574113fa1 | |
|
5d216914b8 | |
|
302cccab39 | |
|
b4d7c90b89 | |
|
50f63f94d8 | |
|
3288be8d06 | |
|
6ba173e85b | |
|
21a25d4740 | |
|
787253b2aa | |
|
d5798eeb01 | |
|
44cab4e971 | |
|
1586042e34 | |
|
e2e857030a | |
|
6eeb3db45c | |
|
392e74c16b | |
|
af051339ba | |
|
941b325269 | |
|
94f2aeb40d | |
|
8f8a6a60b4 | |
|
1ccfd8246c | |
|
4e516f7455 | |
|
9786f0d520 | |
|
ae15443da0 | |
|
4226c5ac27 | |
|
6545f87cdf | |
|
c7e91a0ea0 | |
|
513a1b18c9 | |
|
8bf84986b9 | |
|
008478d85e | |
|
4ce607e681 | |
|
51a6502a79 | |
|
4221302936 | |
|
5d26df5443 | |
|
d79dfb7240 | |
|
2c0b1f59b7 | |
|
b938e9e9e8 | |
|
3468c3a4d8 | |
|
031660cb4b | |
|
dc313fe383 | |
|
387d05615a | |
|
0762a2abd6 | |
|
a6217167b4 | |
|
8e9fba398d | |
|
d431d91618 | |
|
44a8c68aef | |
|
92371b60c3 | |
|
11dff38fa6 | |
|
eb8d4ec173 | |
|
8ee0d3a207 | |
|
ddc23b9f77 | |
|
215633947e | |
|
53a4100905 | |
|
b9ba135884 | |
|
ce1cadb09b | |
|
9d3e7dd4d5 | |
|
6e9405a42f |
|
@ -1,5 +1,3 @@
|
|||
# These are supported funding model platforms
|
||||
|
||||
github: flexiondotorg
|
||||
patreon: wimpysworld
|
||||
custom: https://wimpysworld.io/tip
|
||||
github: [flexiondotorg, philclifford, lj3954]
|
||||
|
|
|
@ -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 |
|
@ -0,0 +1,7 @@
|
|||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
# Check for updates to GitHub Actions every week
|
||||
interval: "weekly"
|
|
@ -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"
|
|
@ -1,25 +0,0 @@
|
|||
name: 👋 Greetings
|
||||
|
||||
on: [pull_request, issues]
|
||||
|
||||
jobs:
|
||||
greeting:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/first-interaction@v1
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
issue-message: |
|
||||
Hello there 👋
|
||||
Thanks for submitting your first issue to the Quickemu project 🐛 We'll try and take a look at your issue soon ⏲
|
||||
|
||||
In the meantime you might want to join the [Wimpys World Discord](https://wimpysworld.io/discord) 🗣 where we have a large community of Linux 🐧 enthusiasts and passionate open source developers 🧑💻
|
||||
|
||||
You might also be interested in following [Wimpys World Twitch 📡 channel](https://twitch.tv/WimpysWorld) where Wimpy streams let's code video, including this project, several times a week. A back catalog of past live stream and other Linux related content is available on [Wimpys World YouTube 📺 channel](https://youtube.com/WimpysWorld).
|
||||
pr-message: |
|
||||
Hello there 👋
|
||||
Thanks for submitting your first pull request to the Quickemu project 💪 We'll try to review your pull request soon ⏲
|
||||
|
||||
In the meantime you might want to join the [Wimpys World Discord](https://wimpysworld.io/discord) 🗣 where we have a large community of Linux 🐧 enthusiasts and passionate open source developers 🧑💻
|
||||
|
||||
You might also be interested in following [Wimpys World Twitch 📡 channel](https://twitch.tv/WimpysWorld) where Wimpy streams let's code video, including this project, several times a week. A back catalog of past live stream and other Linux related content is available on [Wimpys World YouTube 📺 channel](https://youtube.com/WimpysWorld).
|
|
@ -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
|
|
@ -0,0 +1,129 @@
|
|||
name: Publish Release 🏷️
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- "v?[0-9]+.[0-9]+.[0-9]+*"
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
tag:
|
||||
description: "The existing tag to publish"
|
||||
type: "string"
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
version-check:
|
||||
name: "Check versions ⚖️"
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- 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
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
gh release create "${{ github.ref }}" --draft --generate-notes
|
||||
|
||||
build-release:
|
||||
needs: [draft-release]
|
||||
name: "Build Release 👨🔧"
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Build and Upload .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
|
||||
gh release upload "${{ github.ref }}" "../quickemu_${REL_VER}-1_all.deb" --clobber
|
||||
|
||||
publish-release:
|
||||
needs: [build-release]
|
||||
name: "Publish Release 📤️"
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Publish release ${{ github.ref }}
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
if [ "$(gh release view "${{ github.ref }}" --json assets --template '{{len .assets}}')" -lt 0 ]; then
|
||||
exit 1
|
||||
fi
|
||||
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
|
||||
*.dmg
|
||||
*.fd
|
||||
*.fixed
|
||||
*.img
|
||||
*.iso
|
||||
*.ISO
|
||||
*.lock
|
||||
!flake.lock
|
||||
*.log
|
||||
*.markdownlint.jsonc
|
||||
*.markdownlint.yaml
|
||||
*.msi
|
||||
*.part
|
||||
*.permall
|
||||
|
@ -16,3 +21,4 @@
|
|||
*.sock
|
||||
*.xml
|
||||
*.zs-old
|
||||
.direnv/
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
[submodule "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
|
947
README.md
947
README.md
|
@ -1,870 +1,111 @@
|
|||
<h1 align="center">
|
||||
<img src=".github/logo.png" alt="Quickemu" width="256" />
|
||||
<div align="center">
|
||||
<img src=".github/logo.png" alt="Quickemu" width="256" />
|
||||
|
||||
# Quickemu
|
||||
|
||||
**Quickly create and run optimised Windows, macOS and Linux virtual machines:**
|
||||
|
||||
**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)"/>**
|
||||
</div>
|
||||
|
||||
<p align="center">
|
||||
<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>
|
||||
<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>
|
||||
|
||||
|
||||
# Introduction
|
||||
|
||||
**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 Server** 2022 2019 2016
|
||||
- [Ubuntu](https://ubuntu.com/desktop) and all the **[official Ubuntu
|
||||
flavours](https://ubuntu.com/download/flavours)**
|
||||
- **Nearly 1000 operating system editions are supported!**
|
||||
- Full SPICE support including host/guest clipboard sharing
|
||||
- VirtIO-webdavd file sharing for Linux and Windows guests
|
||||
- VirtIO-9p file sharing for Linux and macOS guests
|
||||
- [QEMU Guest Agent
|
||||
support](https://wiki.qemu.org/Features/GuestAgent); provides access
|
||||
to a system-level agent via standard QMP commands
|
||||
- Samba file sharing for Linux, macOS and Windows guests (*if `smbd`
|
||||
is installed on the host*)
|
||||
- VirGL acceleration
|
||||
- USB device pass-through
|
||||
- Smartcard pass-through
|
||||
- Automatic SSH port forwarding to guests
|
||||
- Network port forwarding
|
||||
- Full duplex audio
|
||||
- Braille support
|
||||
- EFI (with or without SecureBoot) and Legacy BIOS boot
|
||||
|
||||
## As featured on [Linux Matters](https://linuxmatters.sh) podcast!
|
||||
|
||||
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 -->
|
||||
|
||||
<div align="center">
|
||||
<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 />
|
||||
Quickemu
|
||||
</h1>
|
||||
<em>Linux Matters Podcast</em>
|
||||
</div>
|
||||
|
||||
<p align="center"><b>Quickly create and run optimised Windows, macOS and Linux desktop virtual machines.</b></p>
|
||||
<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>
|
||||
# Quick start
|
||||
|
||||
## Introduction
|
||||
[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:
|
||||
|
||||
Quickly create and run highly optimised desktop virtual machines for
|
||||
Linux, macOS and Windows; with just two commands. You decide what
|
||||
operating system you want to run and Quickemu will figure out the best
|
||||
way to do it for you. For example:
|
||||
- `quickget` automatically downloads the ISO image for the operating system you want to run and creates a configuration file for the virtual machine.
|
||||
|
||||
``` bash
|
||||
quickget ubuntu-mate 22.04
|
||||
quickemu --vm ubuntu-mate-22.04.conf
|
||||
``` shell
|
||||
quickget nixos unstable minimal
|
||||
```
|
||||
|
||||
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**.
|
||||
- `quickemu` starts the virtual machine using the configuration file created by `quickget`.
|
||||
|
||||
## Features
|
||||
|
||||
- **macOS** Monterey, Big Sur, Catalina, Mojave & High Sierra
|
||||
- **Windows** 8.1, 10 and 11 including TPM 2.0
|
||||
- [Ubuntu](https://ubuntu.com/desktop) and all the **[official Ubuntu
|
||||
flavours](https://ubuntu.com/download/flavours)**
|
||||
- **Over 360 operating system editions are supported!**
|
||||
- Full SPICE support including host/guest clipboard sharing
|
||||
- VirtIO-webdavd file sharing for Linux and Windows guests
|
||||
- VirtIO-9p file sharing for Linux and macOS guests
|
||||
- [QEMU Guest Agent
|
||||
support](https://wiki.qemu.org/Features/GuestAgent); provides access
|
||||
to a system-level agent via standard QMP commands
|
||||
- Samba file sharing for Linux, macOS and Windows guests (*if `smbd`
|
||||
is installed on the host*)
|
||||
- VirGL acceleration
|
||||
- USB device pass-through
|
||||
- Smartcard pass-through
|
||||
- Automatic SSH port forwarding to guests
|
||||
- Network port forwarding
|
||||
- Full duplex audio
|
||||
- Braille support
|
||||
- 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/)
|
||||
that attempts to automatically *"do the right thing"*, rather than
|
||||
expose exhaustive configuration options.
|
||||
|
||||
We have a Discord for this project:
|
||||
[](https://discord.gg/sNmz3uw)
|
||||
|
||||
See this (old) video where I explain some of my motivations for creating
|
||||
Quickemu.
|
||||
|
||||
[](https://www.youtube.com/watch?v=AOTYWEgw0hI)
|
||||
|
||||
## Requirements
|
||||
|
||||
- [QEMU](https://www.qemu.org/) (*6.0.0 or newer*) **with GTK, SDL,
|
||||
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
|
||||
``` shell
|
||||
quickemu --vm nixos-unstable-minimal.conf
|
||||
```
|
||||
|
||||
# Install Quickemu
|
||||
Execute `quickget` (with no arguments) to see a list of all the supported operating systems.
|
||||
|
||||
## Ubuntu
|
||||
## Demo
|
||||
|
||||
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:
|
||||
<div align="center">
|
||||
|
||||
``` bash
|
||||
sudo apt-add-repository ppa:flexiondotorg/quickemu
|
||||
sudo apt update
|
||||
sudo apt install quickemu
|
||||
```
|
||||
<a href="https://asciinema.org/a/658148?autoplay=1" target="_blank"><img src="https://asciinema.org/a/658148.svg" /></a>
|
||||
|
||||
## Other Linux
|
||||
</div>
|
||||
|
||||
``` bash
|
||||
git clone --filter=blob:none https://github.com/wimpysworld/quickemu
|
||||
cd quickemu
|
||||
```
|
||||
# Documentation
|
||||
|
||||
Now install all the **Requirements** documented above.
|
||||
The wiki describes how to get up and running with Quickemu and also covers more advanced configuration and usage.
|
||||
|
||||
### 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.
|
||||
|
||||
- `kubuntu` (Kubuntu)
|
||||
- `lubuntu` (Lubuntu)
|
||||
- `ubuntu-budgie` (Ubuntu Budgie)
|
||||
- `ubuntucinnamon` (Ubuntu Cinnamon)
|
||||
- `ubuntukylin` (Ubuntu Kylin)
|
||||
- `ubuntu-mate` (Ubuntu MATE)
|
||||
- `ubuntustudio` (Ubuntu Studio)
|
||||
- `ubuntu` (Ubuntu)
|
||||
- `ubuntu-unity` (Ubuntu Unity)
|
||||
- `xubuntu` (Xubuntu)
|
||||
|
||||
## Other Operating Systems
|
||||
|
||||
`quickget` also supports:
|
||||
|
||||
- `alma` (Alma Linux)
|
||||
- `alpine` (Alpine Linux)
|
||||
- `android` (Android x86)
|
||||
- `archcraft` (Archcraft)
|
||||
- `archlinux` (Arch Linux)
|
||||
- `arcolinux` (Arco Linux)
|
||||
- `batocera` (Batocera)
|
||||
- `blendos` (BlendOS)
|
||||
- `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)
|
||||
- `gentoo` (Gentoo)
|
||||
- `ghostbsd` (GhostBSD)
|
||||
- `haiku` (Haiku)
|
||||
- `kali` (Kali)
|
||||
- `kdeneon` (KDE Neon)
|
||||
- `kolibrios` (KolibriOS)
|
||||
- `linuxmint` (Linux Mint)
|
||||
- `lmde` (Linux Mint Debian Edition)
|
||||
- `mageia` (Mageia)
|
||||
- `manjaro` (Manjaro)
|
||||
- `mxlinux` (MX Linux)
|
||||
- `netboot` (netboot.xyz)
|
||||
- `netbsd` (NetBSD)
|
||||
- `nixos` (NixOS)
|
||||
- `openbsd` (OpenBSD)
|
||||
- `opensuse` (openSUSE)
|
||||
- `oraclelinux` (Oracle Linux)
|
||||
- `popos` (Pop!\_OS)
|
||||
- `reactos` (ReactOS)
|
||||
- `rebornos` (RebornOS)
|
||||
- `rockylinux` (Rocky Linux)
|
||||
- `siduction` (Siduction)
|
||||
- `slackware` (Slackware)
|
||||
- `solus` (Solus)
|
||||
- `tails` (Tails)
|
||||
- `truenas-core` (TrueNAS Core)
|
||||
- `truenas-scale` (TrueNAS Scale)
|
||||
- `void` (Void Linux)
|
||||
- `vxlinux` (VX Linux)
|
||||
- `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:
|
||||
|
||||
``` bash
|
||||
quickemu --vm debian-bullseye.conf
|
||||
```
|
||||
|
||||
- Complete the installation as normal.
|
||||
- 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
|
||||
|
||||
`quickget` automatically downloads a macOS recovery image and creates a
|
||||
virtual machine configuration.
|
||||
|
||||
``` bash
|
||||
quickget macos catalina
|
||||
quickemu --vm macos-catalina.conf
|
||||
```
|
||||
|
||||
macOS `high-sierra`, `mojave`, `catalina`, `big-sur` and `monterey` are
|
||||
supported.
|
||||
|
||||
- Use cursor keys and enter key to select the **macOS Base System**
|
||||
- From **macOS Utilities**
|
||||
- Click **Disk Utility** and **Continue**
|
||||
- Select `QEMU HARDDISK Media` (\~103.08GB) from the list and
|
||||
click **Erase**.
|
||||
- Enter a `Name:` for the disk
|
||||
- If you are installing macOS Mojave or later (Catalina, Big
|
||||
Sur, and Monterey), 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
|
||||
- `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 10 & 11 Guests
|
||||
|
||||
`quickget` can not download
|
||||
[Windows10](https://www.microsoft.com/software-download/windows10) and
|
||||
[Windows 11](https://www.microsoft.com/software-download/windows11)
|
||||
automatically, but does automatically create an optimised virtual
|
||||
machine configuration that you can just add an Windows .iso image to.
|
||||
This configuration also includes the [VirtIO drivers for
|
||||
Windows](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/).
|
||||
|
||||
``` 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 adminstrator 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="on"
|
||||
```
|
||||
|
||||
- `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
|
||||
--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.
|
||||
--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'
|
||||
--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.
|
||||
|
||||
# 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/>
|
||||
- [**Installation**](https://github.com/quickemu-project/quickemu/wiki/01-Installation) 💾
|
||||
- [**Create Linux virtual machines**](https://github.com/quickemu-project/quickemu/wiki/02-Create-Linux-virtual-machines) 🐧
|
||||
- [**Create macOS virtual machines**](https://github.com/quickemu-project/quickemu/wiki/03-Create-macOS-virtual-machines) 🍏
|
||||
- [**Create Windows virtual machines**](https://github.com/quickemu-project/quickemu/wiki/04-Create-Windows-virtual-machines) 🪟
|
||||
- [**Advanced quickemu configuration**](https://github.com/quickemu-project/quickemu/wiki/05-Advanced-quickemu-configuration) 🔧
|
||||
- [**Advanced quickget features**](https://github.com/quickemu-project/quickemu/wiki/06-Advanced-quickget-features) 🤓
|
||||
- [**Alternative frontends**](https://github.com/quickemu-project/quickemu/wiki/07-Alternative-frontends) 🧑💻
|
||||
- [**References**](https://github.com/quickemu-project/quickemu/wiki/08-References) 📚️
|
||||
|
|
|
@ -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 9a4b74daffbae575a547bc1272d6961992902215
|
||||
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()
|
|
@ -0,0 +1,5 @@
|
|||
quickemu (4.9.6-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Martin Wimpress <code@wimpress.io> Fri, 10 Nov 2023 14:49:08 +0000
|
|
@ -0,0 +1,46 @@
|
|||
Source: quickemu
|
||||
Section: utils
|
||||
Priority: optional
|
||||
Maintainer: Martin Wimpress <code@wimpress.io>
|
||||
Build-Depends:
|
||||
debhelper-compat (= 12),
|
||||
Standards-Version: 4.5.1
|
||||
Homepage: https://github.com/quickemu-project/quickemu
|
||||
Vcs-Browser: https://github.com/quickemu-project/quickemu
|
||||
Vcs-Git: https://github.com/quickemu-project/quickemu.git
|
||||
Rules-Requires-Root: no
|
||||
|
||||
Package: quickemu
|
||||
Architecture: all
|
||||
Depends:
|
||||
coreutils,
|
||||
curl,
|
||||
genisoimage,
|
||||
jq,
|
||||
mesa-utils,
|
||||
pciutils,
|
||||
procps,
|
||||
python3-minimal,
|
||||
qemu-system (>= 6.0),
|
||||
base-files (<< 13~) | qemu-system-modules-spice,
|
||||
socat,
|
||||
spice-client-gtk,
|
||||
swtpm,
|
||||
usbutils,
|
||||
util-linux,
|
||||
uuid-runtime,
|
||||
x11-xserver-utils,
|
||||
xdg-user-dirs,
|
||||
zsync,
|
||||
${misc:Depends},
|
||||
${shlibs:Depends},
|
||||
Suggests:
|
||||
virt-viewer,
|
||||
Description: Quickemu creates and runs optimised virtual machines.
|
||||
Simple script to "manage" Qemu virtual machines. Each virtual machine
|
||||
configuration is a few lines long requiring minimal setup. The main objective
|
||||
of the project is to enable quick testing of desktop Linux distributions where
|
||||
the virtual machines configuration and disk images can be stored anywhere,
|
||||
such as external USB storage or your home directory. Windows and macOS guests
|
||||
are also supported.
|
||||
.
|
|
@ -0,0 +1,45 @@
|
|||
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Upstream-Name: quickemu
|
||||
Upstream-Contact: Martin Wimpress <code@wimpress.io>
|
||||
Source: https://github.com/quickemu-project/quickemu
|
||||
|
||||
Files: *
|
||||
Copyright: 2020-2024 Martin Wimpress <code@wimpress.io>
|
||||
License: MIT
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
.
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
# 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
|
||||
Files: debian/*
|
||||
Copyright: 2021 - 2024 Martin Wimpress <code@wimpress.io>
|
||||
License: GPL-2+
|
||||
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
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
.
|
||||
This package is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>
|
||||
.
|
||||
On Debian systems, the complete text of the GNU General
|
||||
Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
|
|
@ -0,0 +1,4 @@
|
|||
chunkcheck usr/bin
|
||||
quickemu usr/bin
|
||||
quickget usr/bin
|
||||
quickreport usr/bin
|
|
@ -0,0 +1,7 @@
|
|||
#!/usr/bin/make -f
|
||||
|
||||
%:
|
||||
dh $@
|
||||
|
||||
override_dh_builddeb:
|
||||
dh_builddeb -- -Zgzip
|
|
@ -0,0 +1 @@
|
|||
3.0 (native)
|
|
@ -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
|
||||
bindir := $(PREFIX)/bin
|
||||
|
||||
all: quickget.1 quickemu.1 quickemu_conf.1
|
||||
all: quickget.1 quickemu.1 quickemu_conf.5
|
||||
|
||||
clean:
|
||||
rm *.1
|
||||
rm *.1 *.5
|
||||
|
||||
install_docs: all
|
||||
install -d $(DESTDIR)$(mandir)/man1
|
||||
install -d $(DESTDIR)$(mandir)/man5
|
||||
install -m 644 quickget.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
|
||||
|
||||
|
@ -26,17 +28,20 @@ install_bins:
|
|||
install -d $(DESTDIR)$(bindir)
|
||||
install -m 755 ../quickget $(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
|
||||
|
||||
uninstall::
|
||||
rm -f $(DESTDIR)$(mandir)/man1/quickget.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)/quickemu
|
||||
rm -f $(DESTDIR)$(bindir)/quickreport
|
||||
rm -f $(DESTDIR)$(bindir)/macrecovery
|
||||
rm -f $(DESTDIR)$(bindir)/chunkcheck
|
||||
|
||||
|
||||
.PHONY: all
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
PANDOC ?= pandoc
|
||||
PANDOC_OPTIONS = -f gfm+definition_lists
|
||||
|
||||
MANSECTION ?= 1
|
||||
.SUFFIXES: .1.md .1 .5.md .5
|
||||
|
||||
MANPAGE.md = $(PANDOC) --standalone $(PANDOCFLAGS) --to man
|
||||
|
||||
%.$(MANSECTION): %.$(MANSECTION).md
|
||||
$(MANPAGE.md) $< -o $@
|
||||
.1.md.1 .5.md.5:
|
||||
$(PANDOC) --standalone $(PANDOC_OPTIONS) --to man -o $@ $<
|
||||
|
|
1498
docs/quickemu.1
1498
docs/quickemu.1
File diff suppressed because it is too large
Load Diff
1040
docs/quickemu.1.md
1040
docs/quickemu.1.md
File diff suppressed because it is too large
Load Diff
|
@ -1,327 +0,0 @@
|
|||
.\" Automatically generated by Pandoc 2.19.2
|
||||
.\"
|
||||
.\" Define V font for inline verbatim, using C font in formats
|
||||
.\" that render this, and otherwise B font.
|
||||
.ie "\f[CB]x\f[]"x" \{\
|
||||
. ftr V B
|
||||
. ftr VI BI
|
||||
. ftr VB B
|
||||
. ftr VBI BI
|
||||
.\}
|
||||
.el \{\
|
||||
. ftr V CR
|
||||
. ftr VI CI
|
||||
. ftr VB CB
|
||||
. ftr VBI CBI
|
||||
.\}
|
||||
.TH "QUICKEMU_CONF" "1" "April 26, 2023" "quickemu_conf" "Quickemu Configuration Manual"
|
||||
.hy
|
||||
.SH NAME
|
||||
.PP
|
||||
quickemu_conf - Options and parameters in the quickemu <vm>.conf
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
\f[B]quickemu\f[R] will create and run highly optimised desktop virtual
|
||||
machines for Linux, macOS and Windows.
|
||||
It uses sensible defaults, but many configuration options can be
|
||||
overridden in the required configuration file, which will as a minimum
|
||||
specify the path to the installation ISO and QEMU disk for the installed
|
||||
VM
|
||||
.SH OPTIONS
|
||||
.PP
|
||||
These are the options and defaults for the <vm>.conf file
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
# Lowercase variables are used in the VM config file only
|
||||
boot=\[dq]efi\[dq]
|
||||
cpu_cores=\[dq]\[dq]
|
||||
disk_img=\[dq]\[dq]
|
||||
disk_size=\[dq]\[dq]
|
||||
display=\[dq]\[dq]
|
||||
extra_args=\[dq]\[dq]
|
||||
fixed_iso=\[dq]\[dq]
|
||||
floppy=\[dq]\[dq]
|
||||
guest_os=\[dq]linux\[dq]
|
||||
img=\[dq]\[dq]
|
||||
iso=\[dq]\[dq]
|
||||
macaddr=\[dq]\[dq]
|
||||
macos_release=\[dq]\[dq]
|
||||
network=\[dq]\[dq]
|
||||
port_forwards=()
|
||||
preallocation=\[dq]off\[dq]
|
||||
ram=\[dq]\[dq]
|
||||
secureboot=\[dq]off\[dq]
|
||||
tpm=\[dq]off\[dq]
|
||||
usb_devices=()
|
||||
viewer=\[dq]spicy\[dq]
|
||||
ssh_port=\[dq]\[dq]
|
||||
spice_port=\[dq]\[dq]
|
||||
public_dir=\[dq]\[dq]
|
||||
monitor=\[dq]socket\[dq]
|
||||
monitor_telnet_port=\[dq]4440\[dq]
|
||||
monitor_telnet_host=\[dq]localhost\[dq]
|
||||
monitor_cmd=\[dq]\[dq]
|
||||
serial=\[dq]socket\[dq]
|
||||
serial_telnet_port=\[dq]6660\[dq]
|
||||
serial_telnet_host=\[dq]localhost\[dq]
|
||||
# options: ehci(USB2.0), xhci(USB3.0)
|
||||
usb_controller=\[dq]ehci\[dq]
|
||||
# options: ps2, usb, virtio
|
||||
keyboard=\[dq]usb\[dq]
|
||||
keyboard_layout=\[dq]en-us\[dq]
|
||||
# options: ps2, usb, tablet, virtio
|
||||
mouse=\[dq]tablet\[dq]
|
||||
\f[R]
|
||||
.fi
|
||||
.SH EXAMPLES
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
guest_os=\[dq]linux\[dq]
|
||||
disk_img=\[dq]debian-bullseye/disk.qcow2\[dq]
|
||||
iso=\[dq]debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso\[dq]
|
||||
\f[R]
|
||||
.fi
|
||||
.PP
|
||||
The default macOS configuration looks like this:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
guest_os=\[dq]macos\[dq]
|
||||
img=\[dq]macos-catalina/RecoveryImage.img\[dq]
|
||||
disk_img=\[dq]macos-catalina/disk.qcow2\[dq]
|
||||
macos_release=\[dq]catalina\[dq]
|
||||
\f[R]
|
||||
.fi
|
||||
.IP \[bu] 2
|
||||
\f[V]guest_os=\[dq]macos\[dq]\f[R] instructs Quickemu to optimise for
|
||||
macOS.
|
||||
.IP \[bu] 2
|
||||
\f[V]macos_release=\[dq]catalina\[dq]\f[R] instructs Quickemu to
|
||||
optimise for a particular macOS release.
|
||||
.RS 2
|
||||
.IP \[bu] 2
|
||||
For example VirtIO Network and Memory Ballooning are available in Big
|
||||
Sur and newer, but not previous releases.
|
||||
.IP \[bu] 2
|
||||
And VirtIO Block Media (disks) are supported/stable in Catalina and
|
||||
newer.
|
||||
.RE
|
||||
.PP
|
||||
The default Windows 11 configuration looks like this:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
guest_os=\[dq]windows\[dq]
|
||||
disk_img=\[dq]windows-11/disk.qcow2\[dq]
|
||||
iso=\[dq]windows-11/Win11_EnglishInternational_x64.iso\[dq]
|
||||
fixed_iso=\[dq]windows-11/virtio-win.iso\[dq]
|
||||
tpm=\[dq]on\[dq]
|
||||
secureboot=\[dq]on\[dq]
|
||||
\f[R]
|
||||
.fi
|
||||
.IP \[bu] 2
|
||||
\f[V]guest_os=\[dq]windows\[dq]\f[R] instructs \f[V]quickemu\f[R] to
|
||||
optimise for Windows.
|
||||
.IP \[bu] 2
|
||||
\f[V]fixed_iso=\f[R] specifies the ISO image that provides VirtIO
|
||||
drivers.
|
||||
.IP \[bu] 2
|
||||
\f[V]tpm=\[dq]on\[dq]\f[R] instructs \f[V]quickemu\f[R] to create a
|
||||
software emulated TPM device using \f[V]swtpm\f[R].
|
||||
.SH BIOS and EFI
|
||||
.PP
|
||||
Since Quickemu 2.1.0 \f[V]efi\f[R] 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.
|
||||
.IP \[bu] 2
|
||||
\f[V]boot=\[dq]legacy\[dq]\f[R] - Enable Legacy BIOS boot
|
||||
.SH Tuning CPU cores, RAM & disks
|
||||
.PP
|
||||
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.
|
||||
.PP
|
||||
Add additional lines to your virtual machine configuration:
|
||||
.IP \[bu] 2
|
||||
\f[V]cpu_cores=\[dq]4\[dq]\f[R] - Specify the number of CPU cores
|
||||
allocated to the VM
|
||||
.IP \[bu] 2
|
||||
\f[V]ram=\[dq]4G\[dq]\f[R] - Specify the amount of RAM to allocate to
|
||||
the VM
|
||||
.IP \[bu] 2
|
||||
\f[V]disk_size=\[dq]16G\[dq]\f[R] - Specify the size of the virtual disk
|
||||
allocated to the VM
|
||||
.SS Disk preallocation
|
||||
.PP
|
||||
Preallocation mode (allowed values: \f[V]off\f[R] (default),
|
||||
\f[V]metadata\f[R], \f[V]falloc\f[R], \f[V]full\f[R]).
|
||||
An image with preallocated metadata is initially larger but can improve
|
||||
performance when the image needs to grow.
|
||||
.PP
|
||||
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.
|
||||
.IP \[bu] 2
|
||||
\f[V]preallocation=\[dq]metadata\[dq]\f[R]
|
||||
.SS CD-ROM disks
|
||||
.PP
|
||||
If you want to expose an ISO image from the host to guest add the
|
||||
following line to the VM configuration:
|
||||
.IP \[bu] 2
|
||||
\f[V]fixed_iso=\[dq]/path/to/image.iso\[dq]\f[R]
|
||||
.SS Floppy disks
|
||||
.PP
|
||||
If you\[cq]re like Alan Pope (https://popey.com) you\[cq]ll probably
|
||||
want to mount a floppy disk image in the guest.
|
||||
To do so add the following line to the VM configuration:
|
||||
.IP \[bu] 2
|
||||
\f[V]floppy=\[dq]/path/to/floppy.img\[dq]\f[R]
|
||||
.SH File Sharing
|
||||
.PP
|
||||
All File Sharing options will only expose \f[V]\[ti]/Public\f[R] (or
|
||||
localised variations) for the current user to the guest VMs.
|
||||
.SS Samba \[u1F427] \[u1F34F] \[u1FA9F]
|
||||
.PP
|
||||
If \f[V]smbd\f[R] 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.
|
||||
.PP
|
||||
You can install the minimal Samba components on Ubuntu using:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
sudo apt install --no-install-recommends samba
|
||||
\f[R]
|
||||
.fi
|
||||
.PP
|
||||
If everything is set up correctly, the \f[V]smbd\f[R] address will be
|
||||
printed when the virtual machine is started.
|
||||
For example:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
- smbd: On guest: smb://10.0.2.4/qemu
|
||||
\f[R]
|
||||
.fi
|
||||
.PP
|
||||
If using a Windows guest, right-click on \[lq]This PC\[rq], click
|
||||
\[lq]Add a network location\[rq], and paste this address, removing
|
||||
\f[V]smb:\f[R] and replacing forward slashes with backslashes (in this
|
||||
example \f[V]\[rs]\[rs]10.0.2.4\[rs]qemu\f[R]).
|
||||
.SS SPICE WebDAV \[u1F427] \[u1FA9F]
|
||||
.IP \[bu] 2
|
||||
TBD
|
||||
.SS VirtIO-9P \[u1F427] \[u1F34F]
|
||||
.IP \[bu] 2
|
||||
TBD
|
||||
.SH Network port forwarding
|
||||
.PP
|
||||
Add an additional line to your virtual machine configuration.
|
||||
For example:
|
||||
.IP \[bu] 2
|
||||
\f[V]port_forwards=(\[dq]8123:8123\[dq] \[dq]8888:80\[dq])\f[R]
|
||||
.PP
|
||||
In the example above:
|
||||
.IP \[bu] 2
|
||||
Port 8123 on the host is forwarded to port 8123 on the guest.
|
||||
.IP \[bu] 2
|
||||
Port 8888 on the host is forwarded to port 80 on the guest.
|
||||
.SH Disable networking
|
||||
.PP
|
||||
To completely disable all network interfaces in a guest VM add this
|
||||
additional line to your virtual machine configuration:
|
||||
.IP \[bu] 2
|
||||
\f[V]network=\[dq]none\[dq]\f[R]
|
||||
.SH Restricted networking
|
||||
.PP
|
||||
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.
|
||||
.PP
|
||||
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:
|
||||
.IP \[bu] 2
|
||||
\f[V]network=\[dq]restrict\[dq]\f[R]
|
||||
.SH Bridged networking
|
||||
.PP
|
||||
Connect your virtual machine to a preconfigured network bridge.
|
||||
Add an additional line to your virtual machine configuration:
|
||||
.IP \[bu] 2
|
||||
\f[V]network=\[dq]br0\[dq]\f[R]
|
||||
.PP
|
||||
If you want to have a persistent MAC address for your bridged network
|
||||
interface in the guest VM you can add \f[V]macaddr\f[R] to the virtual
|
||||
machine configuration.
|
||||
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]
|
||||
.PP
|
||||
So you can generate your own MAC addresses with:
|
||||
.IP \[bu] 2
|
||||
\f[V]macaddr=\[dq]52:54:00:AB:51:AE\[dq]\f[R]
|
||||
.SH USB redirection
|
||||
.PP
|
||||
Quickemu supports USB redirection via SPICE pass-through and host
|
||||
pass-through.
|
||||
.SS SPICE redirection (recommended)
|
||||
.PP
|
||||
Using SPICE for USB pass-through is easiest as it doesn\[cq]t require
|
||||
any elevated permission, start Quickemu with \f[V]--display spice\f[R]
|
||||
and then select \f[V]Input\f[R] ->
|
||||
\f[V]Select USB Device for redirection\f[R] from the menu to choose
|
||||
which device(s) you want to attach to the guest.
|
||||
.SS Host redirection \f[B]NOT Recommended\f[R]
|
||||
.PP
|
||||
\f[B]USB host redirection is not recommended\f[R], it is provided purely
|
||||
for backwards compatibility to older versions of Quickemu.
|
||||
Using SPICE is preferred, see above.
|
||||
.PP
|
||||
Add an additional line to your virtual machine configuration.
|
||||
For example:
|
||||
.IP \[bu] 2
|
||||
\f[V]usb_devices=(\[dq]046d:082d\[dq] \[dq]046d:085e\[dq])\f[R]
|
||||
.PP
|
||||
In the example above:
|
||||
.IP \[bu] 2
|
||||
The USB device with vendor_id 046d and product_id 082d will be exposed
|
||||
to the guest.
|
||||
.IP \[bu] 2
|
||||
The USB device with vendor_id 046d and product_id 085e will be exposed
|
||||
to the guest.
|
||||
.PP
|
||||
If the USB devices are not writable, \f[V]quickemu\f[R] will display the
|
||||
appropriate commands to modify the USB device(s) access permissions,
|
||||
like this:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
- 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 \[u1F446]
|
||||
\f[R]
|
||||
.fi
|
||||
.SH TPM
|
||||
.PP
|
||||
Since Quickemu 2.2.0 a software emulated TPM device can be added to
|
||||
guest virtual machines.
|
||||
Just add \f[V]tpm=\[dq]on\[dq]\f[R] to your VM configuration.
|
||||
\f[V]quickget\f[R] will automatically add this line to Windows 11
|
||||
virtual machines.
|
||||
.SH AUTHORS
|
||||
.PP
|
||||
Written by Martin Wimpress.
|
||||
.SH BUGS
|
||||
.PP
|
||||
Submit bug reports online at:
|
||||
<https://github.com/quickemu-project/quickemu/issues>
|
||||
.SH SEE ALSO
|
||||
.PP
|
||||
Full sources at: <https://github.com/quickemu-project/quickemu>
|
||||
.PP
|
||||
quickget(1), quickemu(1), quickgui(1)
|
||||
.SH AUTHORS
|
||||
Martin Wimpress.
|
|
@ -0,0 +1,339 @@
|
|||
.\" Automatically generated by Pandoc 3.6.1
|
||||
.\"
|
||||
.TH "QUICKEMU_CONF" "5" "December 30, 2024" "quickemu_conf" "Quickemu Configuration Manual"
|
||||
.SH NAME
|
||||
quickemu_conf \- Options and parameters in the quickemu <vm>.conf
|
||||
.SH DESCRIPTION
|
||||
\f[B]quickemu\f[R] will create and run highly optimised desktop virtual
|
||||
machines for Linux, macOS and Windows.
|
||||
It uses sensible defaults, but many configuration options can be
|
||||
overridden in the required configuration file, which will as a minimum
|
||||
specify the path to the installation ISO and QEMU disk for the installed
|
||||
VM
|
||||
.SH OPTIONS
|
||||
These are the options and defaults for the <vm>.conf file
|
||||
.IP
|
||||
.EX
|
||||
# Lowercase variables are used in the VM config file only
|
||||
boot=\[dq]efi\[dq]
|
||||
cpu_cores=\[dq]\[dq]
|
||||
disk_img=\[dq]\[dq]
|
||||
disk_size=\[dq]\[dq]
|
||||
display=\[dq]\[dq]
|
||||
extra_args=\[dq]\[dq]
|
||||
fixed_iso=\[dq]\[dq]
|
||||
floppy=\[dq]\[dq]
|
||||
guest_os=\[dq]linux\[dq]
|
||||
img=\[dq]\[dq]
|
||||
iso=\[dq]\[dq]
|
||||
macaddr=\[dq]\[dq]
|
||||
macos_release=\[dq]\[dq]
|
||||
network=\[dq]\[dq]
|
||||
port_forwards=()
|
||||
preallocation=\[dq]off\[dq]
|
||||
ram=\[dq]\[dq]
|
||||
secureboot=\[dq]off\[dq]
|
||||
tpm=\[dq]off\[dq]
|
||||
usb_devices=()
|
||||
viewer=\[dq]spicy\[dq]
|
||||
ssh_port=\[dq]\[dq]
|
||||
spice_port=\[dq]\[dq]
|
||||
public_dir=\[dq]\[dq]
|
||||
monitor=\[dq]socket\[dq]
|
||||
monitor_telnet_port=\[dq]4440\[dq]
|
||||
monitor_telnet_host=\[dq]localhost\[dq]
|
||||
monitor_cmd=\[dq]\[dq]
|
||||
serial=\[dq]socket\[dq]
|
||||
serial_telnet_port=\[dq]6660\[dq]
|
||||
serial_telnet_host=\[dq]localhost\[dq]
|
||||
# options: ehci(USB2.0), xhci(USB3.0)
|
||||
usb_controller=\[dq]ehci\[dq]
|
||||
# options: ps2, usb, virtio
|
||||
keyboard=\[dq]usb\[dq]
|
||||
keyboard_layout=\[dq]en\-us\[dq]
|
||||
# options: ps2, usb, tablet, virtio
|
||||
mouse=\[dq]tablet\[dq]
|
||||
.EE
|
||||
.SH EXAMPLES
|
||||
.IP
|
||||
.EX
|
||||
guest_os=\[dq]linux\[dq]
|
||||
disk_img=\[dq]debian\-bullseye/disk.qcow2\[dq]
|
||||
iso=\[dq]debian\-bullseye/firmware\-11.0.0\-amd64\-DVD\-1.iso\[dq]
|
||||
.EE
|
||||
.PP
|
||||
The default macOS configuration looks like this:
|
||||
.IP
|
||||
.EX
|
||||
guest_os=\[dq]macos\[dq]
|
||||
img=\[dq]macos\-catalina/RecoveryImage.img\[dq]
|
||||
disk_img=\[dq]macos\-catalina/disk.qcow2\[dq]
|
||||
macos_release=\[dq]catalina\[dq]
|
||||
.EE
|
||||
.IP \[bu] 2
|
||||
\f[CR]guest_os=\[dq]macos\[dq]\f[R] instructs Quickemu to optimise for
|
||||
macOS.
|
||||
.IP \[bu] 2
|
||||
\f[CR]macos_release=\[dq]catalina\[dq]\f[R] instructs Quickemu to
|
||||
optimise for a particular macOS release.
|
||||
.RS 2
|
||||
.IP \[bu] 2
|
||||
For example VirtIO Network and Memory Ballooning are available in Big
|
||||
Sur and newer, but not previous releases.
|
||||
.IP \[bu] 2
|
||||
And VirtIO Block Media (disks) are supported/stable in Catalina and
|
||||
newer.
|
||||
.RE
|
||||
.PP
|
||||
The default Windows 11 configuration looks like this:
|
||||
.IP
|
||||
.EX
|
||||
guest_os=\[dq]windows\[dq]
|
||||
disk_img=\[dq]windows\-11/disk.qcow2\[dq]
|
||||
iso=\[dq]windows\-11/Win11_EnglishInternational_x64.iso\[dq]
|
||||
fixed_iso=\[dq]windows\-11/virtio\-win.iso\[dq]
|
||||
tpm=\[dq]on\[dq]
|
||||
secureboot=\[dq]on\[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].
|
||||
.SS BIOS and EFI
|
||||
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
|
||||
you VM configuration to enable legacy BIOS.
|
||||
.IP \[bu] 2
|
||||
\f[CR]boot=\[dq]legacy\[dq]\f[R] \- Enable Legacy BIOS boot
|
||||
.SS 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.
|
||||
.PP
|
||||
Add additional lines to your virtual machine configuration:
|
||||
.IP \[bu] 2
|
||||
\f[CR]cpu_cores=\[dq]4\[dq]\f[R] \- Specify the number of CPU cores
|
||||
allocated to the VM
|
||||
.IP \[bu] 2
|
||||
\f[CR]ram=\[dq]4G\[dq]\f[R] \- Specify the amount of RAM to allocate to
|
||||
the VM
|
||||
.IP \[bu] 2
|
||||
\f[CR]disk_size=\[dq]16G\[dq]\f[R] \- Specify the size of the virtual
|
||||
disk allocated to the VM
|
||||
.SS Disk preallocation
|
||||
Preallocation mode (allowed values: \f[CR]off\f[R] (default),
|
||||
\f[CR]metadata\f[R], \f[CR]falloc\f[R], \f[CR]full\f[R]).
|
||||
An image with preallocated metadata is initially larger but can improve
|
||||
performance when the image needs to grow.
|
||||
.PP
|
||||
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.
|
||||
.IP \[bu] 2
|
||||
\f[CR]preallocation=\[dq]metadata\[dq]\f[R]
|
||||
.SS CD\-ROM disks
|
||||
If you want to expose an ISO image from the host to guest add the
|
||||
following line to the VM configuration:
|
||||
.IP \[bu] 2
|
||||
\f[CR]fixed_iso=\[dq]/path/to/image.iso\[dq]\f[R]
|
||||
.SS Floppy disks
|
||||
If you\[aq]re like \c
|
||||
.UR https://popey.com
|
||||
Alan Pope
|
||||
.UE \c
|
||||
\ 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:
|
||||
.IP \[bu] 2
|
||||
\f[CR]floppy=\[dq]/path/to/floppy.img\[dq]\f[R]
|
||||
.SS File Sharing
|
||||
All File Sharing options will only expose \f[CR]\[ti]/Public\f[R] (or
|
||||
localised variations) for the current user to the guest VMs.
|
||||
.SS Samba 🐧 🍏 🪟
|
||||
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
|
||||
host to the guest.
|
||||
.PP
|
||||
You can install the minimal Samba components on Ubuntu using:
|
||||
.IP
|
||||
.EX
|
||||
sudo apt install \-\-no\-install\-recommends samba
|
||||
.EE
|
||||
.PP
|
||||
If everything is set up correctly, the \f[CR]smbd\f[R] address will be
|
||||
printed when the virtual machine is started.
|
||||
For example:
|
||||
.IP
|
||||
.EX
|
||||
\- smbd: On guest: smb://10.0.2.4/qemu
|
||||
.EE
|
||||
.PP
|
||||
If using a Windows guest, right\-click on \[dq]This PC\[dq], click
|
||||
\[dq]Add a network location\[dq], and paste this address, removing
|
||||
\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]).
|
||||
.SS SPICE WebDAV 🐧 🪟
|
||||
.IP \[bu] 2
|
||||
TBD
|
||||
.SS VirtIO\-9P 🐧 🍏
|
||||
.IP \[bu] 2
|
||||
TBD
|
||||
.SS Networking
|
||||
.SS Port forwarding
|
||||
Add an additional line to your virtual machine configuration.
|
||||
For example:
|
||||
.IP \[bu] 2
|
||||
\f[CR]port_forwards=(\[dq]8123:8123\[dq] \[dq]8888:80\[dq])\f[R]
|
||||
.PP
|
||||
In the example above:
|
||||
.IP \[bu] 2
|
||||
Port 8123 on the host is forwarded to port 8123 on the guest.
|
||||
.IP \[bu] 2
|
||||
Port 8888 on the host is forwarded to port 80 on the guest.
|
||||
.SS Disable networking
|
||||
To completely disable all network interfaces in a guest VM add this
|
||||
additional line to your virtual machine configuration:
|
||||
.IP \[bu] 2
|
||||
\f[CR]network=\[dq]none\[dq]\f[R]
|
||||
.SS 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.
|
||||
.PP
|
||||
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:
|
||||
.IP \[bu] 2
|
||||
\f[CR]network=\[dq]restrict\[dq]\f[R]
|
||||
.SS Bridged networking
|
||||
Connect your virtual machine to a preconfigured network bridge.
|
||||
Add an additional line to your virtual machine configuration:
|
||||
.IP \[bu] 2
|
||||
\f[CR]network=\[dq]br0\[dq]\f[R]
|
||||
.PP
|
||||
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
|
||||
machine configuration.
|
||||
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]
|
||||
.PP
|
||||
So you can generate your own MAC addresses with:
|
||||
.IP \[bu] 2
|
||||
\f[CR]macaddr=\[dq]52:54:00:AB:51:AE\[dq]\f[R]
|
||||
.SS USB redirection
|
||||
Quickemu supports USB redirection via SPICE pass\-through and host
|
||||
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)
|
||||
Using SPICE for USB pass\-through is easiest as it doesn\[aq]t require
|
||||
any elevated permission:
|
||||
.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
|
||||
which device(s) you want to attach to the guest.
|
||||
.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
|
||||
for backwards compatibility to older versions of Quickemu.
|
||||
Using SPICE is preferred, see above.
|
||||
.PP
|
||||
Add an additional line to your virtual machine configuration.
|
||||
For example:
|
||||
.IP \[bu] 2
|
||||
\f[CR]usb_devices=(\[dq]046d:082d\[dq] \[dq]046d:085e\[dq])\f[R]
|
||||
.PP
|
||||
In the example above:
|
||||
.IP \[bu] 2
|
||||
The USB device with vendor_id 046d and product_id 082d will be exposed
|
||||
to the guest.
|
||||
.IP \[bu] 2
|
||||
The USB device with vendor_id 046d and product_id 085e will be exposed
|
||||
to the guest.
|
||||
.PP
|
||||
If the USB devices are not writable, \f[CR]quickemu\f[R] will display
|
||||
the appropriate commands to modify the USB device(s) access permissions,
|
||||
like this:
|
||||
.IP
|
||||
.EX
|
||||
\- 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 👆
|
||||
.EE
|
||||
.SS TPM
|
||||
Since Quickemu 2.2.0 a software emulated TPM device can be added to
|
||||
guest virtual machines.
|
||||
Just add \f[CR]tpm=\[dq]on\[dq]\f[R] to your VM configuration.
|
||||
\f[CR]quickget\f[R] will automatically add this line to Windows 11
|
||||
virtual machines.
|
||||
.SH AUTHORS
|
||||
Written by Martin Wimpress.
|
||||
.SH BUGS
|
||||
Submit bug reports online at: \c
|
||||
.UR https://github.com/quickemu-project/quickemu/issues
|
||||
.UE \c
|
||||
.SH SEE ALSO
|
||||
Full sources at: \c
|
||||
.UR https://github.com/quickemu-project/quickemu
|
||||
.UE \c
|
||||
.PP
|
||||
quickget(1), quickemu(1), quickgui(1)
|
||||
.SH AUTHORS
|
||||
Martin Wimpress.
|
|
@ -1,9 +1,9 @@
|
|||
---
|
||||
author: Martin Wimpress
|
||||
date: April 26, 2023
|
||||
date: December 30, 2024
|
||||
footer: quickemu_conf
|
||||
header: Quickemu Configuration Manual
|
||||
section: 1
|
||||
section: 5
|
||||
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
|
||||
|
||||
``` bash
|
||||
``` shell
|
||||
# Lowercase variables are used in the VM config file only
|
||||
boot="efi"
|
||||
cpu_cores=""
|
||||
|
@ -67,7 +67,7 @@ mouse="tablet"
|
|||
|
||||
# EXAMPLES
|
||||
|
||||
``` bash
|
||||
``` shell
|
||||
guest_os="linux"
|
||||
disk_img="debian-bullseye/disk.qcow2"
|
||||
iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
|
||||
|
@ -75,24 +75,24 @@ iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
|
|||
|
||||
The default macOS configuration looks like this:
|
||||
|
||||
``` bash
|
||||
``` shell
|
||||
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.
|
||||
- `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.
|
||||
|
||||
The default Windows 11 configuration looks like this:
|
||||
|
||||
``` bash
|
||||
``` shell
|
||||
guest_os="windows"
|
||||
disk_img="windows-11/disk.qcow2"
|
||||
iso="windows-11/Win11_EnglishInternational_x64.iso"
|
||||
|
@ -101,20 +101,20 @@ tpm="on"
|
|||
secureboot="on"
|
||||
```
|
||||
|
||||
- `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`.
|
||||
- `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`.
|
||||
|
||||
# BIOS and EFI
|
||||
### 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
|
||||
- `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
|
||||
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:
|
||||
|
||||
- `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
|
||||
- `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
|
||||
### Disk preallocation
|
||||
|
||||
Preallocation mode (allowed values: `off` (default), `metadata`,
|
||||
`falloc`, `full`). An image with preallocated metadata is initially
|
||||
|
@ -139,29 +138,29 @@ 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"`
|
||||
- `preallocation="metadata"`
|
||||
|
||||
## CD-ROM disks
|
||||
### 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"`
|
||||
- `fixed_iso="/path/to/image.iso"`
|
||||
|
||||
## Floppy disks
|
||||
### 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"`
|
||||
- `floppy="/path/to/floppy.img"`
|
||||
|
||||
# File Sharing
|
||||
### File Sharing
|
||||
|
||||
All File Sharing options will only expose `~/Public` (or localised
|
||||
variations) for the current user to the guest VMs.
|
||||
|
||||
## Samba 🐧 🍏 🪟
|
||||
#### 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
|
||||
|
@ -169,7 +168,7 @@ the guest.
|
|||
|
||||
You can install the minimal Samba components on Ubuntu using:
|
||||
|
||||
``` bash
|
||||
``` shell
|
||||
sudo apt install --no-install-recommends samba
|
||||
```
|
||||
|
||||
|
@ -182,34 +181,36 @@ 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 🐧 🪟
|
||||
#### 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
|
||||
example:
|
||||
|
||||
- `port_forwards=("8123:8123" "8888:80")`
|
||||
- `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.
|
||||
- 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
|
||||
#### Disable networking
|
||||
|
||||
To completely disable all network interfaces in a guest VM add this
|
||||
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
|
||||
restrict option, which will restrict networking to just the guest and
|
||||
|
@ -219,14 +220,14 @@ 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"`
|
||||
- `network="restrict"`
|
||||
|
||||
# Bridged networking
|
||||
#### Bridged networking
|
||||
|
||||
Connect your virtual machine to a preconfigured network bridge. Add an
|
||||
additional line to your virtual machine configuration:
|
||||
|
||||
- `network="br0"`
|
||||
- `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
|
||||
|
@ -235,21 +236,57 @@ configuration. QEMU requires that the MAC address is in the range:
|
|||
|
||||
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
|
||||
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
|
||||
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.
|
||||
elevated permission:
|
||||
|
||||
## 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
|
||||
backwards compatibility to older versions of Quickemu. Using SPICE is
|
||||
|
@ -258,14 +295,14 @@ preferred, see above.
|
|||
Add an additional line to your virtual machine configuration. For
|
||||
example:
|
||||
|
||||
- `usb_devices=("046d:082d" "046d:085e")`
|
||||
- `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.
|
||||
- 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,
|
||||
|
@ -276,7 +313,7 @@ like this:
|
|||
sudo chown -v root:user /dev/bus/usb/001/005
|
||||
ERROR! USB permission changes are required 👆
|
||||
|
||||
# TPM
|
||||
### 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.
|
710
docs/quickget.1
710
docs/quickget.1
|
@ -1,269 +1,401 @@
|
|||
.\" Automatically generated by Pandoc 2.19.2
|
||||
.\" Automatically generated by Pandoc 3.6.1
|
||||
.\"
|
||||
.\" Define V font for inline verbatim, using C font in formats
|
||||
.\" that render this, and otherwise B font.
|
||||
.ie "\f[CB]x\f[]"x" \{\
|
||||
. ftr V B
|
||||
. ftr VI BI
|
||||
. ftr VB B
|
||||
. ftr VBI BI
|
||||
.\}
|
||||
.el \{\
|
||||
. ftr V CR
|
||||
. ftr VI CI
|
||||
. ftr VB CB
|
||||
. ftr VBI CBI
|
||||
.\}
|
||||
.TH "QUICKGET" "1" "April 26, 2023" "quickget" "Quickget User Manual"
|
||||
.hy
|
||||
.TH "QUICKGET" "1" "December 30, 2024" "quickget" "Quickget User Manual"
|
||||
.SH NAME
|
||||
.PP
|
||||
quickget - download and prepare materials for building a quickemu VM
|
||||
quickget \- download and prepare materials for building a quickemu VM
|
||||
.SH SYNOPSIS
|
||||
.PP
|
||||
\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]]*
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
\f[B]quickget\f[R] will download the requisite materials and prepare a
|
||||
configuration for \f[V]quickemu\f[R] to use to build and run
|
||||
configuration for \f[CR]quickemu\f[R] to use to build and run
|
||||
.SH OPTIONS
|
||||
.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][OS] [Release] [Edition]\f[R]
|
||||
specify the OS and release (and optional edition) if insufficient 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 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
|
||||
.SS Ubuntu Guest
|
||||
.PP
|
||||
\f[V]quickget\f[R] will automatically download an Ubuntu release and
|
||||
.SS Creating Linux guests 🐧
|
||||
.SS Ubuntu
|
||||
\f[CR]quickget\f[R] will automatically download an Ubuntu release and
|
||||
create the virtual machine configuration.
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
.EX
|
||||
quickget ubuntu 22.04
|
||||
quickemu --vm ubuntu-22.04.conf
|
||||
\f[R]
|
||||
.fi
|
||||
quickemu \-\-vm ubuntu\-22.04.conf
|
||||
.EE
|
||||
.IP \[bu] 2
|
||||
Complete the installation as normal.
|
||||
.IP \[bu] 2
|
||||
Post-install:
|
||||
Post\-install:
|
||||
.RS 2
|
||||
.IP \[bu] 2
|
||||
Install the SPICE agent (\f[V]spice-vdagent\f[R]) in the guest to enable
|
||||
copy/paste and USB redirection
|
||||
Install the SPICE agent (\f[CR]spice\-vdagent\f[R]) in the guest to
|
||||
enable copy/paste and USB redirection
|
||||
.RS 2
|
||||
.IP \[bu] 2
|
||||
\f[V]sudo apt install spice-vdagent\f[R]
|
||||
\f[CR]sudo apt install spice\-vdagent\f[R]
|
||||
.RE
|
||||
.IP \[bu] 2
|
||||
Install the SPICE WebDAV agent (\f[V]spice-webdavd\f[R]) in the guest to
|
||||
enable file sharing.
|
||||
Install the SPICE WebDAV agent (\f[CR]spice\-webdavd\f[R]) in the guest
|
||||
to enable file sharing.
|
||||
.RS 2
|
||||
.IP \[bu] 2
|
||||
\f[V]sudo apt install spice-webdavd\f[R]
|
||||
\f[CR]sudo apt install spice\-webdavd\f[R]
|
||||
.RE
|
||||
.RE
|
||||
.SS Ubuntu devel (daily-live) images
|
||||
.PP
|
||||
\f[V]quickget\f[R] can also download/refresh devel images via
|
||||
\f[V]zsync\f[R] for Ubuntu developers and testers.
|
||||
.SS Ubuntu daily\-live images
|
||||
\f[CR]quickget\f[R] can also download/refresh daily\-live images via
|
||||
\f[CR]zsync\f[R] for Ubuntu developers and testers.
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
quickget ubuntu devel
|
||||
quickemu --vm ubuntu-devel.conf
|
||||
\f[R]
|
||||
.fi
|
||||
.EX
|
||||
quickget ubuntu daily\-live
|
||||
quickemu \-\-vm ubuntu\-daily\-live.conf
|
||||
.EE
|
||||
.PP
|
||||
You can run \f[V]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
|
||||
switch to a new series.
|
||||
.SS Ubuntu Flavours
|
||||
.PP
|
||||
All the official Ubuntu flavours are supported, just replace
|
||||
\f[V]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
|
||||
\f[V]kubuntu\f[R] (Kubuntu)
|
||||
\f[CR]edubuntu\f[R] (Edubuntu)
|
||||
.IP \[bu] 2
|
||||
\f[V]lubuntu\f[R] (Lubuntu)
|
||||
\f[CR]kubuntu\f[R] (Kubuntu)
|
||||
.IP \[bu] 2
|
||||
\f[V]ubuntu-budgie\f[R] (Ubuntu Budgie)
|
||||
\f[CR]lubuntu\f[R] (Lubuntu)
|
||||
.IP \[bu] 2
|
||||
\f[V]ubuntucinnamon\f[R] (Ubuntu Cinnamon)
|
||||
\f[CR]ubuntu\-budgie\f[R] (Ubuntu Budgie)
|
||||
.IP \[bu] 2
|
||||
\f[V]ubuntukylin\f[R] (Ubuntu Kylin)
|
||||
\f[CR]ubuntucinnamon\f[R] (Ubuntu Cinnamon)
|
||||
.IP \[bu] 2
|
||||
\f[V]ubuntu-mate\f[R] (Ubuntu MATE)
|
||||
\f[CR]ubuntukylin\f[R] (Ubuntu Kylin)
|
||||
.IP \[bu] 2
|
||||
\f[V]ubuntustudio\f[R] (Ubuntu Studio)
|
||||
\f[CR]ubuntu\-mate\f[R] (Ubuntu MATE)
|
||||
.IP \[bu] 2
|
||||
\f[V]ubuntu\f[R] (Ubuntu)
|
||||
\f[CR]ubuntu\-server\f[R] (Ubuntu Server)
|
||||
.IP \[bu] 2
|
||||
\f[V]ubuntu-unity\f[R] (Ubuntu Unity)
|
||||
\f[CR]ubuntustudio\f[R] (Ubuntu Studio)
|
||||
.IP \[bu] 2
|
||||
\f[V]xubuntu\f[R] (Xubuntu)
|
||||
\f[CR]ubuntu\f[R] (Ubuntu)
|
||||
.IP \[bu] 2
|
||||
\f[CR]ubuntu\-unity\f[R] (Ubuntu Unity)
|
||||
.IP \[bu] 2
|
||||
\f[CR]xubuntu\f[R] (Xubuntu)
|
||||
.PP
|
||||
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
|
||||
.EX
|
||||
# show an OS ISO download URL for {os} {release} [edition]
|
||||
quickget \-\-url fedora 38 Silverblue
|
||||
# test if an OS ISO is available for {os} {release} [edition]
|
||||
quickget \-\-check nixos unstable plasma5
|
||||
# open an OS distribution homepage in a browser
|
||||
quickget \-\-open\-homepage ubuntu\-mate
|
||||
# Only download image file into current directory, without creating VM
|
||||
quickget \-\-download elementary 7.1
|
||||
.EE
|
||||
.PP
|
||||
The \f[CR]\-\-url\f[R], \f[CR]\-\-check\f[R], and
|
||||
\f[CR]\-\-download\f[R] options are fully functional for all operating
|
||||
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
|
||||
.PP
|
||||
\f[V]quickget\f[R] also supports:
|
||||
\f[CR]quickget\f[R] also supports:
|
||||
.IP \[bu] 2
|
||||
\f[V]alma\f[R] (Alma Linux)
|
||||
\f[CR]alma\f[R] (AlmaLinux)
|
||||
.IP \[bu] 2
|
||||
\f[V]alpine\f[R] (Alpine Linux)
|
||||
\f[CR]alpine\f[R] (Alpine Linux)
|
||||
.IP \[bu] 2
|
||||
\f[V]android\f[R] (Android x86)
|
||||
\f[CR]android\f[R] (Android x86)
|
||||
.IP \[bu] 2
|
||||
\f[V]archcraft\f[R] (Archcraft)
|
||||
\f[CR]antix\f[R] (Antix)
|
||||
.IP \[bu] 2
|
||||
\f[V]archlinux\f[R] (Arch Linux)
|
||||
\f[CR]archcraft\f[R] (Archcraft)
|
||||
.IP \[bu] 2
|
||||
\f[V]arcolinux\f[R] (Arco Linux)
|
||||
\f[CR]archlinux\f[R] (Arch Linux)
|
||||
.IP \[bu] 2
|
||||
\f[V]batocera\f[R] (Batocera)
|
||||
\f[CR]arcolinux\f[R] (Arco Linux)
|
||||
.IP \[bu] 2
|
||||
\f[V]blendos\f[R] (BlendOS)
|
||||
\f[CR]artixlinux\f[R] (Artix Linux)
|
||||
.IP \[bu] 2
|
||||
\f[V]cachyos\f[R] (CachyOS)
|
||||
\f[CR]athenaos\f[R] (Athena OS)
|
||||
.IP \[bu] 2
|
||||
\f[V]centos-stream\f[R] (CentOS Stream)
|
||||
\f[CR]batocera\f[R] (Batocera)
|
||||
.IP \[bu] 2
|
||||
\f[V]debian\f[R] (Debian)
|
||||
\f[CR]bazzite\f[R] (Bazzite)
|
||||
.IP \[bu] 2
|
||||
\f[V]deepin\f[R] (Deepin)
|
||||
\f[CR]biglinux\f[R] (BigLinux)
|
||||
.IP \[bu] 2
|
||||
\f[V]devuan\f[R] (Devuan)
|
||||
\f[CR]blendos\f[R] (BlendOS)
|
||||
.IP \[bu] 2
|
||||
\f[V]dragonflybsd\f[R] (DragonFlyBSD)
|
||||
\f[CR]bodhi\f[R] (Bodhi)
|
||||
.IP \[bu] 2
|
||||
\f[V]elementary\f[R] (elementary OS)
|
||||
\f[CR]bunsenlabs\f[R] (BunsenLabs)
|
||||
.IP \[bu] 2
|
||||
\f[V]endeavouros\f[R] (EndeavourOS)
|
||||
\f[CR]cachyos\f[R] (CachyOS)
|
||||
.IP \[bu] 2
|
||||
\f[V]endless\f[R] (Endless OS)
|
||||
\f[CR]centos\-stream\f[R] (CentOS Stream)
|
||||
.IP \[bu] 2
|
||||
\f[V]fedora\f[R] (Fedora)
|
||||
\f[CR]chimeralinux\f[R] (Chimera Linux)
|
||||
.IP \[bu] 2
|
||||
\f[V]freebsd\f[R] (FreeBSD)
|
||||
\f[CR]crunchbang++\f[R] (Crunchbangplusplus)
|
||||
.IP \[bu] 2
|
||||
\f[V]freedos\f[R] (FreeDOS)
|
||||
\f[CR]debian\f[R] (Debian)
|
||||
.IP \[bu] 2
|
||||
\f[V]gentoo\f[R] (Gentoo)
|
||||
\f[CR]deepin\f[R] (Deepin)
|
||||
.IP \[bu] 2
|
||||
\f[V]ghostbsd\f[R] (GhostBSD)
|
||||
\f[CR]devuan\f[R] (Devuan)
|
||||
.IP \[bu] 2
|
||||
\f[V]haiku\f[R] (Haiku)
|
||||
\f[CR]dragonflybsd\f[R] (DragonFlyBSD)
|
||||
.IP \[bu] 2
|
||||
\f[V]kali\f[R] (Kali)
|
||||
\f[CR]easyos\f[R] (EasyOS)
|
||||
.IP \[bu] 2
|
||||
\f[V]kdeneon\f[R] (KDE Neon)
|
||||
\f[CR]elementary\f[R] (elementary OS)
|
||||
.IP \[bu] 2
|
||||
\f[V]kolibrios\f[R] (KolibriOS)
|
||||
\f[CR]endeavouros\f[R] (EndeavourOS)
|
||||
.IP \[bu] 2
|
||||
\f[V]linuxmint\f[R] (Linux Mint)
|
||||
\f[CR]endless\f[R] (Endless OS)
|
||||
.IP \[bu] 2
|
||||
\f[V]lmde\f[R] (Linux Mint Debian Edition)
|
||||
\f[CR]fedora\f[R] (Fedora)
|
||||
.IP \[bu] 2
|
||||
\f[V]mageia\f[R] (Mageia)
|
||||
\f[CR]freebsd\f[R] (FreeBSD)
|
||||
.IP \[bu] 2
|
||||
\f[V]manjaro\f[R] (Manjaro)
|
||||
\f[CR]freedos\f[R] (FreeDOS)
|
||||
.IP \[bu] 2
|
||||
\f[V]mxlinux\f[R] (MX Linux)
|
||||
\f[CR]garuda\f[R] (Garuda Linux)
|
||||
.IP \[bu] 2
|
||||
\f[V]netboot\f[R] (netboot.xyz)
|
||||
\f[CR]gentoo\f[R] (Gentoo)
|
||||
.IP \[bu] 2
|
||||
\f[V]netbsd\f[R] (NetBSD)
|
||||
\f[CR]ghostbsd\f[R] (GhostBSD)
|
||||
.IP \[bu] 2
|
||||
\f[V]nixos\f[R] (NixOS)
|
||||
\f[CR]gnomeos\f[R] (GNOME OS)
|
||||
.IP \[bu] 2
|
||||
\f[V]openbsd\f[R] (OpenBSD)
|
||||
\f[CR]guix\f[R] (Guix)
|
||||
.IP \[bu] 2
|
||||
\f[V]opensuse\f[R] (openSUSE)
|
||||
\f[CR]haiku\f[R] (Haiku)
|
||||
.IP \[bu] 2
|
||||
\f[V]oraclelinux\f[R] (Oracle Linux)
|
||||
\f[CR]holoiso\f[R] (HoloISO)
|
||||
.IP \[bu] 2
|
||||
\f[V]popos\f[R] (Pop!_OS)
|
||||
\f[CR]kali\f[R] (Kali)
|
||||
.IP \[bu] 2
|
||||
\f[V]reactos\f[R] (ReactOS)
|
||||
\f[CR]kdeneon\f[R] (KDE Neon)
|
||||
.IP \[bu] 2
|
||||
\f[V]rebornos\f[R] (RebornOS)
|
||||
\f[CR]kolibrios\f[R] (KolibriOS)
|
||||
.IP \[bu] 2
|
||||
\f[V]rockylinux\f[R] (Rocky Linux)
|
||||
\f[CR]linuxlite\f[R] (Linux Lite)
|
||||
.IP \[bu] 2
|
||||
\f[V]siduction\f[R] (Siduction)
|
||||
\f[CR]linuxmint\f[R] (Linux Mint)
|
||||
.IP \[bu] 2
|
||||
\f[V]slackware\f[R] (Slackware)
|
||||
\f[CR]lmde\f[R] (Linux Mint Debian Edition)
|
||||
.IP \[bu] 2
|
||||
\f[V]solus\f[R] (Solus)
|
||||
\f[CR]maboxlinux\f[R] (Mabox Linux)
|
||||
.IP \[bu] 2
|
||||
\f[V]tails\f[R] (Tails)
|
||||
\f[CR]mageia\f[R] (Mageia)
|
||||
.IP \[bu] 2
|
||||
\f[V]truenas-core\f[R] (TrueNAS Core)
|
||||
\f[CR]manjaro\f[R] (Manjaro)
|
||||
.IP \[bu] 2
|
||||
\f[V]truenas-scale\f[R] (TrueNAS Scale)
|
||||
\f[CR]mxlinux\f[R] (MX Linux)
|
||||
.IP \[bu] 2
|
||||
\f[V]void\f[R] (Void Linux)
|
||||
\f[CR]netboot\f[R] (netboot.xyz)
|
||||
.IP \[bu] 2
|
||||
\f[V]vxlinux\f[R] (VX Linux)
|
||||
\f[CR]netbsd\f[R] (NetBSD)
|
||||
.IP \[bu] 2
|
||||
\f[V]zorin\f[R] (Zorin OS)
|
||||
.PP
|
||||
\f[CR]nitrux\f[R] (Nitrux)
|
||||
.IP \[bu] 2
|
||||
\f[CR]nixos\f[R] (NixOS)
|
||||
.IP \[bu] 2
|
||||
\f[CR]nwg\-shell\f[R] (nwg\-shell)
|
||||
.IP \[bu] 2
|
||||
\f[CR]openbsd\f[R] (OpenBSD)
|
||||
.IP \[bu] 2
|
||||
\f[CR]openindiana\f[R] (OpenIndiana)
|
||||
.IP \[bu] 2
|
||||
\f[CR]opensuse\f[R] (openSUSE)
|
||||
.IP \[bu] 2
|
||||
\f[CR]oraclelinux\f[R] (Oracle Linux)
|
||||
.IP \[bu] 2
|
||||
\f[CR]parrotsec\f[R] (Parrot Security)
|
||||
.IP \[bu] 2
|
||||
\f[CR]peppermint\f[R] (PeppermintOS)
|
||||
.IP \[bu] 2
|
||||
\f[CR]popos\f[R] (Pop!_OS)
|
||||
.IP \[bu] 2
|
||||
\f[CR]porteus\f[R] (Porteus)
|
||||
.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)
|
||||
.IP \[bu] 2
|
||||
\f[CR]rebornos\f[R] (RebornOS)
|
||||
.IP \[bu] 2
|
||||
\f[CR]rockylinux\f[R] (Rocky Linux)
|
||||
.IP \[bu] 2
|
||||
\f[CR]siduction\f[R] (Siduction)
|
||||
.IP \[bu] 2
|
||||
\f[CR]slackware\f[R] (Slackware)
|
||||
.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)
|
||||
.IP \[bu] 2
|
||||
\f[CR]sparkylinux\f[R] (SparkyLinux)
|
||||
.IP \[bu] 2
|
||||
\f[CR]spirallinux\f[R] (SpiralLinux)
|
||||
.IP \[bu] 2
|
||||
\f[CR]tails\f[R] (Tails)
|
||||
.IP \[bu] 2
|
||||
\f[CR]tinycore\f[R] (Tiny Core Linux)
|
||||
.IP \[bu] 2
|
||||
\f[CR]trisquel\f[R] (Trisquel\-)
|
||||
.IP \[bu] 2
|
||||
\f[CR]truenas\-core\f[R] (TrueNAS Core)
|
||||
.IP \[bu] 2
|
||||
\f[CR]truenas\-scale\f[R] (TrueNAS Scale)
|
||||
.IP \[bu] 2
|
||||
\f[CR]tuxedo\-os\f[R] (Tuxedo OS)
|
||||
.IP \[bu] 2
|
||||
\f[CR]vanillaos\f[R] (Vanilla OS)
|
||||
.IP \[bu] 2
|
||||
\f[CR]void\f[R] (Void Linux)
|
||||
.IP \[bu] 2
|
||||
\f[CR]vxlinux\f[R] (VX Linux)
|
||||
.IP \[bu] 2
|
||||
\f[CR]zorin\f[R] (Zorin OS)
|
||||
.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
|
||||
configuration.
|
||||
.IP \[bu] 2
|
||||
Download a .iso image of a Linux distribution
|
||||
.IP \[bu] 2
|
||||
Create a VM configuration file; for example
|
||||
\f[V]debian-bullseye.conf\f[R]
|
||||
\f[CR]debian\-bullseye.conf\f[R]
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
.EX
|
||||
guest_os=\[dq]linux\[dq]
|
||||
disk_img=\[dq]debian-bullseye/disk.qcow2\[dq]
|
||||
iso=\[dq]debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso\[dq]
|
||||
\f[R]
|
||||
.fi
|
||||
disk_img=\[dq]debian\-bullseye/disk.qcow2\[dq]
|
||||
iso=\[dq]debian\-bullseye/firmware\-11.0.0\-amd64\-DVD\-1.iso\[dq]
|
||||
.EE
|
||||
.IP \[bu] 2
|
||||
Use \f[V]quickemu\f[R] to start the virtual machine:
|
||||
Use \f[CR]quickemu\f[R] to start the virtual machine:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
quickemu --vm debian-bullseye.conf
|
||||
\f[R]
|
||||
.fi
|
||||
.EX
|
||||
quickemu \-\-vm debian\-bullseye.conf
|
||||
.EE
|
||||
.IP \[bu] 2
|
||||
Complete the installation as normal.
|
||||
.IP \[bu] 2
|
||||
Post-install:
|
||||
Post\-install:
|
||||
.RS 2
|
||||
.IP \[bu] 2
|
||||
Install the SPICE agent (\f[V]spice-vdagent\f[R]) in the guest to enable
|
||||
copy/paste and USB redirection.
|
||||
Install the SPICE agent (\f[CR]spice\-vdagent\f[R]) in the guest to
|
||||
enable copy/paste and USB redirection.
|
||||
.IP \[bu] 2
|
||||
Install the SPICE WebDAV agent (\f[V]spice-webdavd\f[R]) in the guest to
|
||||
enable file sharing.
|
||||
Install the SPICE WebDAV agent (\f[CR]spice\-webdavd\f[R]) in the guest
|
||||
to enable file sharing.
|
||||
.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[V]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.
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
quickget macos catalina
|
||||
quickemu --vm macos-catalina.conf
|
||||
\f[R]
|
||||
.fi
|
||||
.EX
|
||||
quickget macos big\-sur
|
||||
quickemu \-\-vm macos\-big\-sur.conf
|
||||
.EE
|
||||
.PP
|
||||
macOS \f[V]high-sierra\f[R], \f[V]mojave\f[R], \f[V]catalina\f[R],
|
||||
\f[V]big-sur\f[R] and \f[V]monterey\f[R] are supported.
|
||||
macOS \f[CR]mojave\f[R], \f[CR]catalina\f[R], \f[CR]big\-sur\f[R],
|
||||
\f[CR]monterey\f[R], \f[CR]ventura\f[R] and \f[CR]sonoma\f[R] are
|
||||
supported.
|
||||
.IP \[bu] 2
|
||||
Use cursor keys and enter key to select the \f[B]macOS Base System\f[R]
|
||||
.IP \[bu] 2
|
||||
|
@ -273,13 +405,15 @@ From \f[B]macOS Utilities\f[R]
|
|||
Click \f[B]Disk Utility\f[R] and \f[B]Continue\f[R]
|
||||
.RS 2
|
||||
.IP \[bu] 2
|
||||
Select \f[V]QEMU HARDDISK Media\f[R] (\[ti]103.08GB) from the list and
|
||||
Select \f[CR]QEMU HARDDISK Media\f[R] (\[ti]103.08GB) from the list (on
|
||||
Big Sur and above use \f[CR]Apple Inc. VirtIO Block Device\f[R]) and
|
||||
click \f[B]Erase\f[R].
|
||||
.IP \[bu] 2
|
||||
Enter a \f[V]Name:\f[R] for the disk
|
||||
Enter a \f[CR]Name:\f[R] for the disk
|
||||
.IP \[bu] 2
|
||||
If you are installing macOS Mojave or later (Catalina, Big Sur, and
|
||||
Monterey), choose any of the APFS options as the filesystem.
|
||||
If you are installing macOS Mojave or later (Catalina, Big Sur,
|
||||
Monterey, Ventura and Sonoma), choose any of the APFS options as the
|
||||
filesystem.
|
||||
MacOS Extended may not work.
|
||||
.RE
|
||||
.IP \[bu] 2
|
||||
|
@ -307,10 +441,10 @@ disk you named
|
|||
.RE
|
||||
.IP \[bu] 2
|
||||
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
|
||||
the out\-of\-the\-box first\-start wizard to configure various options
|
||||
and set up your username and password
|
||||
.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
|
||||
SSD disks.
|
||||
This feature in our macOS installation will allow QuickEmu to compact
|
||||
|
@ -325,54 +459,47 @@ command followed by pressing enter to tell macos to use the TRIM command
|
|||
on the hard disk when files are deleted:
|
||||
.RE
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
.EX
|
||||
sudo trimforce enable
|
||||
\f[R]
|
||||
.fi
|
||||
.EE
|
||||
.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.
|
||||
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
|
||||
type y (for a \[lq]yes\[rq] response) followed by enter to confirm.
|
||||
If you press enter without first typing y the system will consider that
|
||||
a negative response as though you said \[lq]no\[rq]:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
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)?
|
||||
\f[R]
|
||||
.fi
|
||||
type y (for a \[dq]yes\[dq] response) followed by enter to confirm.
|
||||
.PP
|
||||
And a second confirmation once you\[cq]ve confirmed the previous one:
|
||||
If you press enter without first typing y the system will consider that
|
||||
a negative response as though you said \[dq]no\[dq]:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
.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.
|
||||
Are you sure you with to proceed (y/N)?
|
||||
.EE
|
||||
.PP
|
||||
And a second confirmation once you\[aq]ve confirmed the previous one:
|
||||
.IP
|
||||
.EX
|
||||
Your system will immediately reboot when this is complete.
|
||||
Is this OK (y/N)?
|
||||
\f[R]
|
||||
.fi
|
||||
.EE
|
||||
.PP
|
||||
As the last message states, your system will automatically reboot as
|
||||
soon as the command completes.
|
||||
.PP
|
||||
The default macOS configuration looks like this:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
.EX
|
||||
guest_os=\[dq]macos\[dq]
|
||||
img=\[dq]macos-catalina/RecoveryImage.img\[dq]
|
||||
disk_img=\[dq]macos-catalina/disk.qcow2\[dq]
|
||||
macos_release=\[dq]catalina\[dq]
|
||||
\f[R]
|
||||
.fi
|
||||
img=\[dq]macos\- big\-sur/RecoveryImage.img\[dq]
|
||||
disk_img=\[dq]macos\- big\-sur/disk.qcow2\[dq]
|
||||
macos_release=\[dq] big\-sur\[dq]
|
||||
.EE
|
||||
.IP \[bu] 2
|
||||
\f[V]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.
|
||||
.IP \[bu] 2
|
||||
\f[V]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.
|
||||
.RS 2
|
||||
.IP \[bu] 2
|
||||
|
@ -382,48 +509,60 @@ Sur and newer, but not previous releases.
|
|||
And VirtIO Block Media (disks) are supported/stable in Catalina and
|
||||
newer.
|
||||
.RE
|
||||
.SS macOS compatibility
|
||||
.PP
|
||||
.SH macOS compatibility
|
||||
There are some considerations when running macOS via Quickemu.
|
||||
.IP \[bu] 2
|
||||
Supported macOS releases:
|
||||
.RS 2
|
||||
.IP \[bu] 2
|
||||
High Sierra
|
||||
.IP \[bu] 2
|
||||
Mojave
|
||||
.IP \[bu] 2
|
||||
Catalina \f[B](Recommended)\f[R]
|
||||
Catalina
|
||||
.IP \[bu] 2
|
||||
Big Sur
|
||||
.IP \[bu] 2
|
||||
Monterey
|
||||
.IP \[bu] 2
|
||||
Ventura
|
||||
.IP \[bu] 2
|
||||
Sonoma
|
||||
.RE
|
||||
.IP \[bu] 2
|
||||
\f[V]quickemu\f[R] will automatically download the required
|
||||
OpenCore (https://github.com/acidanthera/OpenCorePkg) bootloader and
|
||||
OVMF firmware from OSX-KVM (https://github.com/kholia/OSX-KVM).
|
||||
\f[CR]quickemu\f[R] will automatically download the required \c
|
||||
.UR https://github.com/acidanthera/OpenCorePkg
|
||||
OpenCore
|
||||
.UE \c
|
||||
\ bootloader and OVMF firmware from \c
|
||||
.UR https://github.com/kholia/OSX-KVM
|
||||
OSX\-KVM
|
||||
.UE \c
|
||||
\&.
|
||||
.IP \[bu] 2
|
||||
Optimised by default, but no GPU acceleration is available.
|
||||
.RS 2
|
||||
.IP \[bu] 2
|
||||
Host CPU vendor is detected and guest CPU is optimised accordingly.
|
||||
.IP \[bu] 2
|
||||
VirtIO Block
|
||||
Media (https://www.kraxel.org/blog/2019/06/macos-qemu-guest/) is used
|
||||
for the system disk where supported.
|
||||
\c
|
||||
.UR https://www.kraxel.org/blog/2019/06/macos-qemu-guest/
|
||||
VirtIO Block Media
|
||||
.UE \c
|
||||
\ is used for the system disk where supported.
|
||||
.IP \[bu] 2
|
||||
VirtIO \f[V]usb-tablet\f[R] (http://philjordan.eu/osx-virt/) is used for
|
||||
the mouse.
|
||||
\c
|
||||
.UR http://philjordan.eu/osx-virt/
|
||||
VirtIO \f[CR]usb\-tablet\f[R]
|
||||
.UE \c
|
||||
\ is used for the mouse.
|
||||
.IP \[bu] 2
|
||||
VirtIO Network (\f[V]virtio-net\f[R]) is supported and enabled on macOS
|
||||
Big Sur and newer but previous releases use \f[V]vmxnet3\f[R].
|
||||
VirtIO Network (\f[CR]virtio\-net\f[R]) is supported and enabled on
|
||||
macOS Big Sur and newer, but earlier releases use \f[CR]vmxnet3\f[R].
|
||||
.IP \[bu] 2
|
||||
VirtIO Memory Ballooning is supported and enabled on macOS Big Sur and
|
||||
newer but disabled for other support macOS releases.
|
||||
.RE
|
||||
.IP \[bu] 2
|
||||
USB host and SPICE pass-through is:
|
||||
USB host and SPICE pass\-through is:
|
||||
.RS 2
|
||||
.IP \[bu] 2
|
||||
UHCI (USB 2.0) on macOS Catalina and earlier.
|
||||
|
@ -431,104 +570,141 @@ UHCI (USB 2.0) on macOS Catalina and earlier.
|
|||
XHCI (USB 3.0) on macOS Big Sur and newer.
|
||||
.RE
|
||||
.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
|
||||
\f[B]Full Duplex audio requires VoodooHDA
|
||||
OC (https://github.com/chris1111/VoodooHDA-OC) or pass-through a USB
|
||||
audio-device to the macOS guest VM\f[R].
|
||||
\f[B]Full Duplex audio requires \c
|
||||
.UR https://github.com/chris1111/VoodooHDA-OC
|
||||
VoodooHDA OC
|
||||
.UE \c
|
||||
\ or pass\-through a USB audio\-device to the macOS guest VM\f[R].
|
||||
.RS 2
|
||||
.IP \[bu] 2
|
||||
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
|
||||
\c
|
||||
.UR https://disable-gatekeeper.github.io/
|
||||
Gatekeeper
|
||||
.UE \c
|
||||
\ and \c
|
||||
.UR https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection
|
||||
System Integrity Protection (SIP)
|
||||
.UE \c
|
||||
\ need to be disabled to install VoodooHDA OC
|
||||
.RE
|
||||
.IP \[bu] 2
|
||||
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).
|
||||
File sharing between guest and host is available via \c
|
||||
.UR https://wiki.qemu.org/Documentation/9psetup
|
||||
virtio\-9p
|
||||
.UE \c
|
||||
\ and \c
|
||||
.UR https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24
|
||||
SPICE webdavd
|
||||
.UE \c
|
||||
\&.
|
||||
.IP \[bu] 2
|
||||
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]\[dq]Your device or computer could not be
|
||||
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].
|
||||
Use \f[CR]ifconfig\f[R] in a terminal to verify this.
|
||||
.PP
|
||||
If you see \f[I]\[lq]Your device or computer could not be
|
||||
verified\[rq]\f[R] when you try to login to the App Store, make sure
|
||||
that your wired ethernet device is \f[V]en0\f[R].
|
||||
Use \f[V]ifconfig\f[R] in a terminal to verify this.
|
||||
.PP
|
||||
If the wired ethernet device is not \f[V]en0\f[R], then then go to
|
||||
\f[I]System Preferences\f[R] -> \f[I]Network\f[R], delete all the
|
||||
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
|
||||
network devices and apply the changes.
|
||||
Next, open a terminal and run the following:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
.EX
|
||||
sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
|
||||
\f[R]
|
||||
.fi
|
||||
.EE
|
||||
.PP
|
||||
Now reboot, and the App Store should work.
|
||||
.SS Windows 10 & 11 Guests
|
||||
.PP
|
||||
\f[V]quickget\f[R] can not download
|
||||
Windows10 (https://www.microsoft.com/software-download/windows10) and
|
||||
Windows 11 (https://www.microsoft.com/software-download/windows11)
|
||||
automatically, but does automatically create an optimised virtual
|
||||
machine configuration that you can just add an Windows .iso image to.
|
||||
This configuration also includes the VirtIO drivers for
|
||||
Windows (https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/).
|
||||
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
|
||||
.UR https://www.microsoft.com/software-download/windows10
|
||||
\f[B]Windows 10\f[R]
|
||||
.UE \c
|
||||
\ and \c
|
||||
.UR https://www.microsoft.com/software-download/windows11
|
||||
\f[B]Windows 11\f[R]
|
||||
.UE \c
|
||||
\ automatically and create an optimised virtual machine configuration.
|
||||
This configuration also includes the \c
|
||||
.UR https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/
|
||||
VirtIO drivers for Windows
|
||||
.UE \c
|
||||
\&.
|
||||
.PP
|
||||
\f[B]Windows 8.1\f[R] is also supported but doesn\[aq]t feature any
|
||||
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
|
||||
.nf
|
||||
\f[C]
|
||||
.EX
|
||||
quickget windows 11
|
||||
quickemu --vm windows-11.conf
|
||||
\f[R]
|
||||
.fi
|
||||
quickemu \-\-vm windows\-11.conf
|
||||
.EE
|
||||
.IP \[bu] 2
|
||||
Complete the installation as you normally would.
|
||||
.IP \[bu] 2
|
||||
All relevant drivers and services should be installed automatically.
|
||||
.IP \[bu] 2
|
||||
A local adminstrator user account is automatically created, with these
|
||||
A local administrator user account is automatically created, with these
|
||||
credentials:
|
||||
.RS 2
|
||||
.IP \[bu] 2
|
||||
Username: \f[V]Quickemu\f[R]
|
||||
Username: \f[CR]Quickemu\f[R]
|
||||
.IP \[bu] 2
|
||||
Password: \f[V]quickemu\f[R]
|
||||
Password: \f[CR]quickemu\f[R]
|
||||
.RE
|
||||
.PP
|
||||
The default Windows 11 configuration looks like this:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
guest_os=\[dq]windows\[dq]
|
||||
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]on\[dq]
|
||||
\f[R]
|
||||
.fi
|
||||
.IP \[bu] 2
|
||||
\f[V]guest_os=\[dq]windows\[dq]\f[R] instructs \f[V]quickemu\f[R] to
|
||||
optimise for Windows.
|
||||
.IP \[bu] 2
|
||||
\f[V]fixed_iso=\f[R] specifies the ISO image that provides VirtIO
|
||||
drivers.
|
||||
.IP \[bu] 2
|
||||
\f[V]tpm=\[dq]on\[dq]\f[R] instructs \f[V]quickemu\f[R] to create a
|
||||
software emulated TPM device using \f[V]swtpm\f[R].
|
||||
Further information is available from the project \c
|
||||
.UR https://github.com/quickemu-project/quickemu/wiki/04-Create-Windows-virtual-machines
|
||||
wiki
|
||||
.UE \c
|
||||
.SH AUTHORS
|
||||
.PP
|
||||
Written by Martin Wimpress.
|
||||
.SH BUGS
|
||||
.PP
|
||||
Submit bug reports online at:
|
||||
<https://github.com/quickemu-project/quickemu/issues>
|
||||
Submit bug reports online at: \c
|
||||
.UR https://github.com/quickemu-project/quickemu/issues
|
||||
.UE \c
|
||||
.SH SEE ALSO
|
||||
Full sources at: \c
|
||||
.UR https://github.com/quickemu-project/quickemu
|
||||
.UE \c
|
||||
.PP
|
||||
Full sources at: <https://github.com/quickemu-project/quickemu>
|
||||
.PP
|
||||
quickemu(1), quickemu_conf(1), quickgui(1)
|
||||
quickemu(1), quickemu_conf(5), quickgui(1)
|
||||
.SH AUTHORS
|
||||
Martin Wimpress.
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
author: Martin Wimpress
|
||||
date: April 26, 2023
|
||||
date: December 30, 2024
|
||||
footer: quickget
|
||||
header: Quickget User Manual
|
||||
section: 1
|
||||
|
@ -22,210 +22,326 @@ configuration for `quickemu` to use to build and run
|
|||
|
||||
# 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.
|
||||
|
||||
**\[OS\] \[Release\] \[Edition\]**
|
||||
: specify the OS and release (and optional edition) if insufficient
|
||||
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
|
||||
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
|
||||
|
||||
## Ubuntu Guest
|
||||
## Creating Linux guests 🐧
|
||||
|
||||
### Ubuntu
|
||||
|
||||
`quickget` will automatically download an Ubuntu release and create the
|
||||
virtual machine configuration.
|
||||
|
||||
``` bash
|
||||
``` shell
|
||||
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`
|
||||
- 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
|
||||
### Ubuntu daily-live images
|
||||
|
||||
`quickget` can also download/refresh devel images via `zsync` for Ubuntu
|
||||
developers and testers.
|
||||
`quickget` can also download/refresh daily-live images via `zsync` for
|
||||
Ubuntu developers and testers.
|
||||
|
||||
``` bash
|
||||
quickget ubuntu devel
|
||||
quickemu --vm ubuntu-devel.conf
|
||||
``` shell
|
||||
quickget ubuntu daily-live
|
||||
quickemu --vm ubuntu-daily-live.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.
|
||||
You can run `quickget ubuntu daily-live` 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.
|
||||
|
||||
- `kubuntu` (Kubuntu)
|
||||
- `lubuntu` (Lubuntu)
|
||||
- `ubuntu-budgie` (Ubuntu Budgie)
|
||||
- `ubuntucinnamon` (Ubuntu Cinnamon)
|
||||
- `ubuntukylin` (Ubuntu Kylin)
|
||||
- `ubuntu-mate` (Ubuntu MATE)
|
||||
- `ubuntustudio` (Ubuntu Studio)
|
||||
- `ubuntu` (Ubuntu)
|
||||
- `ubuntu-unity` (Ubuntu Unity)
|
||||
- `xubuntu` (Xubuntu)
|
||||
The project
|
||||
[wiki](https://github.com/quickemu-project/quickemu/wiki/02-Create-Linux-virtual-machines)
|
||||
may have further information.
|
||||
|
||||
## Other Operating Systems
|
||||
- `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 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
|
||||
# show an OS ISO download URL for {os} {release} [edition]
|
||||
quickget --url fedora 38 Silverblue
|
||||
# test if an OS ISO is available for {os} {release} [edition]
|
||||
quickget --check nixos unstable plasma5
|
||||
# open an OS distribution homepage in a browser
|
||||
quickget --open-homepage ubuntu-mate
|
||||
# Only download image file into current directory, without creating VM
|
||||
quickget --download elementary 7.1
|
||||
```
|
||||
|
||||
The `--url`, `--check`, and `--download` options are fully functional
|
||||
for all operating systems, including Windows and macOS.
|
||||
|
||||
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:
|
||||
|
||||
- `alma` (Alma Linux)
|
||||
- `alpine` (Alpine Linux)
|
||||
- `android` (Android x86)
|
||||
- `archcraft` (Archcraft)
|
||||
- `archlinux` (Arch Linux)
|
||||
- `arcolinux` (Arco Linux)
|
||||
- `batocera` (Batocera)
|
||||
- `blendos` (BlendOS)
|
||||
- `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)
|
||||
- `gentoo` (Gentoo)
|
||||
- `ghostbsd` (GhostBSD)
|
||||
- `haiku` (Haiku)
|
||||
- `kali` (Kali)
|
||||
- `kdeneon` (KDE Neon)
|
||||
- `kolibrios` (KolibriOS)
|
||||
- `linuxmint` (Linux Mint)
|
||||
- `lmde` (Linux Mint Debian Edition)
|
||||
- `mageia` (Mageia)
|
||||
- `manjaro` (Manjaro)
|
||||
- `mxlinux` (MX Linux)
|
||||
- `netboot` (netboot.xyz)
|
||||
- `netbsd` (NetBSD)
|
||||
- `nixos` (NixOS)
|
||||
- `openbsd` (OpenBSD)
|
||||
- `opensuse` (openSUSE)
|
||||
- `oraclelinux` (Oracle Linux)
|
||||
- `popos` (Pop!\_OS)
|
||||
- `reactos` (ReactOS)
|
||||
- `rebornos` (RebornOS)
|
||||
- `rockylinux` (Rocky Linux)
|
||||
- `siduction` (Siduction)
|
||||
- `slackware` (Slackware)
|
||||
- `solus` (Solus)
|
||||
- `tails` (Tails)
|
||||
- `truenas-core` (TrueNAS Core)
|
||||
- `truenas-scale` (TrueNAS Scale)
|
||||
- `void` (Void Linux)
|
||||
- `vxlinux` (VX Linux)
|
||||
- `zorin` (Zorin OS)
|
||||
- `alma` (AlmaLinux)
|
||||
- `alpine` (Alpine Linux)
|
||||
- `android` (Android x86)
|
||||
- `antix` (Antix)
|
||||
- `archcraft` (Archcraft)
|
||||
- `archlinux` (Arch Linux)
|
||||
- `arcolinux` (Arco Linux)
|
||||
- `artixlinux` (Artix Linux)
|
||||
- `athenaos` (Athena OS)
|
||||
- `batocera` (Batocera)
|
||||
- `bazzite` (Bazzite)
|
||||
- `biglinux` (BigLinux)
|
||||
- `blendos` (BlendOS)
|
||||
- `bodhi` (Bodhi)
|
||||
- `bunsenlabs` (BunsenLabs)
|
||||
- `cachyos` (CachyOS)
|
||||
- `centos-stream` (CentOS Stream)
|
||||
- `chimeralinux` (Chimera Linux)
|
||||
- `crunchbang++` (Crunchbangplusplus)
|
||||
- `debian` (Debian)
|
||||
- `deepin` (Deepin)
|
||||
- `devuan` (Devuan)
|
||||
- `dragonflybsd` (DragonFlyBSD)
|
||||
- `easyos` (EasyOS)
|
||||
- `elementary` (elementary OS)
|
||||
- `endeavouros` (EndeavourOS)
|
||||
- `endless` (Endless OS)
|
||||
- `fedora` (Fedora)
|
||||
- `freebsd` (FreeBSD)
|
||||
- `freedos` (FreeDOS)
|
||||
- `garuda` (Garuda Linux)
|
||||
- `gentoo` (Gentoo)
|
||||
- `ghostbsd` (GhostBSD)
|
||||
- `gnomeos` (GNOME OS)
|
||||
- `guix` (Guix)
|
||||
- `haiku` (Haiku)
|
||||
- `holoiso` (HoloISO)
|
||||
- `kali` (Kali)
|
||||
- `kdeneon` (KDE Neon)
|
||||
- `kolibrios` (KolibriOS)
|
||||
- `linuxlite` (Linux Lite)
|
||||
- `linuxmint` (Linux Mint)
|
||||
- `lmde` (Linux Mint Debian Edition)
|
||||
- `maboxlinux` (Mabox Linux)
|
||||
- `mageia` (Mageia)
|
||||
- `manjaro` (Manjaro)
|
||||
- `mxlinux` (MX Linux)
|
||||
- `netboot` (netboot.xyz)
|
||||
- `netbsd` (NetBSD)
|
||||
- `nitrux` (Nitrux)
|
||||
- `nixos` (NixOS)
|
||||
- `nwg-shell` (nwg-shell)
|
||||
- `openbsd` (OpenBSD)
|
||||
- `openindiana` (OpenIndiana)
|
||||
- `opensuse` (openSUSE)
|
||||
- `oraclelinux` (Oracle Linux)
|
||||
- `parrotsec` (Parrot Security)
|
||||
- `peppermint` (PeppermintOS)
|
||||
- `popos` (Pop!\_OS)
|
||||
- `porteus` (Porteus)
|
||||
- `primtux` (PrimTux)
|
||||
- `proxmox-ve` (Proxmox VE)
|
||||
- `pureos` (PureOS)
|
||||
- `reactos` (ReactOS)
|
||||
- `rebornos` (RebornOS)
|
||||
- `rockylinux` (Rocky Linux)
|
||||
- `siduction` (Siduction)
|
||||
- `slackware` (Slackware)
|
||||
- `slax` (Slax)
|
||||
- `slint` (Slint)
|
||||
- `slitaz` (SliTaz)
|
||||
- `solus` (Solus)
|
||||
- `sparkylinux` (SparkyLinux)
|
||||
- `spirallinux` (SpiralLinux)
|
||||
- `tails` (Tails)
|
||||
- `tinycore` (Tiny Core Linux)
|
||||
- `trisquel` (Trisquel-)
|
||||
- `truenas-core` (TrueNAS Core)
|
||||
- `truenas-scale` (TrueNAS Scale)
|
||||
- `tuxedo-os` (Tuxedo OS)
|
||||
- `vanillaos` (Vanilla OS)
|
||||
- `void` (Void Linux)
|
||||
- `vxlinux` (VX Linux)
|
||||
- `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
|
||||
configuration.
|
||||
|
||||
- Download a .iso image of a Linux distribution
|
||||
- Create a VM configuration file; for example `debian-bullseye.conf`
|
||||
- Download a .iso image of a Linux distribution
|
||||
- Create a VM configuration file; for example `debian-bullseye.conf`
|
||||
|
||||
``` bash
|
||||
``` shell
|
||||
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:
|
||||
- Use `quickemu` to start the virtual machine:
|
||||
|
||||
``` bash
|
||||
``` shell
|
||||
quickemu --vm debian-bullseye.conf
|
||||
```
|
||||
|
||||
- Complete the installation as normal.
|
||||
- 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.
|
||||
- Complete the installation as normal.
|
||||
- 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
|
||||
## 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
|
||||
virtual machine configuration.
|
||||
|
||||
``` bash
|
||||
quickget macos catalina
|
||||
quickemu --vm macos-catalina.conf
|
||||
``` shell
|
||||
quickget macos big-sur
|
||||
quickemu --vm macos-big-sur.conf
|
||||
```
|
||||
|
||||
macOS `high-sierra`, `mojave`, `catalina`, `big-sur` and `monterey` are
|
||||
supported.
|
||||
macOS `mojave`, `catalina`, `big-sur`, `monterey`, `ventura` and
|
||||
`sonoma` are supported.
|
||||
|
||||
- Use cursor keys and enter key to select the **macOS Base System**
|
||||
- From **macOS Utilities**
|
||||
- Click **Disk Utility** and **Continue**
|
||||
- Select `QEMU HARDDISK Media` (\~103.08GB) from the list and
|
||||
click **Erase**.
|
||||
- Enter a `Name:` for the disk
|
||||
- If you are installing macOS Mojave or later (Catalina, Big
|
||||
Sur, and Monterey), 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
|
||||
`<kbd>`{=html}enter`</kbd>`{=html} to tell macos to use the TRIM
|
||||
command on the hard disk when files are deleted:
|
||||
- Use cursor keys and enter key to select the **macOS Base System**
|
||||
- From **macOS Utilities**
|
||||
- Click **Disk Utility** and **Continue**
|
||||
- Select `QEMU HARDDISK Media` (~103.08GB) from the list (on Big Sur
|
||||
and above use `Apple Inc. VirtIO Block Device`) and click
|
||||
**Erase**.
|
||||
- Enter a `Name:` for the disk
|
||||
- If you are installing macOS Mojave or later (Catalina, Big Sur,
|
||||
Monterey, Ventura and Sonoma), 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 <kbd>enter</kbd> to tell macos to use
|
||||
the TRIM command on the hard disk when files are deleted:
|
||||
|
||||
``` bash
|
||||
``` shell
|
||||
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
|
||||
`<kbd>`{=html}enter`</kbd>`{=html} the command will request confirmation
|
||||
in the form of two questions that require you to type
|
||||
`<kbd>`{=html}y`</kbd>`{=html} (for a "yes" response) followed by
|
||||
`<kbd>`{=html}enter`</kbd>`{=html} to confirm. If you press
|
||||
`<kbd>`{=html}enter`</kbd>`{=html} without first typing
|
||||
`<kbd>`{=html}y`</kbd>`{=html} the system will consider that a negative
|
||||
response as though you said "no":
|
||||
<kbd>enter</kbd> the command will request confirmation in the form of
|
||||
two questions that require you to type <kbd>y</kbd> (for a "yes"
|
||||
response) followed by <kbd>enter</kbd> to confirm.
|
||||
|
||||
If you press <kbd>enter</kbd> without first typing <kbd>y</kbd> the
|
||||
system will consider that a negative 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.
|
||||
|
@ -244,63 +360,64 @@ soon as the command completes.
|
|||
|
||||
The default macOS configuration looks like this:
|
||||
|
||||
``` bash
|
||||
``` shell
|
||||
guest_os="macos"
|
||||
img="macos-catalina/RecoveryImage.img"
|
||||
disk_img="macos-catalina/disk.qcow2"
|
||||
macos_release="catalina"
|
||||
img="macos- big-sur/RecoveryImage.img"
|
||||
disk_img="macos- big-sur/disk.qcow2"
|
||||
macos_release=" big-sur"
|
||||
```
|
||||
|
||||
- `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.
|
||||
- `guest_os="macos"` instructs Quickemu to optimise for macOS.
|
||||
- `macos_release=" big-sur"` 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
|
||||
# macOS compatibility
|
||||
|
||||
There are some considerations when running macOS via Quickemu.
|
||||
|
||||
- Supported macOS releases:
|
||||
- High Sierra
|
||||
- Mojave
|
||||
- Catalina **(Recommended)**
|
||||
- Big Sur
|
||||
- Monterey
|
||||
- `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
|
||||
- Supported macOS releases:
|
||||
- Mojave
|
||||
- Catalina
|
||||
- Big Sur
|
||||
- Monterey
|
||||
- Ventura
|
||||
- Sonoma
|
||||
- `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 earlier 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 be changed via `quickemu` using `--width` and
|
||||
`--height` command line arguments.
|
||||
- **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**.
|
||||
- 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
|
||||
# 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
|
||||
|
@ -310,49 +427,52 @@ 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
|
||||
``` shell
|
||||
sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
|
||||
```
|
||||
|
||||
Now reboot, and the App Store should work.
|
||||
|
||||
## Windows 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 not download
|
||||
[Windows10](https://www.microsoft.com/software-download/windows10) and
|
||||
[Windows 11](https://www.microsoft.com/software-download/windows11)
|
||||
automatically, but does automatically create an optimised virtual
|
||||
machine configuration that you can just add an Windows .iso image to.
|
||||
## [Creating Windows guests](https://github.com/quickemu-project/quickemu/wiki/04-Create-Windows-virtual-machines) 🪟
|
||||
|
||||
`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.
|
||||
This configuration also includes the [VirtIO drivers for
|
||||
Windows](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/).
|
||||
|
||||
``` bash
|
||||
**Windows 8.1** is also supported but doesn't feature any automated
|
||||
installation or driver optimisation.
|
||||
|
||||
`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
|
||||
quickemu --vm windows-11.conf
|
||||
```
|
||||
|
||||
- Complete the installation as you normally would.
|
||||
- All relevant drivers and services should be installed automatically.
|
||||
- A local adminstrator user account is automatically created, with
|
||||
these credentials:
|
||||
- Username: `Quickemu`
|
||||
- Password: `quickemu`
|
||||
- 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="on"
|
||||
```
|
||||
|
||||
- `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`.
|
||||
Further information is available from the project
|
||||
[wiki](https://github.com/quickemu-project/quickemu/wiki/04-Create-Windows-virtual-machines)
|
||||
|
||||
# AUTHORS
|
||||
|
||||
|
@ -367,4 +487,4 @@ Submit bug reports online at:
|
|||
|
||||
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