Compare commits
998 Commits
Author | SHA1 | Date |
---|---|---|
|
934ffacdd3 | |
|
3bb13330cc | |
|
6a34e59f7b | |
|
68e1eb5382 | |
|
aaf00ca76a | |
|
78b938facf | |
|
539b11bbf4 | |
|
4de41eb836 | |
|
4a11725b1e | |
|
508822fc90 | |
|
6d0a09e831 | |
|
8ebc01bd91 | |
|
ee531af4fb | |
|
a6367ccb78 | |
|
36082437e1 | |
|
808caa1e74 | |
|
bd178bb4c3 | |
|
f6b36c4ec5 | |
|
d912402e32 | |
|
58d7c41998 | |
|
7d7332a1fc | |
|
e4c2c5cf2b | |
|
91e06a64fd | |
|
9f90d46ea1 | |
|
6145f685aa | |
|
3d40baa0e4 | |
|
c6c75e6550 | |
|
0e6be87757 | |
|
517ba94203 | |
|
7ad2308fa3 | |
|
42d81b12bb | |
|
2129abf060 | |
|
0d61c0643e | |
|
89fa572c85 | |
|
45dd058774 | |
|
f25205f451 | |
|
6b51f740a4 | |
|
ed455b17a6 | |
|
727708b1ae | |
|
0c4e257048 | |
|
910d35f80c | |
|
616d10b594 | |
|
40f86c0af1 | |
|
15c0003442 | |
|
f01db134da | |
|
6d5b9231d2 | |
|
9dc70808c5 | |
|
daba59d46c | |
|
4ecf677a74 | |
|
3da9edc995 | |
|
b60ff761e7 | |
|
588e421040 | |
|
f87cc613ab | |
|
70b531c463 | |
|
ae94ac7c16 | |
|
eb0fd03137 | |
|
0c772d5619 | |
|
20b17cb129 | |
|
37190c7b3a | |
|
622ecfd4a4 | |
|
238ec98071 | |
|
eeee8266db | |
|
c2024d2490 | |
|
2a9d455307 | |
|
652708388e | |
|
373f133ac7 | |
|
a305f993c3 | |
|
a905d652e6 | |
|
42c83f7e6a | |
|
6334e82a42 | |
|
2c22f0c31e | |
|
122992112b | |
|
e27aa30804 | |
|
d0ae72a251 | |
|
ec0f276abf | |
|
a09d5128be | |
|
16a43af329 | |
|
17a5971e49 | |
|
3f7bc4a77a | |
|
24e081752d | |
|
8299bfc896 | |
|
70603de2a3 | |
|
20c1fe030d | |
|
1638b7a721 | |
|
9d4b82db20 | |
|
3de28e1e56 | |
|
8eda1e1150 | |
|
66a0af3a92 | |
|
0f8d56d2c8 | |
|
84595dc32f | |
|
002e366552 | |
|
3a20b31b49 | |
|
c915522962 | |
|
17f3cd7eeb | |
|
42ee12d51c | |
|
973e57eefa | |
|
bf3ee94724 | |
|
04be5de7f1 | |
|
4a871fff22 | |
|
37b0f5dd25 | |
|
790484cb7d | |
|
42c90e9771 | |
|
9332ff25cd | |
|
c10ba9aac0 | |
|
0cfeffbc82 | |
|
def912cce3 | |
|
75bd81d1e9 | |
|
1f0dc50194 | |
|
18cdda254b | |
|
35f8e9333d | |
|
070514d449 | |
|
bb103295ea | |
|
bc2858ecbf | |
|
a13d554374 | |
|
a2c3572512 | |
|
885d4a84b2 | |
|
fc43f861b7 | |
|
d3a95c2fe5 | |
|
113bd4d1f5 | |
|
3c50a65df5 | |
|
9276573c02 | |
|
8d9c63ff6c | |
|
aeb14a717b | |
|
00c53fb022 | |
|
ca8f81f7fb | |
|
0b1dbb4b9e | |
|
083ee169dd | |
|
5568e6d4a9 | |
|
b519043ddb | |
|
ec13f369c5 | |
|
e92fbe95a2 | |
|
e305c41118 | |
|
0440ce149b | |
|
8cf007f8eb | |
|
66dfa6451a | |
|
13f98e32d3 | |
|
a931b2fc2c | |
|
ecfafc8125 | |
|
f7861a6e7f | |
|
1cf80e7d81 | |
|
a36d51ac98 | |
|
93ef5b2f12 | |
|
f846d8f9aa | |
|
90e9bf5087 | |
|
6a4705e365 | |
|
e18b7ed591 | |
|
5d1c8dfc4c | |
|
811b48cc4e | |
|
52e50f9815 | |
|
589f2c9a5c | |
|
8c10b20fb7 | |
|
5e90e336fe | |
|
e035121f71 | |
|
14feb27a8c | |
|
88ae2a100e | |
|
e34e3c5169 | |
|
0addc66fb6 | |
|
e0492eac17 | |
|
8265298a7e | |
|
e6543c53bd | |
|
6714e687c3 | |
|
5f164bc53c | |
|
0b3c3048b6 | |
|
e9d3ff2179 | |
|
93557fb61d | |
|
626591bca8 | |
|
17f5932024 | |
|
faccbae06a | |
|
5f8c40f7ab | |
|
ded5971b6e | |
|
1c89f520f2 | |
|
a4860869ee | |
|
24a2a7b413 | |
|
130cd6a811 | |
|
3a07d353b9 | |
|
4b30ea21f4 | |
|
7afab97c63 | |
|
a85bb0897a | |
|
0f616dcf08 | |
|
e0523746fd | |
|
60c140cfe4 | |
|
7ff1c58c69 | |
|
33a5d71dda | |
|
c760932d48 | |
|
ac42e6b492 | |
|
7e0e3e8306 | |
|
b730adf109 | |
|
9572ea6ae9 | |
|
d60c7baa8b | |
|
2c6a050643 | |
|
56ec3c9e47 | |
|
b8aabcb892 | |
|
7e919dac30 | |
|
9303b73ebe | |
|
9b1c28dbe1 | |
|
a7271034cf | |
|
94035a5930 | |
|
271e0eb7d7 | |
|
585814cf87 | |
|
39ffb0b6f2 | |
|
cb97c14f9d | |
|
f4c362eda7 | |
|
d78255b097 | |
|
cf4b63c51d | |
|
b357fcf240 | |
|
9fe835d107 | |
|
1fea6b46c2 | |
|
7bfeb7721e | |
|
143e3574fb | |
|
6e01e38298 | |
|
1e7714a1af | |
|
5e96af3eca | |
|
590bd560cb | |
|
7f250ed1b0 | |
|
dbe9f612fb | |
|
b009e5cef5 | |
|
023a7355db | |
|
1b6cf0ad69 | |
|
3e6acd8c98 | |
|
ff02a7b2cb | |
|
db04a6686a | |
|
4a7f4a4932 | |
|
aaeb413e3e | |
|
8d8c31e136 | |
|
da42a211d6 | |
|
6985a5f135 | |
|
b7ab6f6d36 | |
|
587d218f14 | |
|
62377a77c0 | |
|
d7fe13356c | |
|
5ab447e18e | |
|
98802b4891 | |
|
83c16dad2c | |
|
cefa2556f3 | |
|
8f58d0e07c | |
|
f4fbb7dd29 | |
|
6c07e3acdc | |
|
a4818025d8 | |
|
c3792c61f4 | |
|
085dfea742 | |
|
7e5d26daab | |
|
eb661221ef | |
|
f14eed78ce | |
|
c5b96cfcd5 | |
|
63409682f2 | |
|
6528520d0f | |
|
989ad37d65 | |
|
685b2ef742 | |
|
20684681c6 | |
|
3d83553d62 | |
|
b8c6465581 | |
|
fb103ef072 | |
|
a67386755e | |
|
c194bad2d4 | |
|
79a8f474f7 | |
|
62f6e30c70 | |
|
0e6fe28141 | |
|
2ccfac7ec0 | |
|
4b36aed8c6 | |
|
57019e72dd | |
|
f0b41749f6 | |
|
178619d673 | |
|
6000546e35 | |
|
c30c4612b5 | |
|
e1ee983245 | |
|
c4b2216617 | |
|
aeacc82b32 | |
|
22d6932ce2 | |
|
5515a9e7d7 | |
|
37c89a62f6 | |
|
1158f5a207 | |
|
8f9f7d8aed | |
|
9cfc4f6ed7 | |
|
45470649cb | |
|
542fcbe50e | |
|
304d459ddb | |
|
f6b5d684d4 | |
|
aaf4ae4ff6 | |
|
325dc7f904 | |
|
f17cfe4e78 | |
|
0b892f82a0 | |
|
cbc3c20104 | |
|
124202511a | |
|
cfa131fb9c | |
|
f3b475ec42 | |
|
f850dcb8db | |
|
e29173a16d | |
|
212a5bd6d0 | |
|
94cdce7dd2 | |
|
980fb1f66a | |
|
45191a796e | |
|
44e653a48d | |
|
6d44ca8c2d | |
|
f723ce6196 | |
|
e6fe7602b9 | |
|
8db3100355 | |
|
4ccee8097b | |
|
c83dc45b11 | |
|
96b7e8f991 | |
|
88cc5f0056 | |
|
9cb021b174 | |
|
99ccc0460b | |
|
19d01e2900 | |
|
f83e710bd2 | |
|
5b017a5163 | |
|
f2fb7f0f69 | |
|
58af2d9d9d | |
|
6b052910e8 | |
|
355f0b14ed | |
|
b2012ab641 | |
|
b45926f83c | |
|
398d4e7246 | |
|
a0d33ca42b | |
|
48f74d2cec | |
|
46fb3e60fb | |
|
ef711a0bbc | |
|
b3a1300144 | |
|
622f6046c7 | |
|
054f471f18 | |
|
70055b746e | |
|
90c373f0ab | |
|
bbc57c14e9 | |
|
50111513be | |
|
a628ee687d | |
|
c6eadae173 | |
|
7163384c3c | |
|
faa24eb7f2 | |
|
edcc5a0f43 | |
|
8d2b99bf46 | |
|
4b3cb8ac0d | |
|
10ccf892cd | |
|
49b1397350 | |
|
06a18b0045 | |
|
2d4157f4c1 | |
|
7f877d108b | |
|
116c35a0c6 | |
|
26a904f861 | |
|
41f4c6ae01 | |
|
c69bded135 | |
|
212450765b | |
|
ea92320fe4 | |
|
5edc931726 | |
|
f09a3b740a | |
|
5f9ff30643 | |
|
db1e602cf1 | |
|
a9576fb3a4 | |
|
bc399df328 | |
|
0b5050511b | |
|
493bacc318 | |
|
d2b5ee4b18 | |
|
9dc669b44e | |
|
27ca4a27f0 | |
|
58599a98ab | |
|
1ae4af6244 | |
|
edfafdee5b | |
|
ed1e85fb12 | |
|
eb6e9bf4df | |
|
dc30cc51b1 | |
|
d01011a39c | |
|
bd9d1d8ba4 | |
|
4679d680f0 | |
|
4283c1f507 | |
|
135a08c7b0 | |
|
7b915d691c | |
|
f51697593a | |
|
4dab035d46 | |
|
16e8115e77 | |
|
637f6a9652 | |
|
da01bdf27d | |
|
cd34eed243 | |
|
2fd37d0489 | |
|
9b8ff34e81 | |
|
595d7ca2bb | |
|
ad5ca69aa0 | |
|
87a6cf1887 | |
|
0ead4637bf | |
|
0dfc0b93ab | |
|
32701815f9 | |
|
65f065a327 | |
|
9a79e7a5c6 | |
|
8c59f517c1 | |
|
4b70a341a9 | |
|
aa285f0f6e | |
|
85434103d7 | |
|
eb1f14e742 | |
|
013413ee8c | |
|
16adb86372 | |
|
ef55e74317 | |
|
efea85695b | |
|
42a3476508 | |
|
c727734a08 | |
|
341c44e372 | |
|
b9d0829d5d | |
|
e80cd7aeff | |
|
84c71e9cfc | |
|
aca168be60 | |
|
d45c86996f | |
|
eb08d5a6c6 | |
|
a1417acc7a | |
|
f282e4eb44 | |
|
da6aa9fb2c | |
|
d7cc6e8115 | |
|
6f92a52961 | |
|
69131b2e39 | |
|
dbb43157df | |
|
5e507e645c | |
|
6c2aad8e4d | |
|
80230f8469 | |
|
e005a55268 | |
|
e2b39bf826 | |
|
c84745b49f | |
|
d46482abf9 | |
|
3832fe731c | |
|
4ebb74a993 | |
|
fe2dc839ed | |
|
252f83c076 | |
|
394f955870 | |
|
1596179ca5 | |
|
6ffa1692d6 | |
|
aefc99efce | |
|
3292ce76ea | |
|
9104bdba1d | |
|
7eac685f25 | |
|
7cfdfd0cec | |
|
e52ba1fc60 | |
|
77fe26975d | |
|
ca87ff3b58 | |
|
b342e0ecb7 | |
|
e1a46b9b5a | |
|
46b981728d | |
|
805eae9bd5 | |
|
1e05e7a3b2 | |
|
31de07fb9c | |
|
f618ec3986 | |
|
ca70e88330 | |
|
c981e8b8e5 | |
|
e0e23864c8 | |
|
1637ee7fca | |
|
ef9390d43c | |
|
7e12bac3e6 | |
|
f44222ad6f | |
|
d408e15f51 | |
|
3ca857ace8 | |
|
ffbace0f4a | |
|
bad6ad7cd7 | |
|
b8c3f64c1c | |
|
c452b138d5 | |
|
f95e0e14cc | |
|
9b72928e36 | |
|
0ca8dc6436 | |
|
5b9399ae6d | |
|
ec7d2886e9 | |
|
3f72f6fd47 | |
|
0a7c196dd1 | |
|
87ad07601a | |
|
44f560150a | |
|
cc085f41ee | |
|
391d00eaf4 | |
|
d6e2dca565 | |
|
acde2de95a | |
|
cda1e1b723 | |
|
f3103a6604 | |
|
9eb54db525 | |
|
67893f5cb1 | |
|
19d09556c6 | |
|
4c47a2a3ab | |
|
2acc2f4f40 | |
|
04b37ccf02 | |
|
2e1b556b93 | |
|
c693dc9ba7 | |
|
50817d2dba | |
|
51cbd207fe | |
|
e5468e47c5 | |
|
e4c612118e | |
|
79c0486aad | |
|
182a0c11e7 | |
|
07f6205294 | |
|
f03d830c30 | |
|
2f6ab18812 | |
|
7c892c9dc2 | |
|
945933d5f4 | |
|
dcbfce86d2 | |
|
4abd7231c9 | |
|
19539d7b31 | |
|
5da3942278 | |
|
ed91628c29 | |
|
590bc24347 | |
|
4e2b553972 | |
|
e35f11b25e | |
|
b085bebfbe | |
|
6490d48bf9 | |
|
88d61eae4e | |
|
b7ff9f90db | |
|
9b2eeb6f93 | |
|
88d731895a | |
|
5a07cc5d92 | |
|
9f11bb3d02 | |
|
3b7f50d3d5 | |
|
b2205dfbd8 | |
|
d73d54a688 | |
|
fedfe11190 | |
|
0da48d73b0 | |
|
5026eaef06 | |
|
585dc7e023 | |
|
4defce0b0a | |
|
84c0b79c34 | |
|
7b6026a2f4 | |
|
a7490a3a0c | |
|
cabd4c3e1b | |
|
4ec5818502 | |
|
d21969aace | |
|
694dfb1fcd | |
|
0c95ac28b7 | |
|
6b7c071958 | |
|
49943967a3 | |
|
f5203bec11 | |
|
5290be956b | |
|
b1f9de6ef1 | |
|
b0a5ae91ce | |
|
24c6f62b73 | |
|
eae44aaa70 | |
|
ef1cff7ec8 | |
|
f3fff84952 | |
|
e4691ff6cd | |
|
52a5e5f4ef | |
|
9a09badfe5 | |
|
b61dd9336b | |
|
e935f80928 | |
|
f1ebc0c505 | |
|
95b6d8cf41 | |
|
faee2824a9 | |
|
befe1b8645 | |
|
fe5bdc3e3a | |
|
5493bb6364 | |
|
a488c2a7df | |
|
e9018c0aaf | |
|
ec8073cd1e | |
|
acdb709cc6 | |
|
d79a911d7d | |
|
6aab4a86c2 | |
|
26806f9604 | |
|
ba5bac7a81 | |
|
8a1eb9d5dc | |
|
06fbd84f12 | |
|
54c149aa6f | |
|
4c511a74d7 | |
|
ef68a6be16 | |
|
2460a8d621 | |
|
7b3abf181e | |
|
1d916a96f5 | |
|
3ebcc2297f | |
|
a5c2e0dd6b | |
|
491d071fde | |
|
11dfed7288 | |
|
f994691dad | |
|
7a6b42f8c9 | |
|
a279a50fd0 | |
|
bd11ebdb91 | |
|
c6aece3da5 | |
|
e797d55522 | |
|
4a422b9465 | |
|
a69a28ed4f | |
|
7f3d15f298 | |
|
673c38027e | |
|
0ff9238d85 | |
|
443ac72e2f | |
|
4be78cffb5 | |
|
752afa56f4 | |
|
95365eb5b6 | |
|
be32867ebb | |
|
777f451fe2 | |
|
d214ac5e14 | |
|
ccd6dc32c5 | |
|
e66b92565b | |
|
8fb58acd23 | |
|
af084aeeec | |
|
12b03d0fde | |
|
3099d7e96d | |
|
ade6860696 | |
|
a09be6a976 | |
|
0f3196ad45 | |
|
7ff266466c | |
|
89111cd8de | |
|
cd3f593a7a | |
|
6b95069304 | |
|
d111c44368 | |
|
c8ea62e50a | |
|
0f970a46f8 | |
|
409523d402 | |
|
ea99b9393c | |
|
b69893f48b | |
|
1ea307fff1 | |
|
12c53d4928 | |
|
1d4c8c9cce | |
|
b8387e3446 | |
|
43df80636d | |
|
03ac799287 | |
|
19d8563b79 | |
|
dff278a0dd | |
|
761ae2bdd5 | |
|
f843448218 | |
|
9c0d446de6 | |
|
50d124294c | |
|
346d291f73 | |
|
9cd8938608 | |
|
1765ae8714 | |
|
2ddae45d67 | |
|
358b0ff514 | |
|
b884a6443d | |
|
113bc2a3c9 | |
|
76521b9479 | |
|
5e2351a446 | |
|
02444e74c5 | |
|
0d6a434ecd | |
|
5911d2af41 | |
|
5f6495c871 | |
|
d2b6806e08 | |
|
2f9c60dc6a | |
|
18d76996c5 | |
|
d18fc5ee16 | |
|
987fabef2f | |
|
5b1728481c | |
|
e03487def3 | |
|
daf59c0ab0 | |
|
40301415e4 | |
|
f2e9a81a0a | |
|
2b05eb832c | |
|
956a3caec5 | |
|
f7a6ec0245 | |
|
4efd5f7d93 | |
|
0f69aeae9a | |
|
02b93d9bbe | |
|
9ad1be3ec1 | |
|
d2081b53ac | |
|
f907ddac41 | |
|
47eec2fe15 | |
|
11453885cc | |
|
66aca19437 | |
|
eed65ddc81 | |
|
0057b3fbee | |
|
539731820f | |
|
f555b2a3d9 | |
|
218d8ca3fd | |
|
e49d608473 | |
|
96cc14a322 | |
|
11a13d4342 | |
|
c1964f37aa | |
|
412d59ab4f | |
|
3ea219264b | |
|
a71c9e107b | |
|
0b176ba15d | |
|
675ace38c5 | |
|
b3524d1106 | |
|
4099961577 | |
|
a785c3a7b1 | |
|
75df94154e | |
|
32f573fc36 | |
|
05c7165fbc | |
|
53e7f2b203 | |
|
d72f007b9c | |
|
937f68e01f | |
|
e0d2f8ebe1 | |
|
1f4e89c098 | |
|
b23b1c1459 | |
|
2714661e1b | |
|
b811977464 | |
|
983c6af8a6 | |
|
a885ed5b6f | |
|
08bcac1cf9 | |
|
1f084009df | |
|
370d7d5843 | |
|
c5ec090970 | |
|
9bbfd6dafe | |
|
12a17a82a6 | |
|
ba67f7ff71 | |
|
39d1bff0c2 | |
|
a948ece78d | |
|
7814f74377 | |
|
6ae74a397c | |
|
7a88eab9af | |
|
a2b6250680 | |
|
07b1284d2a | |
|
3d36ea703d | |
|
87c70e10ee | |
|
7cd3e4e669 | |
|
d90b1ac669 | |
|
d7cbf04f47 | |
|
158bbf36c4 | |
|
70984dfda9 | |
|
41b734e23a | |
|
592572345c | |
|
eb78e7780e | |
|
0cd462408a | |
|
f6ce01a09e | |
|
636dc16f7a | |
|
c864de7876 | |
|
c36497a88a | |
|
af7fe35742 | |
|
0596f3b243 | |
|
cf5b404dce | |
|
bc39f15369 | |
|
afb872d9f4 | |
|
41264636ea | |
|
89b2c7412e | |
|
57eea29cb2 | |
|
44d0d10c6e | |
|
5396e86eec | |
|
9e99b08a8c | |
|
4619b71b4e | |
|
86cb0cdf04 | |
|
592b838db6 | |
|
806b1a439f | |
|
c7af18f0f4 | |
|
4eb1b4d09b | |
|
fc96b66ada | |
|
de798af9b0 | |
|
4e891ec52d | |
|
846868d5c1 | |
|
077a9f409b | |
|
ae5c514982 | |
|
3278858050 | |
|
b65e659bf1 | |
|
84fea55597 | |
|
832907a7e2 | |
|
598aaaf78c | |
|
9732081dc5 | |
|
795c84b415 | |
|
8bd89fb30d | |
|
dc40f59a2c | |
|
9eb4d86745 | |
|
a260e9b45d | |
|
dbcbd12c80 | |
|
005f3375cd | |
|
f8ddb4cef3 | |
|
660af25250 | |
|
1b42fbeda3 | |
|
b2bcf036f8 | |
|
a2c58ea3e5 | |
|
0302973278 | |
|
8e87089a34 | |
|
a2c3181191 | |
|
7fb1400c7e | |
|
139601d024 | |
|
8e14a580c4 | |
|
0f22368cfb | |
|
2b3a2997a6 | |
|
03d905435d | |
|
a300b200a4 | |
|
f94e975029 | |
|
5cb578acc6 | |
|
44a7caf1a0 | |
|
22af654167 | |
|
9234765d3a | |
|
97bff52088 | |
|
30b09bc070 | |
|
5b9de101d8 | |
|
cbd03d7824 | |
|
50d6ff045e | |
|
2750b9179f | |
|
729729fd6d | |
|
234cf563d5 | |
|
7984fe2e5e | |
|
ee3d432736 | |
|
2d0eb009eb | |
|
4b0d5e7a56 | |
|
c98cd172a5 | |
|
5cb6baa439 | |
|
6effd819e8 | |
|
3ff9ea5204 | |
|
866fed32c7 | |
|
2274d3d923 | |
|
55a4c85820 | |
|
4a52480fe6 | |
|
e430c3fbe3 | |
|
ec142f6cdc | |
|
b07b5cdec2 | |
|
c071d1dd8d | |
|
75816eb35d | |
|
681ee3a9aa | |
|
b69c62e051 | |
|
2e9b650711 | |
|
f35524f8a3 | |
|
9bf12fee68 | |
|
9de248fbaa | |
|
57b55f5e22 | |
|
5eb4b39c81 | |
|
e726789238 | |
|
8e5ad375f3 | |
|
fc95daed9f | |
|
6c95750fe2 | |
|
8726bf9fad | |
|
de79448b39 | |
|
074796db4c | |
|
1823596fac | |
|
fb6484588c | |
|
de7dca9b90 | |
|
404661abec | |
|
01aa720419 | |
|
86ed099283 | |
|
3b01fb26dd | |
|
30dd6a9cd0 | |
|
297fa080f3 | |
|
b11dcdc0fa | |
|
8f413b0ec9 | |
|
5dd44c6fe5 | |
|
35a80ef6b9 | |
|
568032077b | |
|
789ef5645d | |
|
6662ab1740 | |
|
897aae02ab | |
|
81f0506bf7 | |
|
8f20ae1e5d | |
|
f27882926a | |
|
e9fe08f36a | |
|
00fcd9675b | |
|
da5f3c91d0 | |
|
b5e4891d5c | |
|
00e80c6fd2 | |
|
1a25318d89 | |
|
d0c5d83cbb | |
|
f7c88e12ba | |
|
b2dfb55406 | |
|
46724130ac | |
|
d01855e0ed | |
|
911726aa61 | |
|
1afade4eda | |
|
d3676dcdb6 | |
|
c0a3b0a686 | |
|
3796fa7596 | |
|
f4432af3d9 | |
|
522c266ee7 | |
|
28e1abf6bd | |
|
607afdd004 | |
|
af7eb4ab65 | |
|
873e3b0bcc | |
|
4b1b6f8382 | |
|
e8557d4fd7 | |
|
85936d8128 | |
|
b0a439ceb7 | |
|
f007e06abe | |
|
8a198b0031 | |
|
62064c0c13 | |
|
9665a11e21 | |
|
c39cf208e7 | |
|
f5c805c25c | |
|
a8be31056e | |
|
37959f9933 | |
|
1b7050103c | |
|
e1952d7e56 | |
|
ce39944f43 | |
|
d280a48acd | |
|
6f88ffedbc | |
|
1ed0a4d14e | |
|
f40a90772b | |
|
f0fb2c8f6f | |
|
ea454aea76 | |
|
6e4d7850fb | |
|
92da03aa90 | |
|
36dce7b616 | |
|
c246b3a1d0 | |
|
6b74ef78d7 | |
|
67ddb91915 | |
|
3722b13ecb | |
|
c2778e1b27 | |
|
328a6b5bf6 | |
|
93e0125880 | |
|
60eae62ac7 | |
|
8768283af0 | |
|
7e3515aa06 | |
|
dc81b8c2b3 | |
|
d7e41bc704 | |
|
b6f5b1aeb8 | |
|
3c6e803c77 | |
|
6266e37eec | |
|
c9f477517a | |
|
febb854aa8 | |
|
d2797b6834 | |
|
b486a7519d | |
|
f305103f6d | |
|
08746937db | |
|
7600932b12 | |
|
e017c2dfa6 | |
|
9c09fdb000 | |
|
b1c75d3b5d | |
|
1012109536 | |
|
1004c3428b | |
|
272334b2a7 | |
|
ee65d6ee26 | |
|
9b0e0a880b | |
|
2a67445c65 | |
|
2b4c60fc1f | |
|
dd35355f70 | |
|
4281e0daf3 | |
|
9b5593749b | |
|
4f886f7c80 | |
|
652d91d33a | |
|
6028a611c0 | |
|
0c910be5c4 | |
|
bf8fa84c4f | |
|
c23b2afd80 | |
|
d96978d1c2 | |
|
c3acd28c6b | |
|
29167d8528 | |
|
20b5e1c335 | |
|
7c53267153 | |
|
9ff5f02d8f | |
|
15e4726801 | |
|
c703f8518e | |
|
626c63cb7e | |
|
b6e71f985a | |
|
707a45d909 | |
|
4cc1b90b25 | |
|
0f04a90bdb | |
|
44f885551e | |
|
a6993b1b52 | |
|
6418593dfa | |
|
96ba1f8f9b | |
|
005d2b2d1b | |
|
0f1eb545c0 | |
|
29be0990fe | |
|
592271d46b | |
|
156e11af32 | |
|
a346855bab | |
|
ae7b47f7f9 | |
|
cb33fa0bc8 | |
|
534f7fc342 | |
|
7394518602 | |
|
7a3e3c802a | |
|
bd0327c7b8 | |
|
0a472db085 | |
|
f5d87cf419 | |
|
c6462e9fa4 | |
|
bea27b1ffa | |
|
d1c4fa9de5 | |
|
8aa7ccc796 | |
|
465623b904 | |
|
24bcdfdb9a | |
|
33b8133a33 | |
|
eac8cc2031 | |
|
4337aff726 | |
|
91389d6be4 | |
|
10d69b72d0 | |
|
70cf5c2100 | |
|
d030221214 | |
|
77123d0751 | |
|
f2087c376b | |
|
56e1c22e50 | |
|
f03061d8a7 | |
|
6a60919293 | |
|
e9299fc8b3 | |
|
0d5b97e186 | |
|
f018aee3aa | |
|
facb5d163e | |
|
147e938e93 | |
|
e96e90ebc7 | |
|
b36e62694c | |
|
5e980a8631 | |
|
bce0dbffbe | |
|
4c6c078d3c | |
|
5e7e677131 | |
|
efd8913de1 | |
|
d5dc137016 | |
|
411d87d63e | |
|
62c4c44090 | |
|
59033897c8 | |
|
e03d438b00 | |
|
df5877bd7d | |
|
eb5fe7aedc | |
|
0858f31701 | |
|
2fb13f64c9 | |
|
3843388258 | |
|
a2d2e570ea | |
|
51f17bb5ef | |
|
68e23b41a7 | |
|
26ceeed84b | |
|
7ff84160ec | |
|
b12ac6c2a4 | |
|
3c221ebdf1 | |
|
6247838abb | |
|
5d497ed2a0 | |
|
41fe0093c8 | |
|
ed8d613b8e | |
|
558c7245df | |
|
f0b4d63412 | |
|
98e44bbaa8 | |
|
b3802a356e | |
|
6216adf6a8 | |
|
c9df8f3b32 | |
|
fb9298448e | |
|
3e22c2b3de | |
|
194ec452be | |
|
df57ed1a68 | |
|
e43d291b37 | |
|
8ab2590e5b | |
|
d680eecbdc | |
|
59865c894e | |
|
286ac1bcfe | |
|
35a6588825 |
|
@ -1,5 +1,3 @@
|
||||||
# These are supported funding model platforms
|
# These are supported funding model platforms
|
||||||
|
|
||||||
github: flexiondotorg
|
github: [flexiondotorg, philclifford, lj3954]
|
||||||
patreon: wimpysworld
|
|
||||||
custom: https://wimpysworld.io/tip
|
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: 'bug: description of the bug you encountered'
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**I confirm this bug has not already been reported**
|
||||||
|
- [ ] I have searched the issues and this bug has not been reported previously
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
Steps to reproduce the behaviour:
|
||||||
|
1. Run `quickemu` with arguments '...'
|
||||||
|
2. See error
|
||||||
|
|
||||||
|
**Expected behaviour**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Quickemu output**
|
||||||
|
Run `quickemu` or `quickemu` and include the output of the failure below:
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Quickemu output</summary>
|
||||||
|
|
||||||
|
```text
|
||||||
|
quickemu/quickget output here
|
||||||
|
```
|
||||||
|
</details>
|
||||||
|
|
||||||
|
**System information**
|
||||||
|
Run `quickreport` and include the output here; if you can't run `quickreport`,
|
||||||
|
please provide the output of the following:
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Quickreport output</summary>
|
||||||
|
|
||||||
|
```text
|
||||||
|
quickreport output here
|
||||||
|
```
|
||||||
|
</details>
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
|
@ -0,0 +1,23 @@
|
||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: 'feat: describe the feature you are requesting'
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**I confirm this feature has not been previously requested**
|
||||||
|
- [ ] I have searched the issues and this feature has not previously been requested
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
Binary file not shown.
After Width: | Height: | Size: 3.7 KiB |
|
@ -1,24 +0,0 @@
|
||||||
#### Expected behaviour
|
|
||||||
|
|
||||||
Describe the your expected behaviour.
|
|
||||||
|
|
||||||
#### Actual behaviour
|
|
||||||
|
|
||||||
Describe the actual behaviour.
|
|
||||||
|
|
||||||
#### Steps to reproduce the behaviour
|
|
||||||
|
|
||||||
Outline the step to reproduce the issue you've encountered.
|
|
||||||
|
|
||||||
#### Quickemu output
|
|
||||||
|
|
||||||
Run `quickemu` or `quickget` and paste the output here.
|
|
||||||
|
|
||||||
#### Linux Distribution & Kernel
|
|
||||||
|
|
||||||
Run the following and paste the output.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
lsb_release --all
|
|
||||||
uname -a
|
|
||||||
```
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
# Description
|
||||||
|
|
||||||
|
Please include a summary of the changes along with any relevant motivation and context.
|
||||||
|
|
||||||
|
<!-- Close any related issues. Delete if not relevant -->
|
||||||
|
|
||||||
|
- Closes #
|
||||||
|
- Fixes #
|
||||||
|
- Resolves #
|
||||||
|
|
||||||
|
## Type of change
|
||||||
|
|
||||||
|
<!-- Delete any that are not relevant -->
|
||||||
|
|
||||||
|
- [ ] Bug fix (non-breaking change which fixes an issue)
|
||||||
|
- [ ] New feature (non-breaking change which adds functionality)
|
||||||
|
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
||||||
|
- [ ] Packaging (updates the packaging)
|
||||||
|
- [ ] Documentation (updates the documentation)
|
||||||
|
|
||||||
|
# Checklist:
|
||||||
|
|
||||||
|
- [ ] I have performed a self-review of my code
|
||||||
|
- [ ] I have tested my code in common scenarios and confirmed there are no regressions
|
||||||
|
- [ ] I have added comments to my code, particularly in hard-to-understand sections
|
||||||
|
- [ ] I have made corresponding changes to the documentation (*remove if no documentation changes were required*)
|
Binary file not shown.
Before Width: | Height: | Size: 22 KiB |
|
@ -0,0 +1,21 @@
|
||||||
|
name: Flake ❄️ Checker ✅
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
schedule:
|
||||||
|
- cron: '42 0 * * 6'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
flake-checker:
|
||||||
|
name: Flake Checker
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: DeterminateSystems/nix-installer-action@v19
|
||||||
|
- uses: DeterminateSystems/magic-nix-cache-action@v9
|
||||||
|
- uses: DeterminateSystems/flake-checker-action@v12
|
|
@ -0,0 +1,20 @@
|
||||||
|
name: Flake ❄️ Lock 🔒️ Updater ✨
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '37 13 14,28 * *'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lock-updater:
|
||||||
|
name: Flake Lock Updater
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: DeterminateSystems/nix-installer-action@v19
|
||||||
|
- uses: DeterminateSystems/magic-nix-cache-action@v9
|
||||||
|
- uses: DeterminateSystems/update-flake-lock@v27
|
||||||
|
with:
|
||||||
|
pr-title: "chore: update flake.lock"
|
|
@ -0,0 +1,27 @@
|
||||||
|
name: "Lint Pull Request 🐙"
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
- edited
|
||||||
|
- synchronize
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
pull-requests: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
main:
|
||||||
|
name: Validate pull request title
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: amannn/action-semantic-pull-request@v6
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
# If the PR only contains a single commit, the action will validate that
|
||||||
|
# it matches the configured pattern.
|
||||||
|
validateSingleCommit: true
|
||||||
|
# Related to `validateSingleCommit` you can opt-in to validate that the PR
|
||||||
|
# title matches a single commit to avoid confusion.
|
||||||
|
validateSingleCommitMatchesPrTitle: true
|
|
@ -0,0 +1,18 @@
|
||||||
|
name: "Lint Shellcheck 🐚"
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches: '**'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
shellcheck:
|
||||||
|
name: Shellcheck
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
- name: Run ShellCheck
|
||||||
|
uses: ludeeus/action-shellcheck@master
|
||||||
|
with:
|
||||||
|
format: gcc
|
||||||
|
severity: warning
|
|
@ -1,36 +0,0 @@
|
||||||
name: Publish PPA 📦️
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
publish-ppa:
|
|
||||||
name: Publish PPA
|
|
||||||
runs-on: ubuntu-22.04
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
- name: Import gpg key
|
|
||||||
uses: crazy-max/ghaction-import-gpg@v6
|
|
||||||
with:
|
|
||||||
gpg_private_key: ${{ secrets.PPA_GPG_PRIVATE_KEY }}
|
|
||||||
passphrase: ${{ secrets.PPA_GPG_PASSPHRASE }}
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get -y update
|
|
||||||
sudo apt-get -y install debhelper-compat distro-info dput devscripts
|
|
||||||
- name: Publish to PPA
|
|
||||||
env:
|
|
||||||
DEBEMAIL: ${{ secrets.DEBEMAIL }}
|
|
||||||
DEBFULLNAME: ${{ secrets.DEBFULLNAME }}
|
|
||||||
run: |
|
|
||||||
REL_VER=$(grep "^readonly VERSION" quickemu | cut -d'"' -f2)
|
|
||||||
STAMP=$(date +%y%j.%H%M)
|
|
||||||
for CODENAME in $(distro-info --supported); do
|
|
||||||
rm debian/changelog
|
|
||||||
dch --package quickemu --newversion="${REL_VER}-1~${CODENAME}${STAMP}" --distribution=${CODENAME} "New upstream release." --create
|
|
||||||
dpkg-buildpackage -d -S -sa
|
|
||||||
dput ppa:flexiondotorg/quickemu ../quickemu_${REL_VER}-1~${CODENAME}${STAMP}_source.changes
|
|
||||||
done
|
|
|
@ -1,15 +1,43 @@
|
||||||
name: Build 🏗️ and Publish 📦️
|
name: Publish Release 🏷️
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
tags: ['*']
|
tags:
|
||||||
|
- "v?[0-9]+.[0-9]+.[0-9]+*"
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
tag:
|
||||||
|
description: "The existing tag to publish"
|
||||||
|
type: "string"
|
||||||
|
required: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
create-release:
|
version-check:
|
||||||
name: Create Release
|
name: "Check versions ⚖️"
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: "Compare App and Git versions 🟰"
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
APP_VERSION=$(grep "^readonly VERSION" quickemu | cut -d'"' -f2)
|
||||||
|
GIT_VERSION=$(git describe --tags | cut -d'-' -f1)
|
||||||
|
echo "App version: ${REL_VERSION}"
|
||||||
|
echo "Git version: ${GIT_VERSION}"
|
||||||
|
if [ "${APP_VERSION}" != "${GIT_VERSION}" ]; then
|
||||||
|
echo "ERROR! Version mismatch.";
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
draft-release:
|
||||||
|
needs: [version-check]
|
||||||
|
name: "Draft Release 📥️"
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
- name: Create release ${{ github.ref }} as a draft
|
- name: Create release ${{ github.ref }} as a draft
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
@ -17,11 +45,11 @@ jobs:
|
||||||
gh release create "${{ github.ref }}" --draft --generate-notes
|
gh release create "${{ github.ref }}" --draft --generate-notes
|
||||||
|
|
||||||
build-release:
|
build-release:
|
||||||
needs: [create-release]
|
needs: [draft-release]
|
||||||
name: Build Release
|
name: "Build Release 👨🔧"
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
- name: Build and Upload .deb
|
- name: Build and Upload .deb
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
@ -36,10 +64,10 @@ jobs:
|
||||||
|
|
||||||
publish-release:
|
publish-release:
|
||||||
needs: [build-release]
|
needs: [build-release]
|
||||||
name: Publish Release
|
name: "Publish Release 📤️"
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
- name: Publish release ${{ github.ref }}
|
- name: Publish release ${{ github.ref }}
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
@ -48,3 +76,54 @@ jobs:
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
gh release edit "${{ github.ref }}" --draft=false
|
gh release edit "${{ github.ref }}" --draft=false
|
||||||
|
|
||||||
|
publish-flakehub:
|
||||||
|
needs: [version-check]
|
||||||
|
name: "Publish FlakeHub ❄️"
|
||||||
|
runs-on: "ubuntu-22.04"
|
||||||
|
permissions:
|
||||||
|
id-token: "write"
|
||||||
|
contents: "read"
|
||||||
|
steps:
|
||||||
|
- uses: "actions/checkout@v5"
|
||||||
|
with:
|
||||||
|
ref: "${{ (inputs.tag != null) && format('refs/tags/{0}', inputs.tag) || '' }}"
|
||||||
|
- uses: "DeterminateSystems/nix-installer-action@main"
|
||||||
|
- uses: "DeterminateSystems/magic-nix-cache-action@main"
|
||||||
|
- uses: "DeterminateSystems/flakehub-push@main"
|
||||||
|
with:
|
||||||
|
visibility: "public"
|
||||||
|
name: "quickemu-project/quickemu"
|
||||||
|
tag: "${{ inputs.tag }}"
|
||||||
|
|
||||||
|
publish-ppa:
|
||||||
|
needs: [version-check]
|
||||||
|
name: "Publish PPA 📦️"
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- name: "Checkout 🥡"
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: "Import gpg key 🔑"
|
||||||
|
uses: crazy-max/ghaction-import-gpg@v6
|
||||||
|
with:
|
||||||
|
gpg_private_key: ${{ secrets.PPA_GPG_PRIVATE_KEY }}
|
||||||
|
passphrase: ${{ secrets.PPA_GPG_PASSPHRASE }}
|
||||||
|
- name: "Install dependencies 💾"
|
||||||
|
run: |
|
||||||
|
sudo apt-get -y update
|
||||||
|
sudo apt-get -y install debhelper-compat distro-info dput devscripts
|
||||||
|
- name: "Upload to PPA ⤴️"
|
||||||
|
env:
|
||||||
|
DEBEMAIL: ${{ secrets.DEBEMAIL }}
|
||||||
|
DEBFULLNAME: ${{ secrets.DEBFULLNAME }}
|
||||||
|
run: |
|
||||||
|
REL_VER=$(grep "^readonly VERSION" quickemu | cut -d'"' -f2)
|
||||||
|
STAMP=$(date +%y%j.%H%M)
|
||||||
|
for CODENAME in $(distro-info --supported); do
|
||||||
|
rm debian/changelog
|
||||||
|
dch --package quickemu --newversion="${REL_VER}-1~${CODENAME}${STAMP}" --distribution=${CODENAME} "New upstream release." --create
|
||||||
|
dpkg-buildpackage -d -S -sa
|
||||||
|
dput ppa:flexiondotorg/quickemu ../quickemu_${REL_VER}-1~${CODENAME}${STAMP}_source.changes
|
||||||
|
done
|
||||||
|
|
|
@ -0,0 +1,82 @@
|
||||||
|
name: Test build quickemu 🚧
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
paths:
|
||||||
|
- quickemu
|
||||||
|
- quickget
|
||||||
|
- debian/**
|
||||||
|
- flake.nix
|
||||||
|
- package.nix
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
paths:
|
||||||
|
- quickemu
|
||||||
|
- quickget
|
||||||
|
- debian/**
|
||||||
|
- flake.nix
|
||||||
|
- package.nix
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
# TODO: arm64 runner
|
||||||
|
# https://github.blog/changelog/2024-06-03-actions-arm-based-linux-and-windows-runners-are-now-in-public-beta/
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-deb-build:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- name: "Checkout 🥡"
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
- name: "Build & Test .deb 🍥"
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
sudo apt-get -y update
|
||||||
|
sudo apt-get -y install debhelper devscripts
|
||||||
|
REL_VER=$(grep "^readonly VERSION" quickemu | cut -d'"' -f2)
|
||||||
|
rm debian/changelog
|
||||||
|
dch --package quickemu --newversion="${REL_VER}-1" --distribution=unstable "New upstream release." --create
|
||||||
|
dpkg-buildpackage --build=binary --no-check-builddeps --compression=gzip
|
||||||
|
sudo apt-get -y install ../quickemu_${REL_VER}-1_all.deb
|
||||||
|
quickemu --help
|
||||||
|
quickget --help
|
||||||
|
|
||||||
|
test-nix-build:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
permissions:
|
||||||
|
id-token: "write"
|
||||||
|
contents: "read"
|
||||||
|
steps:
|
||||||
|
- name: "Checkout 🥡"
|
||||||
|
uses: "actions/checkout@v5"
|
||||||
|
- name: "Install Nix ❄️"
|
||||||
|
uses: "DeterminateSystems/nix-installer-action@v19"
|
||||||
|
- name: "Enable Magic Nix Cache 🪄"
|
||||||
|
uses: "DeterminateSystems/magic-nix-cache-action@v9"
|
||||||
|
- name: "Build & Test .nix ❄️"
|
||||||
|
run: |
|
||||||
|
nix build .#quickemu
|
||||||
|
tree ./result
|
||||||
|
./result/bin/quickemu --help
|
||||||
|
./result/bin/quickget --help
|
||||||
|
./result/bin/quickreport
|
||||||
|
# Text a VM if the Nix Installer successfully enabled KVM
|
||||||
|
if [ $DETERMINATE_NIX_KVM -eq 1 ]; then
|
||||||
|
./result/bin/quickget alpine v3.20
|
||||||
|
./result/bin/quickemu --vm alpine-v3.20.conf --display none
|
||||||
|
sleep 5
|
||||||
|
if pgrep -F ./alpine-v3.20/alpine-v3.20.pid; then
|
||||||
|
echo "Test VM is running"
|
||||||
|
else
|
||||||
|
echo "Test VM is not running"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# Test a few more quickemu commands to clean up
|
||||||
|
./result/bin/quickemu --vm alpine-v3.20.conf --kill
|
||||||
|
./result/bin/quickemu --vm alpine-v3.20.conf --delete-disk
|
||||||
|
./result/bin/quickemu --vm alpine-v3.20.conf --delete-vm
|
||||||
|
fi
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
name: "Test quickget 🧪"
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
paths:
|
||||||
|
- quickget
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
paths:
|
||||||
|
- quickget
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
quickget-tests:
|
||||||
|
name: "Run quickget tests 👟"
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
- name: "Install dependencies 📦️"
|
||||||
|
run: |
|
||||||
|
sudo apt-get -y update
|
||||||
|
sudo apt-get -y install curl qemu-utils
|
||||||
|
- name: "List OS variants 📃"
|
||||||
|
run: |
|
||||||
|
mkdir -p results
|
||||||
|
./quickget --list | tail -n +2 | tee results/list.txt
|
||||||
|
- name: "Check OS downloads 💿️"
|
||||||
|
run: |
|
||||||
|
mkdir -p results
|
||||||
|
./quickget --check | tee results/check.txt
|
||||||
|
- name: "Display results 📊"
|
||||||
|
run: |
|
||||||
|
WINDOWS=$(grep -c "windows-" results/check.txt)
|
||||||
|
FAILED=$(grep -c ^FAIL results/check.txt)
|
||||||
|
SKIPPED=$(grep -c ^SKIP results/check.txt)
|
||||||
|
PASSED=$(grep -c ^PASS results/check.txt)
|
||||||
|
CHECKED=$((WINDOWS + FAILED + SKIPPED + PASSED))
|
||||||
|
echo -e "\nResults:"
|
||||||
|
echo -e "- CHECKED:\t${CHECKED}"
|
||||||
|
echo -e "- PASSED:\t${PASSED}"
|
||||||
|
echo -e "- SKIPPED:\t${SKIPPED}\t(of which ${WINDOWS} are Windows)"
|
||||||
|
echo -e "- FAILED:\t${FAILED}\n"
|
||||||
|
grep ^FAIL results/check.txt | tee results/failed.txt
|
||||||
|
VARIATIONS=$(wc -l results/list.txt | cut -d' ' -f 1)
|
||||||
|
DOWNLOADS=$(wc -l results/check.txt | cut -d' ' -f 1)
|
||||||
|
echo
|
||||||
|
echo "Compare OS variations with downloads:"
|
||||||
|
echo -e "- Variations:\t${VARIATIONS}"
|
||||||
|
echo -e "- Downloads:\t${DOWNLOADS}"
|
|
@ -2,10 +2,15 @@
|
||||||
*.conf
|
*.conf
|
||||||
*.dmg
|
*.dmg
|
||||||
*.fd
|
*.fd
|
||||||
|
*.fixed
|
||||||
*.img
|
*.img
|
||||||
*.iso
|
*.iso
|
||||||
|
*.ISO
|
||||||
*.lock
|
*.lock
|
||||||
|
!flake.lock
|
||||||
*.log
|
*.log
|
||||||
|
*.markdownlint.jsonc
|
||||||
|
*.markdownlint.yaml
|
||||||
*.msi
|
*.msi
|
||||||
*.part
|
*.part
|
||||||
*.permall
|
*.permall
|
||||||
|
@ -16,3 +21,4 @@
|
||||||
*.sock
|
*.sock
|
||||||
*.xml
|
*.xml
|
||||||
*.zs-old
|
*.zs-old
|
||||||
|
.direnv/
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
[submodule "build-docs"]
|
[submodule "build-docs"]
|
||||||
path = build-docs
|
path = build-docs
|
||||||
url = git@github.com:philclifford/quickemu-docs.git
|
url = https://github.com/philclifford/quickemu-docs.git
|
||||||
|
|
|
@ -0,0 +1,128 @@
|
||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
We as members, contributors, and leaders pledge to make participation in our
|
||||||
|
community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||||
|
identity and expression, level of experience, education, socio-economic status,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity
|
||||||
|
and orientation.
|
||||||
|
|
||||||
|
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||||
|
diverse, inclusive, and healthy community.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behaviour that contributes to a positive environment for our
|
||||||
|
community include:
|
||||||
|
|
||||||
|
* Demonstrating empathy and kindness toward other people
|
||||||
|
* Being respectful of differing opinions, viewpoints, and experiences
|
||||||
|
* Giving and gracefully accepting constructive feedback
|
||||||
|
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||||
|
and learning from the experience
|
||||||
|
* Focusing on what is best not just for us as individuals, but for the
|
||||||
|
overall community
|
||||||
|
|
||||||
|
Examples of unacceptable behaviour include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery, and sexual attention or
|
||||||
|
advances of any kind
|
||||||
|
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or email
|
||||||
|
address, without their explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Enforcement Responsibilities
|
||||||
|
|
||||||
|
Community leaders are responsible for clarifying and enforcing our standards of
|
||||||
|
acceptable behaviour and will take appropriate and fair corrective action in
|
||||||
|
response to any behaviour that they deem inappropriate, threatening, offensive,
|
||||||
|
or harmful.
|
||||||
|
|
||||||
|
Community leaders have the right and responsibility to remove, edit, or reject
|
||||||
|
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||||
|
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||||
|
decisions when appropriate.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies within all community spaces, and also applies when
|
||||||
|
an individual is officially representing the community in public spaces.
|
||||||
|
Examples of representing our community include using an official e-mail address,
|
||||||
|
posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behaviour may be
|
||||||
|
reported to the community leaders responsible for enforcement at
|
||||||
|
#quickemu channel on Discord.
|
||||||
|
All complaints will be reviewed and investigated promptly and fairly.
|
||||||
|
|
||||||
|
All community leaders are obligated to respect the privacy and security of the
|
||||||
|
reporter of any incident.
|
||||||
|
|
||||||
|
## Enforcement Guidelines
|
||||||
|
|
||||||
|
Community leaders will follow these Community Impact Guidelines in determining
|
||||||
|
the consequences for any action they deem in violation of this Code of Conduct:
|
||||||
|
|
||||||
|
### 1. Correction
|
||||||
|
|
||||||
|
**Community Impact**: Use of inappropriate language or other behaviour deemed
|
||||||
|
unprofessional or unwelcome in the community.
|
||||||
|
|
||||||
|
**Consequence**: A private, written warning from community leaders, providing
|
||||||
|
clarity around the nature of the violation and an explanation of why the
|
||||||
|
behaviour was inappropriate. A public apology may be requested.
|
||||||
|
|
||||||
|
### 2. Warning
|
||||||
|
|
||||||
|
**Community Impact**: A violation through a single incident or series
|
||||||
|
of actions.
|
||||||
|
|
||||||
|
**Consequence**: A warning with consequences for continued behaviour. No
|
||||||
|
interaction with the people involved, including unsolicited interaction with
|
||||||
|
those enforcing the Code of Conduct, for a specified period of time. This
|
||||||
|
includes avoiding interactions in community spaces as well as external channels
|
||||||
|
like social media. Violating these terms may lead to a temporary or
|
||||||
|
permanent ban.
|
||||||
|
|
||||||
|
### 3. Temporary Ban
|
||||||
|
|
||||||
|
**Community Impact**: A serious violation of community standards, including
|
||||||
|
sustained inappropriate behaviour.
|
||||||
|
|
||||||
|
**Consequence**: A temporary ban from any sort of interaction or public
|
||||||
|
communication with the community for a specified period of time. No public or
|
||||||
|
private interaction with the people involved, including unsolicited interaction
|
||||||
|
with those enforcing the Code of Conduct, is allowed during this period.
|
||||||
|
Violating these terms may lead to a permanent ban.
|
||||||
|
|
||||||
|
### 4. Permanent Ban
|
||||||
|
|
||||||
|
**Community Impact**: Demonstrating a pattern of violation of community
|
||||||
|
standards, including sustained inappropriate behaviour, harassment of an
|
||||||
|
individual, or aggression toward or disparagement of classes of individuals.
|
||||||
|
|
||||||
|
**Consequence**: A permanent ban from any sort of public interaction within
|
||||||
|
the community.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||||
|
version 2.0, available at
|
||||||
|
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
||||||
|
|
||||||
|
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||||
|
enforcement ladder](https://github.com/mozilla/diversity).
|
||||||
|
|
||||||
|
[homepage]: https://www.contributor-covenant.org
|
||||||
|
|
||||||
|
For answers to common questions about this code of conduct, see the FAQ at
|
||||||
|
https://www.contributor-covenant.org/faq. Translations are available at
|
||||||
|
https://www.contributor-covenant.org/translations.
|
|
@ -0,0 +1,11 @@
|
||||||
|
# Contributing
|
||||||
|
|
||||||
|
We welcome contributions to Quickemu.
|
||||||
|
|
||||||
|
- Help other Quickemu users by answering questions in the [Quickemu Discussions](https://github.com/quickemu-project/quickemu/discussions) 🛟
|
||||||
|
- Improve the documentation in [this README](https://github.com/quickemu-project/quickemu/edit/master/README.md) and the [Quickemu Wiki](https://github.com/quickemu-project/quickemu/wiki) 📖
|
||||||
|
- File bug reports and feature requests in the [Quickemu Issues](https://github.com/quickemu-project/quickemu/issues) 📁
|
||||||
|
- Submit [Quickemu Pull requests](https://github.com/quickemu-project/quickemu/pulls) to fix bugs 🐞 or add new features ✨
|
||||||
|
- Follow our [guide to adding a new OS to quickget](https://github.com/quickemu-project/quickemu/wiki/06-Advanced-quickget-features#adding-a-new-os-to-quickget)
|
||||||
|
- Commit messages must [conform to the Conventional Commits specification](https://www.conventionalcommits.org/).
|
||||||
|
- [Sponsor the project](https://github.com/sponsors/flexiondotorg) 💖
|
|
@ -0,0 +1,47 @@
|
||||||
|
class Quickemu < Formula
|
||||||
|
desc "Quickly create and run optimised Windows, macOS and Linux virtual machines"
|
||||||
|
homepage "https://github.com/quickemu-project/quickemu"
|
||||||
|
|
||||||
|
livecheck do
|
||||||
|
url :stable
|
||||||
|
end
|
||||||
|
|
||||||
|
stable do
|
||||||
|
latest_release = JSON.parse(Utils.safe_popen_read("curl", "-s", "https://api.github.com/repos/quickemu-project/quickemu/releases/latest"))
|
||||||
|
version latest_release["tag_name"]
|
||||||
|
url "https://api.github.com/repos/quickemu-project/quickemu/tarball/#{latest_release["tag_name"]}"
|
||||||
|
end
|
||||||
|
|
||||||
|
head "https://github.com/quickemu-project/quickemu.git"
|
||||||
|
license "MIT"
|
||||||
|
|
||||||
|
depends_on "bash"
|
||||||
|
depends_on "cdrtools"
|
||||||
|
depends_on "coreutils"
|
||||||
|
depends_on "jq"
|
||||||
|
depends_on "python3"
|
||||||
|
depends_on "qemu"
|
||||||
|
depends_on "samba"
|
||||||
|
depends_on "socat"
|
||||||
|
depends_on "swtpm"
|
||||||
|
depends_on "usbutils"
|
||||||
|
depends_on "zsync"
|
||||||
|
|
||||||
|
def install
|
||||||
|
bin.install "quickemu"
|
||||||
|
bin.install "quickget"
|
||||||
|
end
|
||||||
|
|
||||||
|
test do
|
||||||
|
# `test do` will create, run in and delete a temporary directory.
|
||||||
|
#
|
||||||
|
# This test will fail and we won't accept that! For Homebrew/homebrew-core
|
||||||
|
# this will need to be a test that verifies the functionality of the
|
||||||
|
# software. Run the test with `brew test quickemu`. Options passed
|
||||||
|
# to `brew install` such as `--HEAD` also need to be provided to `brew test`.
|
||||||
|
#
|
||||||
|
# The installed folder is not in the path, so use the entire path to any
|
||||||
|
# executables being tested: `system bin/"program", "do", "something"`.
|
||||||
|
system "false"
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Supported Versions
|
||||||
|
|
||||||
|
Here are the versions of Quickemu currently being supported with security updates.
|
||||||
|
|
||||||
|
| Version | Supported |
|
||||||
|
| ------- | ------------------ |
|
||||||
|
| 4.9.x | :white_check_mark: |
|
||||||
|
| < 4.8 | :x: |
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
If you discover a vulnerability in Quickemu then [file an issue](https://github.com/quickemu-project/quickemu/issues/new) and click *Report a vulnerability*.
|
||||||
|
|
||||||
|
- Quickemu is a spare-time hobby project.
|
||||||
|
- We do not have SLAs for responding to security issues.
|
||||||
|
- It is a best-efforts basis.
|
|
@ -1 +1 @@
|
||||||
Subproject commit d6acc32a36447b5c0ef62c5adc125f21bfc269e7
|
Subproject commit 3125ddc21a91440cd6f1f70aa40081d760c10a4e
|
|
@ -0,0 +1,66 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
import struct
|
||||||
|
import hashlib
|
||||||
|
import argparse
|
||||||
|
v1_prod_pubkey = 0xC3E748CAD9CD384329E10E25A91E43E1A762FF529ADE578C935BDDF9B13F2179D4855E6FC89E9E29CA12517D17DFA1EDCE0BEBF0EA7B461FFE61D94E2BDF72C196F89ACD3536B644064014DAE25A15DB6BB0852ECBD120916318D1CCDEA3C84C92ED743FC176D0BACA920D3FCF3158AFF731F88CE0623182A8ED67E650515F75745909F07D415F55FC15A35654D118C55A462D37A3ACDA08612F3F3F6571761EFCCBCC299AEE99B3A4FD6212CCFFF5EF37A2C334E871191F7E1C31960E010A54E86FA3F62E6D6905E1CD57732410A3EB0C6B4DEFDABE9F59BF1618758C751CD56CEF851D1C0EAA1C558E37AC108DA9089863D20E2E7E4BF475EC66FE6B3EFDCF
|
||||||
|
# v2_prod_pubkey = 0xCB45C5E53217D4499FB80B2D96AA4F964EB551F1DA4EBFA4F5E23F87BFE82FC113590E536757F329D6EAD1F267771EE342F5A5E61514DD3D3383187E663929D577D94648F262EBA1157E152DB5273D10AE3A6A058CB9CD64D01267DAC82ED3B7BC1631D078C911414129CDAAA0FFB0A8E2A7ADD6F32FB09A7E98D259BFF6ED10808D1BDA58CAF7355DFF1A085A18B11657D2617447BF657140D599364E5AC8E626276AC03BC2417831D9E61B25154AFE9F2D8271E9CE22D2783803083A5A7A575774688721097DC5E4B32D118CF6317A7083BA15BA608430A8C8C6B7DA2D932D81F571603A9363AC0197AB670242D9C9180D97A10900F11FE3D9246CF14F0883
|
||||||
|
# v2_dev_pubkey = 0xB372CEC9E05E71FB3FAA08C34E3256FB312EA821638A243EF8A5DEA46FCDA33F00F88FC2933FB276D37B914F89BAD5B5D75771E342265B771995AE8F43B4DFF3F21A877FE777A8B419587C8718D36204FA1922A575AD5207D5D6B8C10F84DDCA661B731E7E7601D64D4A894F487FE1AA1DDC2A1697A3553B1DD85D5750DF2AA9D988E83C4C70BBBE4747219F9B92B199FECB16091896EBB441606DEC20F446249D5568BB51FC87BA7F85E6295FBE811B0A314408CD31921C360608A0FF7F87BD733560FE1C96E472834CAB6BE016C35727754273125089BE043FD3B26F0B2DE141E05990CE922F1702DA0A2F4E9F8760D0FA712DDB9928E0CDAC14501ED5E2C3
|
||||||
|
|
||||||
|
ChunkListHeader = struct.Struct('<4sIBBBxQQQ')
|
||||||
|
assert ChunkListHeader.size == 0x24
|
||||||
|
|
||||||
|
Chunk = struct.Struct('<I32s')
|
||||||
|
assert Chunk.size == 0x24
|
||||||
|
|
||||||
|
def parse_chunklist(path):
|
||||||
|
with open(path, 'rb') as f:
|
||||||
|
hash_ctx = hashlib.sha256()
|
||||||
|
data = f.read(ChunkListHeader.size)
|
||||||
|
hash_ctx.update(data)
|
||||||
|
magic, header_size, file_version, chunk_method, signature_method, chunk_count, chunk_offset, signature_offset = ChunkListHeader.unpack(data)
|
||||||
|
assert magic == b'CNKL'
|
||||||
|
assert header_size == ChunkListHeader.size
|
||||||
|
assert file_version == 1
|
||||||
|
assert chunk_method == 1
|
||||||
|
assert signature_method in [1, 2]
|
||||||
|
assert chunk_count > 0
|
||||||
|
assert chunk_offset == 0x24
|
||||||
|
assert signature_offset == chunk_offset + Chunk.size * chunk_count
|
||||||
|
for i in range(chunk_count):
|
||||||
|
data = f.read(Chunk.size)
|
||||||
|
hash_ctx.update(data)
|
||||||
|
chunk_size, chunk_sha256 = Chunk.unpack(data)
|
||||||
|
yield chunk_size, chunk_sha256
|
||||||
|
digest = hash_ctx.digest()
|
||||||
|
if signature_method == 1:
|
||||||
|
data = f.read(256)
|
||||||
|
assert len(data) == 256
|
||||||
|
signature = int.from_bytes(data, 'little')
|
||||||
|
plaintext = 0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003031300d0609608648016503040201050004200000000000000000000000000000000000000000000000000000000000000000 | int.from_bytes(digest, 'big')
|
||||||
|
assert pow(signature, 0x10001, v1_prod_pubkey) == plaintext
|
||||||
|
elif signature_method == 2:
|
||||||
|
data = f.read(32)
|
||||||
|
assert data == digest
|
||||||
|
else:
|
||||||
|
raise NotImplementedError
|
||||||
|
assert f.read(1) == b''
|
||||||
|
|
||||||
|
def check_chunklist(path, chunklist_path):
|
||||||
|
with open(path, 'rb') as f:
|
||||||
|
for chunk_size, chunk_sha256 in parse_chunklist(chunklist_path):
|
||||||
|
chunk = f.read(chunk_size)
|
||||||
|
assert len(chunk) == chunk_size
|
||||||
|
assert hashlib.sha256(chunk).digest() == chunk_sha256
|
||||||
|
assert f.read(1) == b''
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument('vmdir', type=Path)
|
||||||
|
args = parser.parse_args()
|
||||||
|
vmdir = args.vmdir
|
||||||
|
check_chunklist(vmdir / 'RecoveryImage.dmg', vmdir / 'RecoveryImage.chunklist')
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -1,204 +1,5 @@
|
||||||
quickemu (4.9.1-1) unstable; urgency=medium
|
quickemu (4.9.6-1) unstable; urgency=medium
|
||||||
|
|
||||||
* New upstream release.
|
* New upstream release.
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 10 Nov 2023 14:49:08 +0000
|
-- Martin Wimpress <code@wimpress.io> Fri, 10 Nov 2023 14:49:08 +0000
|
||||||
|
|
||||||
quickemu (4.8-1~mantic1.0) mantic; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
+ https://github.com/quickemu-project/quickemu/releases/tag/4.8
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Wed, 14 Jun 2023 12:40:56 +0100
|
|
||||||
|
|
||||||
quickemu (4.7-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
+ https://github.com/quickemu-project/quickemu/releases/tag/4.7
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Wed, 26 Apr 2023 12:00:35 +0100
|
|
||||||
|
|
||||||
quickemu (4.6-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
+ https://github.com/quickemu-project/quickemu/releases/tag/4.6
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Sat, 04 Feb 2023 00:32:47 +0000
|
|
||||||
|
|
||||||
quickemu (4.5-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
+ https://github.com/quickemu-project/quickemu/releases/tag/4.5
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Sun, 11 Dec 2022 20:54:52 +0000
|
|
||||||
|
|
||||||
quickemu (4.4-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
+ https://github.com/quickemu-project/quickemu/releases/tag/4.4
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 21 Oct 2022 08:52:12 +0100
|
|
||||||
|
|
||||||
quickemu (4.3-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
+ https://github.com/quickemu-project/quickemu/releases/tag/4.3
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Thu, 22 Sep 2022 09:22:00 +0100
|
|
||||||
|
|
||||||
quickemu (4.2-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
+ https://github.com/quickemu-project/quickemu/releases/tag/4.2
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Wed, 21 Sep 2022 23:34:24 +0100
|
|
||||||
|
|
||||||
quickemu (4.1-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Sat, 20 Aug 2022 00:03:33 +0100
|
|
||||||
|
|
||||||
quickemu (4.0-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Mon, 01 Aug 2022 11:24:48 +0100
|
|
||||||
|
|
||||||
quickemu (3.16-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 29 Jul 2022 11:50:32 +0100
|
|
||||||
|
|
||||||
quickemu (3.15-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 22 Apr 2022 09:55:13 +0100
|
|
||||||
|
|
||||||
quickemu (3.14-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New Upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 11 Mar 2022 16:20:05 +0000
|
|
||||||
|
|
||||||
quickemu (3.13-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Thu, 24 Feb 2022 23:00:05 +0000
|
|
||||||
|
|
||||||
quickemu (3.12-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Tue, 22 Feb 2022 12:13:16 +0000
|
|
||||||
|
|
||||||
quickemu (3.11-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <martin.wimpress@ubuntu.com> Wed, 08 Dec 2021 11:01:04 +0000
|
|
||||||
|
|
||||||
quickemu (2.3.4-1~jammy1.0) jammy; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Mon, 06 Dec 2021 11:53:50 +0000
|
|
||||||
|
|
||||||
quickemu (2.3.3-1~jammy1.0) jammy; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 03 Dec 2021 11:38:10 +0000
|
|
||||||
|
|
||||||
quickemu (2.3.2-1~jammy1.0) jammy; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Sun, 14 Nov 2021 10:25:06 +0000
|
|
||||||
|
|
||||||
quickemu (2.3.1-1~jammy1.0) jammy; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Mon, 08 Nov 2021 00:54:38 +0000
|
|
||||||
|
|
||||||
quickemu (2.3.0-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 29 Oct 2021 10:03:58 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.9-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Thu, 28 Oct 2021 22:46:37 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.8-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Thu, 28 Oct 2021 16:13:20 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.7-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Wed, 27 Oct 2021 12:57:59 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.6-1~jammy1.0) jammy; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Thu, 21 Oct 2021 10:57:35 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.5-1~jammy1.0) jammy; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Sat, 16 Oct 2021 11:35:41 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.4-1~impish1.0) impish; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 15 Oct 2021 12:50:05 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.3-1~impish1.0) impish; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 08 Oct 2021 15:06:50 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.2-1~impish1.0) impish; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Fri, 08 Oct 2021 02:39:00 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.1-1~impish1.0) impish; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Thu, 07 Oct 2021 16:23:33 +0100
|
|
||||||
|
|
||||||
quickemu (2.2.0-1~impish1.0) impish; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Wed, 06 Oct 2021 11:08:33 +0100
|
|
||||||
|
|
||||||
quickemu (2.1.0-1~focal1.0) focal; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Tue, 05 Oct 2021 17:12:48 +0100
|
|
||||||
|
|
||||||
quickemu (1.0.0-1~focal1.2) focal; urgency=medium
|
|
||||||
|
|
||||||
* Initial release.
|
|
||||||
|
|
||||||
-- Martin Wimpress <code@wimpress.io> Mon, 06 Sep 2021 23:11:44 +0100
|
|
||||||
|
|
|
@ -5,26 +5,30 @@ Maintainer: Martin Wimpress <code@wimpress.io>
|
||||||
Build-Depends:
|
Build-Depends:
|
||||||
debhelper-compat (= 12),
|
debhelper-compat (= 12),
|
||||||
Standards-Version: 4.5.1
|
Standards-Version: 4.5.1
|
||||||
Homepage: https://github.com/wimpysworld/quickemu
|
Homepage: https://github.com/quickemu-project/quickemu
|
||||||
Vcs-Browser: https://github.com/wimpysworld/quickemu
|
Vcs-Browser: https://github.com/quickemu-project/quickemu
|
||||||
Vcs-Git: https://github.com/wimpysworld/quickemu.git
|
Vcs-Git: https://github.com/quickemu-project/quickemu.git
|
||||||
Rules-Requires-Root: no
|
Rules-Requires-Root: no
|
||||||
|
|
||||||
Package: quickemu
|
Package: quickemu
|
||||||
Architecture: all
|
Architecture: all
|
||||||
Depends:
|
Depends:
|
||||||
coreutils,
|
coreutils,
|
||||||
|
curl,
|
||||||
genisoimage,
|
genisoimage,
|
||||||
jq,
|
jq,
|
||||||
|
mesa-utils,
|
||||||
|
pciutils,
|
||||||
procps,
|
procps,
|
||||||
python3-minimal,
|
python3-minimal,
|
||||||
qemu-system (>= 6.0),
|
qemu-system (>= 6.0),
|
||||||
|
base-files (<< 13~) | qemu-system-modules-spice,
|
||||||
socat,
|
socat,
|
||||||
spice-client-gtk,
|
spice-client-gtk,
|
||||||
swtpm,
|
swtpm,
|
||||||
usbutils,
|
usbutils,
|
||||||
util-linux,
|
util-linux,
|
||||||
wget,
|
uuid-runtime,
|
||||||
x11-xserver-utils,
|
x11-xserver-utils,
|
||||||
xdg-user-dirs,
|
xdg-user-dirs,
|
||||||
zsync,
|
zsync,
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||||
Upstream-Name: quickemu
|
Upstream-Name: quickemu
|
||||||
Upstream-Contact: Martin Wimpress <code@wimpress.io>
|
Upstream-Contact: Martin Wimpress <code@wimpress.io>
|
||||||
Source: https://github.com/wimpysworld/quickemu
|
Source: https://github.com/quickemu-project/quickemu
|
||||||
|
|
||||||
Files: *
|
Files: *
|
||||||
Copyright: 2020-2021 Martin Wimpress <code@wimpress.io>
|
Copyright: 2020-2024 Martin Wimpress <code@wimpress.io>
|
||||||
License: MIT
|
License: MIT
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -26,7 +26,7 @@ License: MIT
|
||||||
# If you want to use GPL v2 or later for the /debian/* files use
|
# If you want to use GPL v2 or later for the /debian/* files use
|
||||||
# the following clauses, or change it to suit. Delete these two lines
|
# the following clauses, or change it to suit. Delete these two lines
|
||||||
Files: debian/*
|
Files: debian/*
|
||||||
Copyright: 2021 Martin Wimpress <code@wimpress.io>
|
Copyright: 2021 - 2024 Martin Wimpress <code@wimpress.io>
|
||||||
License: GPL-2+
|
License: GPL-2+
|
||||||
This package is free software; you can redistribute it and/or modify
|
This package is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
macrecovery usr/bin
|
chunkcheck usr/bin
|
||||||
quickemu usr/bin
|
quickemu usr/bin
|
||||||
quickget usr/bin
|
quickget usr/bin
|
||||||
windowskey usr/bin
|
quickreport usr/bin
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
version=4
|
|
||||||
|
|
||||||
opts="filenamemangle=s%(?:.*?)?v?(\d[\d.]*)\.tar\.gz%quickemu-$1.tar.gz%" \
|
|
||||||
https://github.com/wimpysworld/quickemu/tags \
|
|
||||||
(?:.*?/)?v?(\d[\d.]*)\.tar\.gz
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
{ lib,
|
||||||
|
mkShell,
|
||||||
|
pkgs,
|
||||||
|
stdenv,
|
||||||
|
}:
|
||||||
|
mkShell {
|
||||||
|
packages = with pkgs; ([
|
||||||
|
cdrtools
|
||||||
|
curl
|
||||||
|
gawk
|
||||||
|
gnugrep
|
||||||
|
gnused
|
||||||
|
jq
|
||||||
|
pciutils
|
||||||
|
procps
|
||||||
|
python3
|
||||||
|
qemu_full
|
||||||
|
samba
|
||||||
|
socat
|
||||||
|
spice-gtk
|
||||||
|
swtpm
|
||||||
|
unzip
|
||||||
|
util-linux
|
||||||
|
xorg.xrandr
|
||||||
|
zsync
|
||||||
|
OVMF
|
||||||
|
OVMFFull
|
||||||
|
] ++ lib.optionals stdenv.isLinux [
|
||||||
|
glxinfo
|
||||||
|
usbutils
|
||||||
|
xdg-user-dirs
|
||||||
|
]);
|
||||||
|
|
||||||
|
inputsFrom = with pkgs; [
|
||||||
|
git
|
||||||
|
];
|
||||||
|
|
||||||
|
shellHook = ''
|
||||||
|
echo "**********************************************************************"
|
||||||
|
echo "* 'direnv reload' to update '.direnv/bin/quickemu' for testing *"
|
||||||
|
echo "**********************************************************************"
|
||||||
|
sed \
|
||||||
|
-e '/OVMF_CODE_4M.secboot.fd/s|ovmfs=(|ovmfs=("${pkgs.OVMFFull.firmware}","${pkgs.OVMFFull.variables}" |' \
|
||||||
|
-e '/OVMF_CODE_4M.fd/s|ovmfs=(|ovmfs=("${pkgs.OVMF.firmware}","${pkgs.OVMF.variables}" |' \
|
||||||
|
-e '/cp "''${VARS_IN}" "''${VARS_OUT}"/a chmod +w "''${VARS_OUT}"' \
|
||||||
|
-e 's,\$(command -v smbd),${pkgs.samba}/bin/smbd,' \
|
||||||
|
quickemu > $PWD/.direnv/bin/quickemu
|
||||||
|
chmod +x $PWD/.direnv/bin/quickemu
|
||||||
|
'';
|
||||||
|
}
|
|
@ -9,16 +9,18 @@ datadir := $(datarootdir)
|
||||||
mandir := $(datarootdir)/man
|
mandir := $(datarootdir)/man
|
||||||
bindir := $(PREFIX)/bin
|
bindir := $(PREFIX)/bin
|
||||||
|
|
||||||
all: quickget.1 quickemu.1 quickemu_conf.1
|
all: quickget.1 quickemu.1 quickemu_conf.5
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm *.1
|
rm *.1 *.5
|
||||||
|
|
||||||
install_docs: all
|
install_docs: all
|
||||||
install -d $(DESTDIR)$(mandir)/man1
|
install -d $(DESTDIR)$(mandir)/man1
|
||||||
|
install -d $(DESTDIR)$(mandir)/man5
|
||||||
install -m 644 quickget.1 $(DESTDIR)$(mandir)/man1
|
install -m 644 quickget.1 $(DESTDIR)$(mandir)/man1
|
||||||
install -m 644 quickemu.1 $(DESTDIR)$(mandir)/man1
|
install -m 644 quickemu.1 $(DESTDIR)$(mandir)/man1
|
||||||
install -m 644 quickemu_conf.1 $(DESTDIR)$(mandir)/man1
|
install -m 644 quickemu_conf.5 $(DESTDIR)$(mandir)/man5
|
||||||
|
rm -f $(DESTDIR)$(mandir)/man1/quickemu_conf.1
|
||||||
|
|
||||||
# install -m 644 quickgui.1 $(DESTDIR)$(mandir)/man1
|
# install -m 644 quickgui.1 $(DESTDIR)$(mandir)/man1
|
||||||
|
|
||||||
|
@ -26,17 +28,20 @@ install_bins:
|
||||||
install -d $(DESTDIR)$(bindir)
|
install -d $(DESTDIR)$(bindir)
|
||||||
install -m 755 ../quickget $(DESTDIR)$(bindir)
|
install -m 755 ../quickget $(DESTDIR)$(bindir)
|
||||||
install -m 755 ../quickemu $(DESTDIR)$(bindir)
|
install -m 755 ../quickemu $(DESTDIR)$(bindir)
|
||||||
install -m 755 ../macrecovery $(DESTDIR)$(bindir)
|
install -m 755 ../quickreport $(DESTDIR)$(bindir)
|
||||||
|
install -m 755 ../chunkcheck $(DESTDIR)$(bindir)
|
||||||
|
|
||||||
install: install_bins install_docs
|
install: install_bins install_docs
|
||||||
|
|
||||||
uninstall::
|
uninstall::
|
||||||
rm -f $(DESTDIR)$(mandir)/man1/quickget.1
|
rm -f $(DESTDIR)$(mandir)/man1/quickget.1
|
||||||
rm -f $(DESTDIR)$(mandir)/man1/quickemu.1
|
rm -f $(DESTDIR)$(mandir)/man1/quickemu.1
|
||||||
rm -f $(DESTDIR)$(mandir)/man1/quickemu_conf.1
|
rm -f $(DESTDIR)$(mandir)/man5/quickemu_conf.5
|
||||||
rm -f $(DESTDIR)$(bindir)/quickget
|
rm -f $(DESTDIR)$(bindir)/quickget
|
||||||
rm -f $(DESTDIR)$(bindir)/quickemu
|
rm -f $(DESTDIR)$(bindir)/quickemu
|
||||||
|
rm -f $(DESTDIR)$(bindir)/quickreport
|
||||||
rm -f $(DESTDIR)$(bindir)/macrecovery
|
rm -f $(DESTDIR)$(bindir)/macrecovery
|
||||||
|
rm -f $(DESTDIR)$(bindir)/chunkcheck
|
||||||
|
|
||||||
|
|
||||||
.PHONY: all
|
.PHONY: all
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
PANDOC ?= pandoc
|
PANDOC ?= pandoc
|
||||||
|
PANDOC_OPTIONS = -f gfm+definition_lists
|
||||||
|
|
||||||
MANSECTION ?= 1
|
.SUFFIXES: .1.md .1 .5.md .5
|
||||||
|
|
||||||
MANPAGE.md = $(PANDOC) --standalone $(PANDOCFLAGS) --to man
|
.1.md.1 .5.md.5:
|
||||||
|
$(PANDOC) --standalone $(PANDOC_OPTIONS) --to man -o $@ $<
|
||||||
%.$(MANSECTION): %.$(MANSECTION).md
|
|
||||||
$(MANPAGE.md) $< -o $@
|
|
||||||
|
|
906
docs/quickemu.1
906
docs/quickemu.1
File diff suppressed because it is too large
Load Diff
1076
docs/quickemu.1.md
1076
docs/quickemu.1.md
File diff suppressed because it is too large
Load Diff
|
@ -1,8 +1,8 @@
|
||||||
.\" Automatically generated by Pandoc 3.1.9
|
.\" Automatically generated by Pandoc 3.6.1
|
||||||
.\"
|
.\"
|
||||||
.TH "QUICKEMU_CONF" "1" "November 26, 2023" "quickemu_conf" "Quickemu Configuration Manual"
|
.TH "QUICKEMU_CONF" "5" "December 30, 2024" "quickemu_conf" "Quickemu Configuration Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
quickemu_conf - Options and parameters in the quickemu <vm>.conf
|
quickemu_conf \- Options and parameters in the quickemu <vm>.conf
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
\f[B]quickemu\f[R] will create and run highly optimised desktop virtual
|
\f[B]quickemu\f[R] will create and run highly optimised desktop virtual
|
||||||
machines for Linux, macOS and Windows.
|
machines for Linux, macOS and Windows.
|
||||||
|
@ -50,7 +50,7 @@ serial_telnet_host=\[dq]localhost\[dq]
|
||||||
usb_controller=\[dq]ehci\[dq]
|
usb_controller=\[dq]ehci\[dq]
|
||||||
# options: ps2, usb, virtio
|
# options: ps2, usb, virtio
|
||||||
keyboard=\[dq]usb\[dq]
|
keyboard=\[dq]usb\[dq]
|
||||||
keyboard_layout=\[dq]en-us\[dq]
|
keyboard_layout=\[dq]en\-us\[dq]
|
||||||
# options: ps2, usb, tablet, virtio
|
# options: ps2, usb, tablet, virtio
|
||||||
mouse=\[dq]tablet\[dq]
|
mouse=\[dq]tablet\[dq]
|
||||||
.EE
|
.EE
|
||||||
|
@ -58,16 +58,16 @@ mouse=\[dq]tablet\[dq]
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
guest_os=\[dq]linux\[dq]
|
guest_os=\[dq]linux\[dq]
|
||||||
disk_img=\[dq]debian-bullseye/disk.qcow2\[dq]
|
disk_img=\[dq]debian\-bullseye/disk.qcow2\[dq]
|
||||||
iso=\[dq]debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso\[dq]
|
iso=\[dq]debian\-bullseye/firmware\-11.0.0\-amd64\-DVD\-1.iso\[dq]
|
||||||
.EE
|
.EE
|
||||||
.PP
|
.PP
|
||||||
The default macOS configuration looks like this:
|
The default macOS configuration looks like this:
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
guest_os=\[dq]macos\[dq]
|
guest_os=\[dq]macos\[dq]
|
||||||
img=\[dq]macos-catalina/RecoveryImage.img\[dq]
|
img=\[dq]macos\-catalina/RecoveryImage.img\[dq]
|
||||||
disk_img=\[dq]macos-catalina/disk.qcow2\[dq]
|
disk_img=\[dq]macos\-catalina/disk.qcow2\[dq]
|
||||||
macos_release=\[dq]catalina\[dq]
|
macos_release=\[dq]catalina\[dq]
|
||||||
.EE
|
.EE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -89,9 +89,9 @@ The default Windows 11 configuration looks like this:
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
guest_os=\[dq]windows\[dq]
|
guest_os=\[dq]windows\[dq]
|
||||||
disk_img=\[dq]windows-11/disk.qcow2\[dq]
|
disk_img=\[dq]windows\-11/disk.qcow2\[dq]
|
||||||
iso=\[dq]windows-11/Win11_EnglishInternational_x64.iso\[dq]
|
iso=\[dq]windows\-11/Win11_EnglishInternational_x64.iso\[dq]
|
||||||
fixed_iso=\[dq]windows-11/virtio-win.iso\[dq]
|
fixed_iso=\[dq]windows\-11/virtio\-win.iso\[dq]
|
||||||
tpm=\[dq]on\[dq]
|
tpm=\[dq]on\[dq]
|
||||||
secureboot=\[dq]on\[dq]
|
secureboot=\[dq]on\[dq]
|
||||||
.EE
|
.EE
|
||||||
|
@ -104,13 +104,13 @@ drivers.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]tpm=\[dq]on\[dq]\f[R] instructs \f[CR]quickemu\f[R] to create a
|
\f[CR]tpm=\[dq]on\[dq]\f[R] instructs \f[CR]quickemu\f[R] to create a
|
||||||
software emulated TPM device using \f[CR]swtpm\f[R].
|
software emulated TPM device using \f[CR]swtpm\f[R].
|
||||||
.SH BIOS and EFI
|
.SS BIOS and EFI
|
||||||
Since Quickemu 2.1.0 \f[CR]efi\f[R] is the default boot option.
|
Since Quickemu 2.1.0 \f[CR]efi\f[R] is the default boot option.
|
||||||
If you want to override this behaviour then add the following line to
|
If you want to override this behaviour then add the following line to
|
||||||
you VM configuration to enable legacy BIOS.
|
you VM configuration to enable legacy BIOS.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]boot=\[dq]legacy\[dq]\f[R] - Enable Legacy BIOS boot
|
\f[CR]boot=\[dq]legacy\[dq]\f[R] \- Enable Legacy BIOS boot
|
||||||
.SH Tuning CPU cores, RAM & disks
|
.SS Tuning CPU cores, RAM & disks
|
||||||
By default, Quickemu will calculate the number of CPUs cores and RAM to
|
By default, Quickemu will calculate the number of CPUs cores and RAM to
|
||||||
allocate to a VM based on the specifications of your host computer.
|
allocate to a VM based on the specifications of your host computer.
|
||||||
You can override this default behaviour and tune the VM configuration to
|
You can override this default behaviour and tune the VM configuration to
|
||||||
|
@ -118,13 +118,13 @@ your liking.
|
||||||
.PP
|
.PP
|
||||||
Add additional lines to your virtual machine configuration:
|
Add additional lines to your virtual machine configuration:
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]cpu_cores=\[dq]4\[dq]\f[R] - Specify the number of CPU cores
|
\f[CR]cpu_cores=\[dq]4\[dq]\f[R] \- Specify the number of CPU cores
|
||||||
allocated to the VM
|
allocated to the VM
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ram=\[dq]4G\[dq]\f[R] - Specify the amount of RAM to allocate to
|
\f[CR]ram=\[dq]4G\[dq]\f[R] \- Specify the amount of RAM to allocate to
|
||||||
the VM
|
the VM
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]disk_size=\[dq]16G\[dq]\f[R] - Specify the size of the virtual
|
\f[CR]disk_size=\[dq]16G\[dq]\f[R] \- Specify the size of the virtual
|
||||||
disk allocated to the VM
|
disk allocated to the VM
|
||||||
.SS Disk preallocation
|
.SS Disk preallocation
|
||||||
Preallocation mode (allowed values: \f[CR]off\f[R] (default),
|
Preallocation mode (allowed values: \f[CR]off\f[R] (default),
|
||||||
|
@ -137,32 +137,32 @@ the system disk image by adding a line like this to your VM
|
||||||
configuration.
|
configuration.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]preallocation=\[dq]metadata\[dq]\f[R]
|
\f[CR]preallocation=\[dq]metadata\[dq]\f[R]
|
||||||
.SS CD-ROM disks
|
.SS CD\-ROM disks
|
||||||
If you want to expose an ISO image from the host to guest add the
|
If you want to expose an ISO image from the host to guest add the
|
||||||
following line to the VM configuration:
|
following line to the VM configuration:
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]fixed_iso=\[dq]/path/to/image.iso\[dq]\f[R]
|
\f[CR]fixed_iso=\[dq]/path/to/image.iso\[dq]\f[R]
|
||||||
.SS Floppy disks
|
.SS Floppy disks
|
||||||
If you\[cq]re like \c
|
If you\[aq]re like \c
|
||||||
.UR https://popey.com
|
.UR https://popey.com
|
||||||
Alan Pope
|
Alan Pope
|
||||||
.UE \c
|
.UE \c
|
||||||
\ you\[cq]ll probably want to mount a floppy disk image in the guest.
|
\ you\[aq]ll probably want to mount a floppy disk image in the guest.
|
||||||
To do so add the following line to the VM configuration:
|
To do so add the following line to the VM configuration:
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]floppy=\[dq]/path/to/floppy.img\[dq]\f[R]
|
\f[CR]floppy=\[dq]/path/to/floppy.img\[dq]\f[R]
|
||||||
.SH File Sharing
|
.SS File Sharing
|
||||||
All File Sharing options will only expose \f[CR]\[ti]/Public\f[R] (or
|
All File Sharing options will only expose \f[CR]\[ti]/Public\f[R] (or
|
||||||
localised variations) for the current user to the guest VMs.
|
localised variations) for the current user to the guest VMs.
|
||||||
.SS Samba 🐧 🍏 🪟
|
.SS Samba 🐧 🍏 🪟
|
||||||
If \f[CR]smbd\f[R] is available on the host, Quickemu will automatically
|
If \f[CR]smbd\f[R] is available on the host, Quickemu will automatically
|
||||||
enable the built-in QEMU support for exposing a Samba share from the
|
enable the built\-in QEMU support for exposing a Samba share from the
|
||||||
host to the guest.
|
host to the guest.
|
||||||
.PP
|
.PP
|
||||||
You can install the minimal Samba components on Ubuntu using:
|
You can install the minimal Samba components on Ubuntu using:
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
sudo apt install --no-install-recommends samba
|
sudo apt install \-\-no\-install\-recommends samba
|
||||||
.EE
|
.EE
|
||||||
.PP
|
.PP
|
||||||
If everything is set up correctly, the \f[CR]smbd\f[R] address will be
|
If everything is set up correctly, the \f[CR]smbd\f[R] address will be
|
||||||
|
@ -170,20 +170,21 @@ printed when the virtual machine is started.
|
||||||
For example:
|
For example:
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
- smbd: On guest: smb://10.0.2.4/qemu
|
\- smbd: On guest: smb://10.0.2.4/qemu
|
||||||
.EE
|
.EE
|
||||||
.PP
|
.PP
|
||||||
If using a Windows guest, right-click on \[lq]This PC\[rq], click
|
If using a Windows guest, right\-click on \[dq]This PC\[dq], click
|
||||||
\[lq]Add a network location\[rq], and paste this address, removing
|
\[dq]Add a network location\[dq], and paste this address, removing
|
||||||
\f[CR]smb:\f[R] and replacing forward slashes with backslashes (in this
|
\f[CR]smb:\f[R] and replacing forward slashes with backslashes (in this
|
||||||
example \f[CR]\[rs]\[rs]10.0.2.4\[rs]qemu\f[R]).
|
example \f[CR]\[rs]\[rs]10.0.2.4\[rs]qemu\f[R]).
|
||||||
.SS SPICE WebDAV 🐧 🪟
|
.SS SPICE WebDAV 🐧 🪟
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
TBD
|
TBD
|
||||||
.SS VirtIO-9P 🐧 🍏
|
.SS VirtIO\-9P 🐧 🍏
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
TBD
|
TBD
|
||||||
.SH Network port forwarding
|
.SS Networking
|
||||||
|
.SS Port forwarding
|
||||||
Add an additional line to your virtual machine configuration.
|
Add an additional line to your virtual machine configuration.
|
||||||
For example:
|
For example:
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -194,12 +195,12 @@ In the example above:
|
||||||
Port 8123 on the host is forwarded to port 8123 on the guest.
|
Port 8123 on the host is forwarded to port 8123 on the guest.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Port 8888 on the host is forwarded to port 80 on the guest.
|
Port 8888 on the host is forwarded to port 80 on the guest.
|
||||||
.SH Disable networking
|
.SS Disable networking
|
||||||
To completely disable all network interfaces in a guest VM add this
|
To completely disable all network interfaces in a guest VM add this
|
||||||
additional line to your virtual machine configuration:
|
additional line to your virtual machine configuration:
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]network=\[dq]none\[dq]\f[R]
|
\f[CR]network=\[dq]none\[dq]\f[R]
|
||||||
.SH Restricted networking
|
.SS Restricted networking
|
||||||
You can isolate the guest from the host (and broader network) using the
|
You can isolate the guest from the host (and broader network) using the
|
||||||
restrict option, which will restrict networking to just the guest and
|
restrict option, which will restrict networking to just the guest and
|
||||||
any virtual devices.
|
any virtual devices.
|
||||||
|
@ -209,7 +210,7 @@ phoning home while still providing a network inside the guest.
|
||||||
Add this additional line to your virtual machine configuration:
|
Add this additional line to your virtual machine configuration:
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]network=\[dq]restrict\[dq]\f[R]
|
\f[CR]network=\[dq]restrict\[dq]\f[R]
|
||||||
.SH Bridged networking
|
.SS Bridged networking
|
||||||
Connect your virtual machine to a preconfigured network bridge.
|
Connect your virtual machine to a preconfigured network bridge.
|
||||||
Add an additional line to your virtual machine configuration:
|
Add an additional line to your virtual machine configuration:
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -219,21 +220,76 @@ If you want to have a persistent MAC address for your bridged network
|
||||||
interface in the guest VM you can add \f[CR]macaddr\f[R] to the virtual
|
interface in the guest VM you can add \f[CR]macaddr\f[R] to the virtual
|
||||||
machine configuration.
|
machine configuration.
|
||||||
QEMU requires that the MAC address is in the range:
|
QEMU requires that the MAC address is in the range:
|
||||||
\f[B]52:54:00:AB:00:00 - 52:54:00:AB:FF:FF\f[R]
|
\f[B]52:54:00:AB:00:00 \- 52:54:00:AB:FF:FF\f[R]
|
||||||
.PP
|
.PP
|
||||||
So you can generate your own MAC addresses with:
|
So you can generate your own MAC addresses with:
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]macaddr=\[dq]52:54:00:AB:51:AE\[dq]\f[R]
|
\f[CR]macaddr=\[dq]52:54:00:AB:51:AE\[dq]\f[R]
|
||||||
.SH USB redirection
|
.SS USB redirection
|
||||||
Quickemu supports USB redirection via SPICE pass-through and host
|
Quickemu supports USB redirection via SPICE pass\-through and host
|
||||||
pass-through.
|
pass\-through.
|
||||||
|
Quickemu supports USB redirection via SPICE pass\-through and host
|
||||||
|
pass\-through.
|
||||||
|
.PP
|
||||||
|
\f[B]NOTE!\f[R] When a USB device is redirected from the host, it will
|
||||||
|
not be usable by host operating system until the guest redirection is
|
||||||
|
stopped.
|
||||||
|
Therefore, do not redirect the input devices, such as the keyboard and
|
||||||
|
mouse, as it will be difficult (or impossible) to revert the situation.
|
||||||
.SS SPICE redirection (recommended)
|
.SS SPICE redirection (recommended)
|
||||||
Using SPICE for USB pass-through is easiest as it doesn\[cq]t require
|
Using SPICE for USB pass\-through is easiest as it doesn\[aq]t require
|
||||||
any elevated permission, start Quickemu with \f[CR]--display spice\f[R]
|
any elevated permission:
|
||||||
and then select \f[CR]Input\f[R] ->
|
.PP
|
||||||
|
Both \f[CR]spicy\f[R] from \c
|
||||||
|
.UR https://www.spice-space.org/spice-gtk.html
|
||||||
|
spice\-gtk
|
||||||
|
.UE \c
|
||||||
|
\ (\f[I]Input \-> Select USB Devices for redirection\f[R]) and
|
||||||
|
\f[CR]remote\-viewer\f[R] from \c
|
||||||
|
.UR https://gitlab.com/virt-viewer/virt-viewer
|
||||||
|
virt\-viewer
|
||||||
|
.UE \c
|
||||||
|
\ (\f[I]File \-> USB device selection\f[R]) support this feature.
|
||||||
|
.IP \[bu] 2
|
||||||
|
Start Quickemu with \f[CR]\-\-display spice\f[R] and then
|
||||||
|
.IP \[bu] 2
|
||||||
|
Select \f[CR]Input\f[R] \-> \f[CR]Select USB Device for redirection\f[R]
|
||||||
|
from the menu to choose which device(s) you want to attach to the guest.
|
||||||
|
.IP \[bu] 2
|
||||||
|
**\f[CR]spicy\f[R] (default)
|
||||||
|
.RS 2
|
||||||
|
.IP \[bu] 2
|
||||||
|
**Select \f[CR]Input\f[R] \->
|
||||||
\f[CR]Select USB Device for redirection\f[R] from the menu to choose
|
\f[CR]Select USB Device for redirection\f[R] from the menu to choose
|
||||||
which device(s) you want to attach to the guest.
|
which device(s) you want to attach to the guest.
|
||||||
.SS Host redirection \f[B]NOT Recommended\f[R]
|
.RE
|
||||||
|
.IP \[bu] 2
|
||||||
|
**\f[CR]remote\-viewer\f[R]
|
||||||
|
.RS 2
|
||||||
|
.IP \[bu] 2
|
||||||
|
**Select \f[CR]File\f[R] \-> \f[CR]USB device selection\f[R] from the
|
||||||
|
menu to choose which device(s) you want to attach to the guest.
|
||||||
|
.RE
|
||||||
|
.PP
|
||||||
|
To ensure that this functionality works as expected, make sure that you
|
||||||
|
have installed the necessary SPICE Guest Tools on the virtual machine.
|
||||||
|
.SS Enabling SPICE redirection on NixOS
|
||||||
|
On NixOS, if you encounter this error:
|
||||||
|
.IP
|
||||||
|
.EX
|
||||||
|
Error setting facl: Operation not permitted
|
||||||
|
.EE
|
||||||
|
.PP
|
||||||
|
Try setting \c
|
||||||
|
.UR https://search.nixos.org/options?channel=23.11&show=virtualisation.spiceUSBRedirection.enable&from=0&size=50&sort=relevance&type=packages&query=spiceusbredirec
|
||||||
|
the following option
|
||||||
|
.UE \c
|
||||||
|
:
|
||||||
|
.IP
|
||||||
|
.EX
|
||||||
|
virtualisation.spiceUSBRedirection.enable = true;
|
||||||
|
.EE
|
||||||
|
.SS Host redirection (\f[B]NOT Recommended\f[R])
|
||||||
\f[B]USB host redirection is not recommended\f[R], it is provided purely
|
\f[B]USB host redirection is not recommended\f[R], it is provided purely
|
||||||
for backwards compatibility to older versions of Quickemu.
|
for backwards compatibility to older versions of Quickemu.
|
||||||
Using SPICE is preferred, see above.
|
Using SPICE is preferred, see above.
|
||||||
|
@ -256,12 +312,12 @@ the appropriate commands to modify the USB device(s) access permissions,
|
||||||
like this:
|
like this:
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
- USB: Host pass-through requested:
|
\- USB: Host pass\-through requested:
|
||||||
- Sennheiser Communications EPOS GTW 270 on bus 001 device 005 needs permission changes:
|
\- Sennheiser Communications EPOS GTW 270 on bus 001 device 005 needs permission changes:
|
||||||
sudo chown -v root:user /dev/bus/usb/001/005
|
sudo chown \-v root:user /dev/bus/usb/001/005
|
||||||
ERROR! USB permission changes are required 👆
|
ERROR! USB permission changes are required 👆
|
||||||
.EE
|
.EE
|
||||||
.SH TPM
|
.SS TPM
|
||||||
Since Quickemu 2.2.0 a software emulated TPM device can be added to
|
Since Quickemu 2.2.0 a software emulated TPM device can be added to
|
||||||
guest virtual machines.
|
guest virtual machines.
|
||||||
Just add \f[CR]tpm=\[dq]on\[dq]\f[R] to your VM configuration.
|
Just add \f[CR]tpm=\[dq]on\[dq]\f[R] to your VM configuration.
|
|
@ -1,9 +1,9 @@
|
||||||
---
|
---
|
||||||
author: Martin Wimpress
|
author: Martin Wimpress
|
||||||
date: November 26, 2023
|
date: December 30, 2024
|
||||||
footer: quickemu_conf
|
footer: quickemu_conf
|
||||||
header: Quickemu Configuration Manual
|
header: Quickemu Configuration Manual
|
||||||
section: 1
|
section: 5
|
||||||
title: QUICKEMU_CONF
|
title: QUICKEMU_CONF
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ installation ISO and QEMU disk for the installed VM
|
||||||
|
|
||||||
These are the options and defaults for the \<vm\>.conf file
|
These are the options and defaults for the \<vm\>.conf file
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
# Lowercase variables are used in the VM config file only
|
# Lowercase variables are used in the VM config file only
|
||||||
boot="efi"
|
boot="efi"
|
||||||
cpu_cores=""
|
cpu_cores=""
|
||||||
|
@ -67,7 +67,7 @@ mouse="tablet"
|
||||||
|
|
||||||
# EXAMPLES
|
# EXAMPLES
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
guest_os="linux"
|
guest_os="linux"
|
||||||
disk_img="debian-bullseye/disk.qcow2"
|
disk_img="debian-bullseye/disk.qcow2"
|
||||||
iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
|
iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
|
||||||
|
@ -75,24 +75,24 @@ iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
|
||||||
|
|
||||||
The default macOS configuration looks like this:
|
The default macOS configuration looks like this:
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
guest_os="macos"
|
guest_os="macos"
|
||||||
img="macos-catalina/RecoveryImage.img"
|
img="macos-catalina/RecoveryImage.img"
|
||||||
disk_img="macos-catalina/disk.qcow2"
|
disk_img="macos-catalina/disk.qcow2"
|
||||||
macos_release="catalina"
|
macos_release="catalina"
|
||||||
```
|
```
|
||||||
|
|
||||||
- `guest_os="macos"` instructs Quickemu to optimise for macOS.
|
- `guest_os="macos"` instructs Quickemu to optimise for macOS.
|
||||||
- `macos_release="catalina"` instructs Quickemu to optimise for a
|
- `macos_release="catalina"` instructs Quickemu to optimise for a
|
||||||
particular macOS release.
|
particular macOS release.
|
||||||
- For example VirtIO Network and Memory Ballooning are available
|
- For example VirtIO Network and Memory Ballooning are available in
|
||||||
in Big Sur and newer, but not previous releases.
|
Big Sur and newer, but not previous releases.
|
||||||
- And VirtIO Block Media (disks) are supported/stable in Catalina
|
- And VirtIO Block Media (disks) are supported/stable in Catalina and
|
||||||
and newer.
|
newer.
|
||||||
|
|
||||||
The default Windows 11 configuration looks like this:
|
The default Windows 11 configuration looks like this:
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
guest_os="windows"
|
guest_os="windows"
|
||||||
disk_img="windows-11/disk.qcow2"
|
disk_img="windows-11/disk.qcow2"
|
||||||
iso="windows-11/Win11_EnglishInternational_x64.iso"
|
iso="windows-11/Win11_EnglishInternational_x64.iso"
|
||||||
|
@ -101,20 +101,20 @@ tpm="on"
|
||||||
secureboot="on"
|
secureboot="on"
|
||||||
```
|
```
|
||||||
|
|
||||||
- `guest_os="windows"` instructs `quickemu` to optimise for Windows.
|
- `guest_os="windows"` instructs `quickemu` to optimise for Windows.
|
||||||
- `fixed_iso=` specifies the ISO image that provides VirtIO drivers.
|
- `fixed_iso=` specifies the ISO image that provides VirtIO drivers.
|
||||||
- `tpm="on"` instructs `quickemu` to create a software emulated TPM
|
- `tpm="on"` instructs `quickemu` to create a software emulated TPM
|
||||||
device using `swtpm`.
|
device using `swtpm`.
|
||||||
|
|
||||||
# BIOS and EFI
|
### BIOS and EFI
|
||||||
|
|
||||||
Since Quickemu 2.1.0 `efi` is the default boot option. If you want to
|
Since Quickemu 2.1.0 `efi` is the default boot option. If you want to
|
||||||
override this behaviour then add the following line to you VM
|
override this behaviour then add the following line to you VM
|
||||||
configuration to enable legacy BIOS.
|
configuration to enable legacy BIOS.
|
||||||
|
|
||||||
- `boot="legacy"` - Enable Legacy BIOS boot
|
- `boot="legacy"` - Enable Legacy BIOS boot
|
||||||
|
|
||||||
# Tuning CPU cores, RAM & disks
|
### Tuning CPU cores, RAM & disks
|
||||||
|
|
||||||
By default, Quickemu will calculate the number of CPUs cores and RAM to
|
By default, Quickemu will calculate the number of CPUs cores and RAM to
|
||||||
allocate to a VM based on the specifications of your host computer. You
|
allocate to a VM based on the specifications of your host computer. You
|
||||||
|
@ -123,13 +123,12 @@ your liking.
|
||||||
|
|
||||||
Add additional lines to your virtual machine configuration:
|
Add additional lines to your virtual machine configuration:
|
||||||
|
|
||||||
- `cpu_cores="4"` - Specify the number of CPU cores allocated to the
|
- `cpu_cores="4"` - Specify the number of CPU cores allocated to the VM
|
||||||
VM
|
- `ram="4G"` - Specify the amount of RAM to allocate to the VM
|
||||||
- `ram="4G"` - Specify the amount of RAM to allocate to the VM
|
- `disk_size="16G"` - Specify the size of the virtual disk allocated to
|
||||||
- `disk_size="16G"` - Specify the size of the virtual disk allocated
|
the VM
|
||||||
to the VM
|
|
||||||
|
|
||||||
## Disk preallocation
|
### Disk preallocation
|
||||||
|
|
||||||
Preallocation mode (allowed values: `off` (default), `metadata`,
|
Preallocation mode (allowed values: `off` (default), `metadata`,
|
||||||
`falloc`, `full`). An image with preallocated metadata is initially
|
`falloc`, `full`). An image with preallocated metadata is initially
|
||||||
|
@ -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
|
the system disk image by adding a line like this to your VM
|
||||||
configuration.
|
configuration.
|
||||||
|
|
||||||
- `preallocation="metadata"`
|
- `preallocation="metadata"`
|
||||||
|
|
||||||
## CD-ROM disks
|
### CD-ROM disks
|
||||||
|
|
||||||
If you want to expose an ISO image from the host to guest add the
|
If you want to expose an ISO image from the host to guest add the
|
||||||
following line to the VM configuration:
|
following line to the VM configuration:
|
||||||
|
|
||||||
- `fixed_iso="/path/to/image.iso"`
|
- `fixed_iso="/path/to/image.iso"`
|
||||||
|
|
||||||
## Floppy disks
|
### Floppy disks
|
||||||
|
|
||||||
If you're like [Alan Pope](https://popey.com) you'll probably want to
|
If you're like [Alan Pope](https://popey.com) you'll probably want to
|
||||||
mount a floppy disk image in the guest. To do so add the following line
|
mount a floppy disk image in the guest. To do so add the following line
|
||||||
to the VM configuration:
|
to the VM configuration:
|
||||||
|
|
||||||
- `floppy="/path/to/floppy.img"`
|
- `floppy="/path/to/floppy.img"`
|
||||||
|
|
||||||
# File Sharing
|
### File Sharing
|
||||||
|
|
||||||
All File Sharing options will only expose `~/Public` (or localised
|
All File Sharing options will only expose `~/Public` (or localised
|
||||||
variations) for the current user to the guest VMs.
|
variations) for the current user to the guest VMs.
|
||||||
|
|
||||||
## Samba 🐧 🍏 🪟
|
#### Samba 🐧 🍏 🪟
|
||||||
|
|
||||||
If `smbd` is available on the host, Quickemu will automatically enable
|
If `smbd` is available on the host, Quickemu will automatically enable
|
||||||
the built-in QEMU support for exposing a Samba share from the host to
|
the built-in QEMU support for exposing a Samba share from the host to
|
||||||
|
@ -169,7 +168,7 @@ the guest.
|
||||||
|
|
||||||
You can install the minimal Samba components on Ubuntu using:
|
You can install the minimal Samba components on Ubuntu using:
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
sudo apt install --no-install-recommends samba
|
sudo apt install --no-install-recommends samba
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -182,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
|
location", and paste this address, removing `smb:` and replacing forward
|
||||||
slashes with backslashes (in this example `\\10.0.2.4\qemu`).
|
slashes with backslashes (in this example `\\10.0.2.4\qemu`).
|
||||||
|
|
||||||
## SPICE WebDAV 🐧 🪟
|
#### SPICE WebDAV 🐧 🪟
|
||||||
|
|
||||||
- TBD
|
- TBD
|
||||||
|
|
||||||
## VirtIO-9P 🐧 🍏
|
#### VirtIO-9P 🐧 🍏
|
||||||
|
|
||||||
- TBD
|
- TBD
|
||||||
|
|
||||||
# Network port forwarding
|
### Networking
|
||||||
|
|
||||||
|
#### Port forwarding
|
||||||
|
|
||||||
Add an additional line to your virtual machine configuration. For
|
Add an additional line to your virtual machine configuration. For
|
||||||
example:
|
example:
|
||||||
|
|
||||||
- `port_forwards=("8123:8123" "8888:80")`
|
- `port_forwards=("8123:8123" "8888:80")`
|
||||||
|
|
||||||
In the example above:
|
In the example above:
|
||||||
|
|
||||||
- Port 8123 on the host is forwarded to port 8123 on the guest.
|
- Port 8123 on the host is forwarded to port 8123 on the guest.
|
||||||
- Port 8888 on the host is forwarded to port 80 on the guest.
|
- Port 8888 on the host is forwarded to port 80 on the guest.
|
||||||
|
|
||||||
# Disable networking
|
#### Disable networking
|
||||||
|
|
||||||
To completely disable all network interfaces in a guest VM add this
|
To completely disable all network interfaces in a guest VM add this
|
||||||
additional line to your virtual machine configuration:
|
additional line to your virtual machine configuration:
|
||||||
|
|
||||||
- `network="none"`
|
- `network="none"`
|
||||||
|
|
||||||
# Restricted networking
|
#### Restricted networking
|
||||||
|
|
||||||
You can isolate the guest from the host (and broader network) using the
|
You can isolate the guest from the host (and broader network) using the
|
||||||
restrict option, which will restrict networking to just the guest and
|
restrict option, which will restrict networking to just the guest and
|
||||||
|
@ -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
|
phoning home while still providing a network inside the guest. Add this
|
||||||
additional line to your virtual machine configuration:
|
additional line to your virtual machine configuration:
|
||||||
|
|
||||||
- `network="restrict"`
|
- `network="restrict"`
|
||||||
|
|
||||||
# Bridged networking
|
#### Bridged networking
|
||||||
|
|
||||||
Connect your virtual machine to a preconfigured network bridge. Add an
|
Connect your virtual machine to a preconfigured network bridge. Add an
|
||||||
additional line to your virtual machine configuration:
|
additional line to your virtual machine configuration:
|
||||||
|
|
||||||
- `network="br0"`
|
- `network="br0"`
|
||||||
|
|
||||||
If you want to have a persistent MAC address for your bridged network
|
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
|
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:
|
So you can generate your own MAC addresses with:
|
||||||
|
|
||||||
- `macaddr="52:54:00:AB:51:AE"`
|
- `macaddr="52:54:00:AB:51:AE"`
|
||||||
|
|
||||||
# USB redirection
|
### USB redirection
|
||||||
|
|
||||||
Quickemu supports USB redirection via SPICE pass-through and host
|
Quickemu supports USB redirection via SPICE pass-through and host
|
||||||
pass-through.
|
pass-through. Quickemu supports USB redirection via SPICE pass-through
|
||||||
|
and host pass-through.
|
||||||
|
|
||||||
## SPICE redirection (recommended)
|
**NOTE!** When a USB device is redirected from the host, it will not be
|
||||||
|
usable by host operating system until the guest redirection is stopped.
|
||||||
|
Therefore, do not redirect the input devices, such as the keyboard and
|
||||||
|
mouse, as it will be difficult (or impossible) to revert the situation.
|
||||||
|
|
||||||
|
#### SPICE redirection (recommended)
|
||||||
|
|
||||||
Using SPICE for USB pass-through is easiest as it doesn't require any
|
Using SPICE for USB pass-through is easiest as it doesn't require any
|
||||||
elevated permission, start Quickemu with `--display spice` and then
|
elevated permission:
|
||||||
select `Input` -\> `Select USB Device for redirection` from the menu to
|
|
||||||
choose which device(s) you want to attach to the guest.
|
|
||||||
|
|
||||||
## Host redirection **NOT Recommended**
|
Both `spicy` from
|
||||||
|
[spice-gtk](https://www.spice-space.org/spice-gtk.html) (*Input -\>
|
||||||
|
Select USB Devices for redirection*) and `remote-viewer` from
|
||||||
|
[virt-viewer](https://gitlab.com/virt-viewer/virt-viewer) (*File -\> USB
|
||||||
|
device selection*) support this feature.
|
||||||
|
|
||||||
|
- Start Quickemu with `--display spice` and then
|
||||||
|
- Select `Input` -\> `Select USB Device for redirection` from the menu
|
||||||
|
to choose which device(s) you want to attach to the guest.
|
||||||
|
- \*\*`spicy` (default)
|
||||||
|
- \*\*Select `Input` -\> `Select USB Device for redirection` from the
|
||||||
|
menu to choose which device(s) you want to attach to the guest.
|
||||||
|
- \*\*`remote-viewer`
|
||||||
|
- \*\*Select `File` -\> `USB device selection` from the menu to choose
|
||||||
|
which device(s) you want to attach to the guest.
|
||||||
|
|
||||||
|
To ensure that this functionality works as expected, make sure that you
|
||||||
|
have installed the necessary SPICE Guest Tools on the virtual machine.
|
||||||
|
|
||||||
|
##### Enabling SPICE redirection on NixOS
|
||||||
|
|
||||||
|
On NixOS, if you encounter this error:
|
||||||
|
|
||||||
|
Error setting facl: Operation not permitted
|
||||||
|
|
||||||
|
Try setting [the following
|
||||||
|
option](https://search.nixos.org/options?channel=23.11&show=virtualisation.spiceUSBRedirection.enable&from=0&size=50&sort=relevance&type=packages&query=spiceusbredirec):
|
||||||
|
|
||||||
|
``` nix
|
||||||
|
virtualisation.spiceUSBRedirection.enable = true;
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Host redirection (**NOT Recommended**)
|
||||||
|
|
||||||
**USB host redirection is not recommended**, it is provided purely for
|
**USB host redirection is not recommended**, it is provided purely for
|
||||||
backwards compatibility to older versions of Quickemu. Using SPICE is
|
backwards compatibility to older versions of Quickemu. Using SPICE is
|
||||||
|
@ -258,14 +295,14 @@ preferred, see above.
|
||||||
Add an additional line to your virtual machine configuration. For
|
Add an additional line to your virtual machine configuration. For
|
||||||
example:
|
example:
|
||||||
|
|
||||||
- `usb_devices=("046d:082d" "046d:085e")`
|
- `usb_devices=("046d:082d" "046d:085e")`
|
||||||
|
|
||||||
In the example above:
|
In the example above:
|
||||||
|
|
||||||
- The USB device with vendor_id 046d and product_id 082d will be
|
- The USB device with vendor_id 046d and product_id 082d will be exposed
|
||||||
exposed to the guest.
|
to the guest.
|
||||||
- The USB device with vendor_id 046d and product_id 085e will be
|
- The USB device with vendor_id 046d and product_id 085e will be exposed
|
||||||
exposed to the guest.
|
to the guest.
|
||||||
|
|
||||||
If the USB devices are not writable, `quickemu` will display the
|
If the USB devices are not writable, `quickemu` will display the
|
||||||
appropriate commands to modify the USB device(s) access permissions,
|
appropriate commands to modify the USB device(s) access permissions,
|
||||||
|
@ -276,7 +313,7 @@ like this:
|
||||||
sudo chown -v root:user /dev/bus/usb/001/005
|
sudo chown -v root:user /dev/bus/usb/001/005
|
||||||
ERROR! USB permission changes are required 👆
|
ERROR! USB permission changes are required 👆
|
||||||
|
|
||||||
# TPM
|
### TPM
|
||||||
|
|
||||||
Since Quickemu 2.2.0 a software emulated TPM device can be added to
|
Since Quickemu 2.2.0 a software emulated TPM device can be added to
|
||||||
guest virtual machines. Just add `tpm="on"` to your VM configuration.
|
guest virtual machines. Just add `tpm="on"` to your VM configuration.
|
383
docs/quickget.1
383
docs/quickget.1
|
@ -1,8 +1,8 @@
|
||||||
.\" Automatically generated by Pandoc 3.1.9
|
.\" Automatically generated by Pandoc 3.6.1
|
||||||
.\"
|
.\"
|
||||||
.TH "QUICKGET" "1" "November 26, 2023" "quickget" "Quickget User Manual"
|
.TH "QUICKGET" "1" "December 30, 2024" "quickget" "Quickget User Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
quickget - download and prepare materials for building a quickemu VM
|
quickget \- download and prepare materials for building a quickemu VM
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
\f[B]quickget\f[R] [\f[I]os\f[R]] [\f[I]release\f[R]]
|
\f[B]quickget\f[R] [\f[I]os\f[R]] [\f[I]release\f[R]]
|
||||||
[\f[I]edition\f[R]] | [\f[I]OPTION\f[R]]*
|
[\f[I]edition\f[R]] | [\f[I]OPTION\f[R]]*
|
||||||
|
@ -11,70 +11,95 @@ quickget - download and prepare materials for building a quickemu VM
|
||||||
configuration for \f[CR]quickemu\f[R] to use to build and run
|
configuration for \f[CR]quickemu\f[R] to use to build and run
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.TP
|
.TP
|
||||||
\f[B]version | -version | \[en]version\f[R]
|
|
||||||
show version (from Quickemu)
|
|
||||||
.TP
|
|
||||||
\f[B]list | list_csv | list_json\f[R]
|
|
||||||
provide a csv list of all supported guest OSes, versions and variants.
|
|
||||||
.TP
|
|
||||||
\f[B]\f[CB]--show-iso-url\f[B] | -s\f[R] {\f[B]os\f[R]} {\f[B]release\f[R]} [\f[B]edition\f[R]]
|
|
||||||
show ISO download URL
|
|
||||||
.TP
|
|
||||||
\f[B]\f[CB]--test-iso-url\f[B] | -t\f[R] {\f[B]os\f[R]} {\f[B]release\f[R]} [\f[B]edition\f[R]]
|
|
||||||
test if ISO is available
|
|
||||||
.TP
|
|
||||||
\f[B]\f[CB]--open-distro-homepage\f[B] | -o\f[R] {\f[B]os\f[R]}
|
|
||||||
open OS homepage in browser
|
|
||||||
.TP
|
|
||||||
\f[B][OS] [Release] [Edition]\f[R]
|
\f[B][OS] [Release] [Edition]\f[R]
|
||||||
specify the OS and release (and optional edition) if insufficient input
|
specify the OS and release (and optional edition) if insufficient input
|
||||||
is provided a list of missing options will be reported and the script
|
is provided a list of missing options will be reported and the script
|
||||||
will exit.
|
will exit.
|
||||||
Editions may not apply and will be defaulted if not provided.
|
Editions may not apply and will be defaulted if not provided.
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-download\f[R] [edition]
|
||||||
|
Download image; no VM configuration
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-create\-config\f[R] [path/url]
|
||||||
|
Create VM config for a OS image
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-open\-homepage\f[R]
|
||||||
|
Open homepage for the OS
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-show\f[R] [os]
|
||||||
|
Show OS information
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-url\f[R] [os] [release] [edition]
|
||||||
|
Show image URL(s)
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-check\f[R] [os] [release] [edition]
|
||||||
|
Check image URL(s)
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-list\f[R]
|
||||||
|
List all supported systems
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-list\-csv\f[R]
|
||||||
|
List everything in csv format
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-list\-json\f[R]
|
||||||
|
List everything in json format
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-version\f[R]
|
||||||
|
Show version
|
||||||
|
.TP
|
||||||
|
\f[B]\-\-help\f[R]
|
||||||
|
Show this help message
|
||||||
.SH NOTES
|
.SH NOTES
|
||||||
.SS Ubuntu Guest
|
.SS Creating Linux guests 🐧
|
||||||
|
.SS Ubuntu
|
||||||
\f[CR]quickget\f[R] will automatically download an Ubuntu release and
|
\f[CR]quickget\f[R] will automatically download an Ubuntu release and
|
||||||
create the virtual machine configuration.
|
create the virtual machine configuration.
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
quickget ubuntu 22.04
|
quickget ubuntu 22.04
|
||||||
quickemu --vm ubuntu-22.04.conf
|
quickemu \-\-vm ubuntu\-22.04.conf
|
||||||
.EE
|
.EE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Complete the installation as normal.
|
Complete the installation as normal.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Post-install:
|
Post\-install:
|
||||||
.RS 2
|
.RS 2
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Install the SPICE agent (\f[CR]spice-vdagent\f[R]) in the guest to
|
Install the SPICE agent (\f[CR]spice\-vdagent\f[R]) in the guest to
|
||||||
enable copy/paste and USB redirection
|
enable copy/paste and USB redirection
|
||||||
.RS 2
|
.RS 2
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]sudo apt install spice-vdagent\f[R]
|
\f[CR]sudo apt install spice\-vdagent\f[R]
|
||||||
.RE
|
.RE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Install the SPICE WebDAV agent (\f[CR]spice-webdavd\f[R]) in the guest
|
Install the SPICE WebDAV agent (\f[CR]spice\-webdavd\f[R]) in the guest
|
||||||
to enable file sharing.
|
to enable file sharing.
|
||||||
.RS 2
|
.RS 2
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]sudo apt install spice-webdavd\f[R]
|
\f[CR]sudo apt install spice\-webdavd\f[R]
|
||||||
.RE
|
.RE
|
||||||
.RE
|
.RE
|
||||||
.SS Ubuntu devel (daily-live) images
|
.SS Ubuntu daily\-live images
|
||||||
\f[CR]quickget\f[R] can also download/refresh devel images via
|
\f[CR]quickget\f[R] can also download/refresh daily\-live images via
|
||||||
\f[CR]zsync\f[R] for Ubuntu developers and testers.
|
\f[CR]zsync\f[R] for Ubuntu developers and testers.
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
quickget ubuntu devel
|
quickget ubuntu daily\-live
|
||||||
quickemu --vm ubuntu-devel.conf
|
quickemu \-\-vm ubuntu\-daily\-live.conf
|
||||||
.EE
|
.EE
|
||||||
.PP
|
.PP
|
||||||
You can run \f[CR]quickget ubuntu devel\f[R] to refresh your daily
|
You can run \f[CR]quickget ubuntu daily\-live\f[R] to refresh your daily
|
||||||
development image as often as you like, it will even automatically
|
development image as often as you like, it will even automatically
|
||||||
switch to a new series.
|
switch to a new series.
|
||||||
.SS Ubuntu Flavours
|
.SS Ubuntu Flavours
|
||||||
All the official Ubuntu flavours are supported, just replace
|
All the official Ubuntu flavours are supported, just replace
|
||||||
\f[CR]ubuntu\f[R] with your preferred flavour.
|
\f[CR]ubuntu\f[R] with your preferred flavour.
|
||||||
|
.PP
|
||||||
|
The project \c
|
||||||
|
.UR https://github.com/quickemu-project/quickemu/wiki/02-Create-Linux-virtual-machines
|
||||||
|
wiki
|
||||||
|
.UE \c
|
||||||
|
\ may have further information.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]edubuntu\f[R] (Edubuntu)
|
\f[CR]edubuntu\f[R] (Edubuntu)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -82,42 +107,66 @@ All the official Ubuntu flavours are supported, just replace
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]lubuntu\f[R] (Lubuntu)
|
\f[CR]lubuntu\f[R] (Lubuntu)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ubuntu-budgie\f[R] (Ubuntu Budgie)
|
\f[CR]ubuntu\-budgie\f[R] (Ubuntu Budgie)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ubuntucinnamon\f[R] (Ubuntu Cinnamon)
|
\f[CR]ubuntucinnamon\f[R] (Ubuntu Cinnamon)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ubuntukylin\f[R] (Ubuntu Kylin)
|
\f[CR]ubuntukylin\f[R] (Ubuntu Kylin)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ubuntu-mate\f[R] (Ubuntu MATE)
|
\f[CR]ubuntu\-mate\f[R] (Ubuntu MATE)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ubuntu-server\f[R] (Ubuntu Server)
|
\f[CR]ubuntu\-server\f[R] (Ubuntu Server)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ubuntustudio\f[R] (Ubuntu Studio)
|
\f[CR]ubuntustudio\f[R] (Ubuntu Studio)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ubuntu\f[R] (Ubuntu)
|
\f[CR]ubuntu\f[R] (Ubuntu)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ubuntu-unity\f[R] (Ubuntu Unity)
|
\f[CR]ubuntu\-unity\f[R] (Ubuntu Unity)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]xubuntu\f[R] (Xubuntu)
|
\f[CR]xubuntu\f[R] (Xubuntu)
|
||||||
.PP
|
.PP
|
||||||
You can also use \f[CR]quickget\f[R] with options to:
|
You can also use \f[CR]quickget\f[R] with advanced options :
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
# show an OS ISO download URL for {os} {release} [edition]
|
\-\-download <os> <release> [edition] : Download image; no VM configuration
|
||||||
quickget --show-iso-url fedora 38 Silverblue
|
\-\-create\-config <os> [path/url] [flags] : Create VM config for an OS image
|
||||||
# test if and OS ISO is available for {os} {release} [edition]
|
\-\-open\-homepage <os> : Open homepage for the OS
|
||||||
quickget --test-iso-url nixos 23.05 plasma5
|
\-\-show [os] : Show OS information
|
||||||
# open an OS distribution homepage in a browser
|
\-\-version : Show version
|
||||||
quickget --open-distro-homepage ubuntu-mate
|
\-\-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
|
.EE
|
||||||
.PP
|
.PP
|
||||||
The \f[CR]--show-iso-url\f[R] and \f[CR]--test-iso-url\f[R] options
|
Here are some typical uses
|
||||||
\f[B]do not\f[R] work for \f[CR]Windows\f[R] (\f[CR]quickget\f[R] will
|
.IP
|
||||||
begin downloading the requested release and edition of windows)
|
.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
|
.SS Other Operating Systems
|
||||||
\f[CR]quickget\f[R] also supports:
|
\f[CR]quickget\f[R] also supports:
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]alma\f[R] (Alma Linux)
|
\f[CR]alma\f[R] (AlmaLinux)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]alpine\f[R] (Alpine Linux)
|
\f[CR]alpine\f[R] (Alpine Linux)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -131,17 +180,29 @@ begin downloading the requested release and edition of windows)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]arcolinux\f[R] (Arco Linux)
|
\f[CR]arcolinux\f[R] (Arco Linux)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]artixlinux\f[R] (Artix Linux)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]athenaos\f[R] (Athena OS)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]batocera\f[R] (Batocera)
|
\f[CR]batocera\f[R] (Batocera)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]bazzite\f[R] (Bazzite)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]biglinux\f[R] (BigLinux)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]blendos\f[R] (BlendOS)
|
\f[CR]blendos\f[R] (BlendOS)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]bodhi\f[R] (Bodhi)
|
\f[CR]bodhi\f[R] (Bodhi)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]bunsenlabs\f[R] (Bunsenlabs)
|
\f[CR]bunsenlabs\f[R] (BunsenLabs)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]cachyos\f[R] (CachyOS)
|
\f[CR]cachyos\f[R] (CachyOS)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]centos-stream\f[R] (CentOS Stream)
|
\f[CR]centos\-stream\f[R] (CentOS Stream)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]chimeralinux\f[R] (Chimera Linux)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]crunchbang++\f[R] (Crunchbangplusplus)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]debian\f[R] (Debian)
|
\f[CR]debian\f[R] (Debian)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -151,6 +212,8 @@ begin downloading the requested release and edition of windows)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]dragonflybsd\f[R] (DragonFlyBSD)
|
\f[CR]dragonflybsd\f[R] (DragonFlyBSD)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]easyos\f[R] (EasyOS)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]elementary\f[R] (elementary OS)
|
\f[CR]elementary\f[R] (elementary OS)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]endeavouros\f[R] (EndeavourOS)
|
\f[CR]endeavouros\f[R] (EndeavourOS)
|
||||||
|
@ -169,9 +232,13 @@ begin downloading the requested release and edition of windows)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]ghostbsd\f[R] (GhostBSD)
|
\f[CR]ghostbsd\f[R] (GhostBSD)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]gnomeos\f[R] (GNOME OS)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]guix\f[R] (Guix)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]haiku\f[R] (Haiku)
|
\f[CR]haiku\f[R] (Haiku)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]holoiso\f[R] (SteamOS HoloISO)
|
\f[CR]holoiso\f[R] (HoloISO)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]kali\f[R] (Kali)
|
\f[CR]kali\f[R] (Kali)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -185,6 +252,8 @@ begin downloading the requested release and edition of windows)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]lmde\f[R] (Linux Mint Debian Edition)
|
\f[CR]lmde\f[R] (Linux Mint Debian Edition)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]maboxlinux\f[R] (Mabox Linux)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]mageia\f[R] (Mageia)
|
\f[CR]mageia\f[R] (Mageia)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]manjaro\f[R] (Manjaro)
|
\f[CR]manjaro\f[R] (Manjaro)
|
||||||
|
@ -195,8 +264,12 @@ begin downloading the requested release and edition of windows)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]netbsd\f[R] (NetBSD)
|
\f[CR]netbsd\f[R] (NetBSD)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]nitrux\f[R] (Nitrux)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]nixos\f[R] (NixOS)
|
\f[CR]nixos\f[R] (NixOS)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]nwg\-shell\f[R] (nwg\-shell)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]openbsd\f[R] (OpenBSD)
|
\f[CR]openbsd\f[R] (OpenBSD)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]openindiana\f[R] (OpenIndiana)
|
\f[CR]openindiana\f[R] (OpenIndiana)
|
||||||
|
@ -205,12 +278,20 @@ begin downloading the requested release and edition of windows)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]oraclelinux\f[R] (Oracle Linux)
|
\f[CR]oraclelinux\f[R] (Oracle Linux)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]parrotsec\f[R] (Parrot Security)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]peppermint\f[R] (PeppermintOS)
|
\f[CR]peppermint\f[R] (PeppermintOS)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]popos\f[R] (Pop!_OS)
|
\f[CR]popos\f[R] (Pop!_OS)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]porteus\f[R] (Porteus)
|
\f[CR]porteus\f[R] (Porteus)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]primtux\f[R] (PrimTux)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]proxmox\-ve\f[R] (Proxmox VE)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]pureos\f[R] (PureOS)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]reactos\f[R] (ReactOS)
|
\f[CR]reactos\f[R] (ReactOS)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]rebornos\f[R] (RebornOS)
|
\f[CR]rebornos\f[R] (RebornOS)
|
||||||
|
@ -221,19 +302,29 @@ begin downloading the requested release and edition of windows)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]slackware\f[R] (Slackware)
|
\f[CR]slackware\f[R] (Slackware)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
\f[CR]slax\f[R] (Slax)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]slint\f[R] (Slint)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]slitaz\f[R] (SliTaz)
|
||||||
|
.IP \[bu] 2
|
||||||
\f[CR]solus\f[R] (Solus)
|
\f[CR]solus\f[R] (Solus)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]spiral\f[R] (Spiral)
|
\f[CR]sparkylinux\f[R] (SparkyLinux)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]spirallinux\f[R] (SpiralLinux)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]tails\f[R] (Tails)
|
\f[CR]tails\f[R] (Tails)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]tinycore\f[R] (Tiny Core Linux)
|
\f[CR]tinycore\f[R] (Tiny Core Linux)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]trisquel\f[R] (Trisquel)
|
\f[CR]trisquel\f[R] (Trisquel\-)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]truenas-core\f[R] (TrueNAS Core)
|
\f[CR]truenas\-core\f[R] (TrueNAS Core)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]truenas-scale\f[R] (TrueNAS Scale)
|
\f[CR]truenas\-scale\f[R] (TrueNAS Scale)
|
||||||
|
.IP \[bu] 2
|
||||||
|
\f[CR]tuxedo\-os\f[R] (Tuxedo OS)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]vanillaos\f[R] (Vanilla OS)
|
\f[CR]vanillaos\f[R] (Vanilla OS)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -241,52 +332,69 @@ begin downloading the requested release and edition of windows)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]vxlinux\f[R] (VX Linux)
|
\f[CR]vxlinux\f[R] (VX Linux)
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]xerolinux\f[R] (XeroLinux)
|
|
||||||
.IP \[bu] 2
|
|
||||||
\f[CR]zorin\f[R] (Zorin OS)
|
\f[CR]zorin\f[R] (Zorin OS)
|
||||||
.PP
|
.SS \c
|
||||||
|
.UR https://github.com/quickemu-project/quickemu/wiki/02-Create-Linux-virtual-machines#manually-create-linux-guests
|
||||||
|
Custom Linux guests
|
||||||
|
.UE \c
|
||||||
Or you can download a Linux image and manually create a VM
|
Or you can download a Linux image and manually create a VM
|
||||||
configuration.
|
configuration.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Download a .iso image of a Linux distribution
|
Download a .iso image of a Linux distribution
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Create a VM configuration file; for example
|
Create a VM configuration file; for example
|
||||||
\f[CR]debian-bullseye.conf\f[R]
|
\f[CR]debian\-bullseye.conf\f[R]
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
guest_os=\[dq]linux\[dq]
|
guest_os=\[dq]linux\[dq]
|
||||||
disk_img=\[dq]debian-bullseye/disk.qcow2\[dq]
|
disk_img=\[dq]debian\-bullseye/disk.qcow2\[dq]
|
||||||
iso=\[dq]debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso\[dq]
|
iso=\[dq]debian\-bullseye/firmware\-11.0.0\-amd64\-DVD\-1.iso\[dq]
|
||||||
.EE
|
.EE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Use \f[CR]quickemu\f[R] to start the virtual machine:
|
Use \f[CR]quickemu\f[R] to start the virtual machine:
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
quickemu --vm debian-bullseye.conf
|
quickemu \-\-vm debian\-bullseye.conf
|
||||||
.EE
|
.EE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Complete the installation as normal.
|
Complete the installation as normal.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Post-install:
|
Post\-install:
|
||||||
.RS 2
|
.RS 2
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Install the SPICE agent (\f[CR]spice-vdagent\f[R]) in the guest to
|
Install the SPICE agent (\f[CR]spice\-vdagent\f[R]) in the guest to
|
||||||
enable copy/paste and USB redirection.
|
enable copy/paste and USB redirection.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Install the SPICE WebDAV agent (\f[CR]spice-webdavd\f[R]) in the guest
|
Install the SPICE WebDAV agent (\f[CR]spice\-webdavd\f[R]) in the guest
|
||||||
to enable file sharing.
|
to enable file sharing.
|
||||||
.RE
|
.RE
|
||||||
.SS macOS Guest
|
.SS Supporting old Linux distros
|
||||||
|
If you want to run an old Linux , from 2016 or earlier, change the
|
||||||
|
\f[CR]guest_os\f[R] to \f[CR]linux_old\f[R].
|
||||||
|
This will enable the \f[CR]vmware\-svga\f[R] graphics driver which is
|
||||||
|
better supported on older distros.
|
||||||
|
.SS \c
|
||||||
|
.UR https://github.com/quickemu-project/quickemu/wiki/03-Create-macOS-virtual-machines#automatically-create-macos-guests
|
||||||
|
Creating macOS Guests
|
||||||
|
.UE \c
|
||||||
|
\ 🍏
|
||||||
|
\f[B]Installing macOS in a VM can be a bit finicky, if you encounter
|
||||||
|
problems, \c
|
||||||
|
.UR https://github.com/quickemu-project/quickemu/discussions
|
||||||
|
check the Discussions
|
||||||
|
.UE \c
|
||||||
|
\ for solutions or ask for help there\f[R] 🛟
|
||||||
|
.PP
|
||||||
\f[CR]quickget\f[R] automatically downloads a macOS recovery image and
|
\f[CR]quickget\f[R] automatically downloads a macOS recovery image and
|
||||||
creates a virtual machine configuration.
|
creates a virtual machine configuration.
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
quickget macos catalina
|
quickget macos big\-sur
|
||||||
quickemu --vm macos-catalina.conf
|
quickemu \-\-vm macos\-big\-sur.conf
|
||||||
.EE
|
.EE
|
||||||
.PP
|
.PP
|
||||||
macOS \f[CR]high-sierra\f[R], \f[CR]mojave\f[R], \f[CR]catalina\f[R],
|
macOS \f[CR]mojave\f[R], \f[CR]catalina\f[R], \f[CR]big\-sur\f[R],
|
||||||
\f[CR]big-sur\f[R], \f[CR]monterey\f[R] and \f[CR]ventura\f[R] are
|
\f[CR]monterey\f[R], \f[CR]ventura\f[R] and \f[CR]sonoma\f[R] are
|
||||||
supported.
|
supported.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Use cursor keys and enter key to select the \f[B]macOS Base System\f[R]
|
Use cursor keys and enter key to select the \f[B]macOS Base System\f[R]
|
||||||
|
@ -303,8 +411,9 @@ click \f[B]Erase\f[R].
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Enter a \f[CR]Name:\f[R] for the disk
|
Enter a \f[CR]Name:\f[R] for the disk
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
If you are installing macOS Mojave or later (Catalina, Big Sur, Monterey
|
If you are installing macOS Mojave or later (Catalina, Big Sur,
|
||||||
and Ventura), choose any of the APFS options as the filesystem.
|
Monterey, Ventura and Sonoma), choose any of the APFS options as the
|
||||||
|
filesystem.
|
||||||
MacOS Extended may not work.
|
MacOS Extended may not work.
|
||||||
.RE
|
.RE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -332,10 +441,10 @@ disk you named
|
||||||
.RE
|
.RE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Once you have finished installing macOS you will be presented with an
|
Once you have finished installing macOS you will be presented with an
|
||||||
the out-of-the-box first-start wizard to configure various options and
|
the out\-of\-the\-box first\-start wizard to configure various options
|
||||||
set up your username and password
|
and set up your username and password
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
OPTIONAL: After you have concluded the out-of-the-box wizard, you may
|
OPTIONAL: After you have concluded the out\-of\-the\-box wizard, you may
|
||||||
want to enable the TRIM feature that the computer industry created for
|
want to enable the TRIM feature that the computer industry created for
|
||||||
SSD disks.
|
SSD disks.
|
||||||
This feature in our macOS installation will allow QuickEmu to compact
|
This feature in our macOS installation will allow QuickEmu to compact
|
||||||
|
@ -354,20 +463,21 @@ on the hard disk when files are deleted:
|
||||||
sudo trimforce enable
|
sudo trimforce enable
|
||||||
.EE
|
.EE
|
||||||
.PP
|
.PP
|
||||||
You will be prompted to enter your account\[cq]s password to gain the
|
You will be prompted to enter your account\[aq]s password to gain the
|
||||||
privilege needed.
|
privilege needed.
|
||||||
Once you\[cq]ve entered your password and pressed enter the command will
|
Once you\[aq]ve entered your password and pressed enter the command will
|
||||||
request confirmation in the form of two questions that require you to
|
request confirmation in the form of two questions that require you to
|
||||||
type y (for a \[lq]yes\[rq] response) followed by enter to confirm.
|
type y (for a \[dq]yes\[dq] response) followed by enter to confirm.
|
||||||
|
.PP
|
||||||
If you press enter without first typing y the system will consider that
|
If you press enter without first typing y the system will consider that
|
||||||
a negative response as though you said \[lq]no\[rq]:
|
a negative response as though you said \[dq]no\[dq]:
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
IMPORTANT NOTICE: This tool force-enables TRIM for all relevant attached devices, even though such devices may not have been validated for data integrity while using TRIM. Use of this tool to enable TRIM may result in unintended data loss or data corruption. It should not be used in a commercial operating environment or with important data. Before using this tool, you should back up all of your data and regularly back up data while TRIM is enabled. This tool is provided on an \[dq]as is\[dq] basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THIS TOOL OR ITS USE ALONE OR IN COMBINATION WITH YOUR DEVICES, SYSTEMS, OR SERVICES. BY USING THIS TOOL TO ENABLE TRIM, YOU AGREE THAT, TO THE EXTENT PERMITTED BY APPLICABLE LAW, USE OF THE TOOL IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU.
|
IMPORTANT NOTICE: This tool force\-enables TRIM for all relevant attached devices, even though such devices may not have been validated for data integrity while using TRIM. Use of this tool to enable TRIM may result in unintended data loss or data corruption. It should not be used in a commercial operating environment or with important data. Before using this tool, you should back up all of your data and regularly back up data while TRIM is enabled. This tool is provided on an \[dq]as is\[dq] basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON\-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THIS TOOL OR ITS USE ALONE OR IN COMBINATION WITH YOUR DEVICES, SYSTEMS, OR SERVICES. BY USING THIS TOOL TO ENABLE TRIM, YOU AGREE THAT, TO THE EXTENT PERMITTED BY APPLICABLE LAW, USE OF THE TOOL IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU.
|
||||||
Are you sure you with to proceed (y/N)?
|
Are you sure you with to proceed (y/N)?
|
||||||
.EE
|
.EE
|
||||||
.PP
|
.PP
|
||||||
And a second confirmation once you\[cq]ve confirmed the previous one:
|
And a second confirmation once you\[aq]ve confirmed the previous one:
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
Your system will immediately reboot when this is complete.
|
Your system will immediately reboot when this is complete.
|
||||||
|
@ -381,15 +491,15 @@ The default macOS configuration looks like this:
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
guest_os=\[dq]macos\[dq]
|
guest_os=\[dq]macos\[dq]
|
||||||
img=\[dq]macos-catalina/RecoveryImage.img\[dq]
|
img=\[dq]macos\- big\-sur/RecoveryImage.img\[dq]
|
||||||
disk_img=\[dq]macos-catalina/disk.qcow2\[dq]
|
disk_img=\[dq]macos\- big\-sur/disk.qcow2\[dq]
|
||||||
macos_release=\[dq]catalina\[dq]
|
macos_release=\[dq] big\-sur\[dq]
|
||||||
.EE
|
.EE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]guest_os=\[dq]macos\[dq]\f[R] instructs Quickemu to optimise for
|
\f[CR]guest_os=\[dq]macos\[dq]\f[R] instructs Quickemu to optimise for
|
||||||
macOS.
|
macOS.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]macos_release=\[dq]catalina\[dq]\f[R] instructs Quickemu to
|
\f[CR]macos_release=\[dq] big\-sur\[dq]\f[R] instructs Quickemu to
|
||||||
optimise for a particular macOS release.
|
optimise for a particular macOS release.
|
||||||
.RS 2
|
.RS 2
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -399,23 +509,23 @@ Sur and newer, but not previous releases.
|
||||||
And VirtIO Block Media (disks) are supported/stable in Catalina and
|
And VirtIO Block Media (disks) are supported/stable in Catalina and
|
||||||
newer.
|
newer.
|
||||||
.RE
|
.RE
|
||||||
.SS macOS compatibility
|
.SH macOS compatibility
|
||||||
There are some considerations when running macOS via Quickemu.
|
There are some considerations when running macOS via Quickemu.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Supported macOS releases:
|
Supported macOS releases:
|
||||||
.RS 2
|
.RS 2
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
High Sierra
|
|
||||||
.IP \[bu] 2
|
|
||||||
Mojave
|
Mojave
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Catalina \f[B](Recommended)\f[R]
|
Catalina
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Big Sur
|
Big Sur
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Monterey
|
Monterey
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Ventura
|
Ventura
|
||||||
|
.IP \[bu] 2
|
||||||
|
Sonoma
|
||||||
.RE
|
.RE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[CR]quickemu\f[R] will automatically download the required \c
|
\f[CR]quickemu\f[R] will automatically download the required \c
|
||||||
|
@ -424,7 +534,7 @@ OpenCore
|
||||||
.UE \c
|
.UE \c
|
||||||
\ bootloader and OVMF firmware from \c
|
\ bootloader and OVMF firmware from \c
|
||||||
.UR https://github.com/kholia/OSX-KVM
|
.UR https://github.com/kholia/OSX-KVM
|
||||||
OSX-KVM
|
OSX\-KVM
|
||||||
.UE \c
|
.UE \c
|
||||||
\&.
|
\&.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
|
@ -441,18 +551,18 @@ VirtIO Block Media
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\c
|
\c
|
||||||
.UR http://philjordan.eu/osx-virt/
|
.UR http://philjordan.eu/osx-virt/
|
||||||
VirtIO \f[CR]usb-tablet\f[R]
|
VirtIO \f[CR]usb\-tablet\f[R]
|
||||||
.UE \c
|
.UE \c
|
||||||
\ is used for the mouse.
|
\ is used for the mouse.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
VirtIO Network (\f[CR]virtio-net\f[R]) is supported and enabled on macOS
|
VirtIO Network (\f[CR]virtio\-net\f[R]) is supported and enabled on
|
||||||
Big Sur and newer but previous releases use \f[CR]vmxnet3\f[R].
|
macOS Big Sur and newer, but earlier releases use \f[CR]vmxnet3\f[R].
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
VirtIO Memory Ballooning is supported and enabled on macOS Big Sur and
|
VirtIO Memory Ballooning is supported and enabled on macOS Big Sur and
|
||||||
newer but disabled for other support macOS releases.
|
newer but disabled for other support macOS releases.
|
||||||
.RE
|
.RE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
USB host and SPICE pass-through is:
|
USB host and SPICE pass\-through is:
|
||||||
.RS 2
|
.RS 2
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
UHCI (USB 2.0) on macOS Catalina and earlier.
|
UHCI (USB 2.0) on macOS Catalina and earlier.
|
||||||
|
@ -460,13 +570,15 @@ UHCI (USB 2.0) on macOS Catalina and earlier.
|
||||||
XHCI (USB 3.0) on macOS Big Sur and newer.
|
XHCI (USB 3.0) on macOS Big Sur and newer.
|
||||||
.RE
|
.RE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Display resolution can only be changed via macOS System Preferences.
|
Display resolution can be changed via \f[CR]quickemu\f[R] using
|
||||||
|
\f[CR]\-\-width\f[R] and \f[CR]\-\-height\f[R] command line arguments.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
\f[B]Full Duplex audio requires \c
|
\f[B]Full Duplex audio requires \c
|
||||||
.UR https://github.com/chris1111/VoodooHDA-OC
|
.UR https://github.com/chris1111/VoodooHDA-OC
|
||||||
VoodooHDA OC
|
VoodooHDA OC
|
||||||
.UE \c
|
.UE \c
|
||||||
\ or pass-through a USB audio-device to the macOS guest VM\f[R].
|
\ or pass\-through a USB audio\-device to the macOS guest VM\f[R].
|
||||||
|
.RS 2
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
NOTE!
|
NOTE!
|
||||||
\c
|
\c
|
||||||
|
@ -474,15 +586,15 @@ NOTE!
|
||||||
Gatekeeper
|
Gatekeeper
|
||||||
.UE \c
|
.UE \c
|
||||||
\ and \c
|
\ and \c
|
||||||
.UR
|
.UR https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection
|
||||||
https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection
|
|
||||||
System Integrity Protection (SIP)
|
System Integrity Protection (SIP)
|
||||||
.UE \c
|
.UE \c
|
||||||
\ need to be disabled to install VoodooHDA OC
|
\ need to be disabled to install VoodooHDA OC
|
||||||
|
.RE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
File sharing between guest and host is available via \c
|
File sharing between guest and host is available via \c
|
||||||
.UR https://wiki.qemu.org/Documentation/9psetup
|
.UR https://wiki.qemu.org/Documentation/9psetup
|
||||||
virtio-9p
|
virtio\-9p
|
||||||
.UE \c
|
.UE \c
|
||||||
\ and \c
|
\ and \c
|
||||||
.UR https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24
|
.UR https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24
|
||||||
|
@ -491,14 +603,14 @@ SPICE webdavd
|
||||||
\&.
|
\&.
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Copy/paste via SPICE agent is \f[B]not available on macOS\f[R].
|
Copy/paste via SPICE agent is \f[B]not available on macOS\f[R].
|
||||||
.SS macOS App Store
|
.SH macOS App Store
|
||||||
If you see \f[I]\[lq]Your device or computer could not be
|
If you see \f[I]\[dq]Your device or computer could not be
|
||||||
verified\[rq]\f[R] when you try to login to the App Store, make sure
|
verified\[dq]\f[R] when you try to login to the App Store, make sure
|
||||||
that your wired ethernet device is \f[CR]en0\f[R].
|
that your wired ethernet device is \f[CR]en0\f[R].
|
||||||
Use \f[CR]ifconfig\f[R] in a terminal to verify this.
|
Use \f[CR]ifconfig\f[R] in a terminal to verify this.
|
||||||
.PP
|
.PP
|
||||||
If the wired ethernet device is not \f[CR]en0\f[R], then then go to
|
If the wired ethernet device is not \f[CR]en0\f[R], then then go to
|
||||||
\f[I]System Preferences\f[R] -> \f[I]Network\f[R], delete all the
|
\f[I]System Preferences\f[R] \-> \f[I]Network\f[R], delete all the
|
||||||
network devices and apply the changes.
|
network devices and apply the changes.
|
||||||
Next, open a terminal and run the following:
|
Next, open a terminal and run the following:
|
||||||
.IP
|
.IP
|
||||||
|
@ -507,14 +619,25 @@ sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
|
||||||
.EE
|
.EE
|
||||||
.PP
|
.PP
|
||||||
Now reboot, and the App Store should work.
|
Now reboot, and the App Store should work.
|
||||||
.SS Windows 8, 10 & 11 Guests
|
.PP
|
||||||
|
There may be further advice and information about macOS guests in the
|
||||||
|
project \c
|
||||||
|
.UR https://github.com/quickemu-project/quickemu/wiki/03-Create-macOS-virtual-machines#automatically-create-macos-guests
|
||||||
|
wiki
|
||||||
|
.UE \c
|
||||||
|
\&.
|
||||||
|
.SS \c
|
||||||
|
.UR https://github.com/quickemu-project/quickemu/wiki/04-Create-Windows-virtual-machines
|
||||||
|
Creating Windows guests
|
||||||
|
.UE \c
|
||||||
|
\ 🪟
|
||||||
\f[CR]quickget\f[R] can download \c
|
\f[CR]quickget\f[R] can download \c
|
||||||
.UR https://www.microsoft.com/software-download/windows10
|
.UR https://www.microsoft.com/software-download/windows10
|
||||||
Windows10
|
\f[B]Windows 10\f[R]
|
||||||
.UE \c
|
.UE \c
|
||||||
\ and \c
|
\ and \c
|
||||||
.UR https://www.microsoft.com/software-download/windows11
|
.UR https://www.microsoft.com/software-download/windows11
|
||||||
Windows 11
|
\f[B]Windows 11\f[R]
|
||||||
.UE \c
|
.UE \c
|
||||||
\ automatically and create an optimised virtual machine configuration.
|
\ automatically and create an optimised virtual machine configuration.
|
||||||
This configuration also includes the \c
|
This configuration also includes the \c
|
||||||
|
@ -523,12 +646,35 @@ VirtIO drivers for Windows
|
||||||
.UE \c
|
.UE \c
|
||||||
\&.
|
\&.
|
||||||
.PP
|
.PP
|
||||||
Windows 8.1 is also supported but doesn\[cq]t feature any automated
|
\f[B]Windows 8.1\f[R] is also supported but doesn\[aq]t feature any
|
||||||
installation or driver optimisation.
|
automated installation or driver optimisation.
|
||||||
|
.PP
|
||||||
|
\f[CR]quickget\f[R] can also download \c
|
||||||
|
.UR https://www.microsoft.com/en-us/evalcenter/download-windows-10-enterprise
|
||||||
|
Windows 10 LTSC
|
||||||
|
.UE \c
|
||||||
|
\ and Windows Server \c
|
||||||
|
.UR https://www.microsoft.com/en-us/evalcenter/download-windows-server-2012-r2
|
||||||
|
2012\-r2
|
||||||
|
.UE \c
|
||||||
|
, \c
|
||||||
|
.UR https://www.microsoft.com/en-us/evalcenter/download-windows-server-2016
|
||||||
|
2016
|
||||||
|
.UE \c
|
||||||
|
, \c
|
||||||
|
.UR https://www.microsoft.com/en-us/evalcenter/download-windows-server-2019
|
||||||
|
2019
|
||||||
|
.UE \c
|
||||||
|
, and \c
|
||||||
|
.UR https://www.microsoft.com/en-us/evalcenter/download-windows-server-2022
|
||||||
|
2022
|
||||||
|
.UE \c
|
||||||
|
\&.
|
||||||
|
No automated installation is supported for these releases.
|
||||||
.IP
|
.IP
|
||||||
.EX
|
.EX
|
||||||
quickget windows 11
|
quickget windows 11
|
||||||
quickemu --vm windows-11.conf
|
quickemu \-\-vm windows\-11.conf
|
||||||
.EE
|
.EE
|
||||||
.IP \[bu] 2
|
.IP \[bu] 2
|
||||||
Complete the installation as you normally would.
|
Complete the installation as you normally would.
|
||||||
|
@ -544,25 +690,10 @@ Username: \f[CR]Quickemu\f[R]
|
||||||
Password: \f[CR]quickemu\f[R]
|
Password: \f[CR]quickemu\f[R]
|
||||||
.RE
|
.RE
|
||||||
.PP
|
.PP
|
||||||
The default Windows 11 configuration looks like this:
|
Further information is available from the project \c
|
||||||
.IP
|
.UR https://github.com/quickemu-project/quickemu/wiki/04-Create-Windows-virtual-machines
|
||||||
.EX
|
wiki
|
||||||
guest_os=\[dq]windows\[dq]
|
.UE \c
|
||||||
disk_img=\[dq]windows-11/disk.qcow2\[dq]
|
|
||||||
iso=\[dq]windows-11/windows-11.iso\[dq]
|
|
||||||
fixed_iso=\[dq]windows-11/virtio-win.iso\[dq]
|
|
||||||
tpm=\[dq]on\[dq]
|
|
||||||
secureboot=\[dq]off\[dq]
|
|
||||||
.EE
|
|
||||||
.IP \[bu] 2
|
|
||||||
\f[CR]guest_os=\[dq]windows\[dq]\f[R] instructs \f[CR]quickemu\f[R] to
|
|
||||||
optimise for Windows.
|
|
||||||
.IP \[bu] 2
|
|
||||||
\f[CR]fixed_iso=\f[R] specifies the ISO image that provides VirtIO
|
|
||||||
drivers.
|
|
||||||
.IP \[bu] 2
|
|
||||||
\f[CR]tpm=\[dq]on\[dq]\f[R] instructs \f[CR]quickemu\f[R] to create a
|
|
||||||
software emulated TPM device using \f[CR]swtpm\f[R].
|
|
||||||
.SH AUTHORS
|
.SH AUTHORS
|
||||||
Written by Martin Wimpress.
|
Written by Martin Wimpress.
|
||||||
.SH BUGS
|
.SH BUGS
|
||||||
|
@ -574,6 +705,6 @@ Full sources at: \c
|
||||||
.UR https://github.com/quickemu-project/quickemu
|
.UR https://github.com/quickemu-project/quickemu
|
||||||
.UE \c
|
.UE \c
|
||||||
.PP
|
.PP
|
||||||
quickemu(1), quickemu_conf(1), quickgui(1)
|
quickemu(1), quickemu_conf(5), quickgui(1)
|
||||||
.SH AUTHORS
|
.SH AUTHORS
|
||||||
Martin Wimpress.
|
Martin Wimpress.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
author: Martin Wimpress
|
author: Martin Wimpress
|
||||||
date: November 26, 2023
|
date: December 30, 2024
|
||||||
footer: quickget
|
footer: quickget
|
||||||
header: Quickget User Manual
|
header: Quickget User Manual
|
||||||
section: 1
|
section: 1
|
||||||
|
@ -22,251 +22,326 @@ configuration for `quickemu` to use to build and run
|
||||||
|
|
||||||
# OPTIONS
|
# OPTIONS
|
||||||
|
|
||||||
**version \| -version \| --version**
|
|
||||||
: show version (from Quickemu)
|
|
||||||
|
|
||||||
**list \| list_csv \| list_json**
|
|
||||||
: provide a csv list of all supported guest OSes, versions and
|
|
||||||
variants.
|
|
||||||
|
|
||||||
**`--show-iso-url` \| -s** {**os**} {**release**} \[**edition**\]
|
|
||||||
: show ISO download URL
|
|
||||||
|
|
||||||
**`--test-iso-url` \| -t** {**os**} {**release**} \[**edition**\]
|
|
||||||
: test if ISO is available
|
|
||||||
|
|
||||||
**`--open-distro-homepage` \| -o** {**os**}
|
|
||||||
: open OS homepage in browser
|
|
||||||
|
|
||||||
**\[OS\] \[Release\] \[Edition\]**
|
**\[OS\] \[Release\] \[Edition\]**
|
||||||
: specify the OS and release (and optional edition) if insufficient
|
: specify the OS and release (and optional edition) if insufficient
|
||||||
input is provided a list of missing options will be reported and the
|
input is provided a list of missing options will be reported and the
|
||||||
script will exit. Editions may not apply and will be defaulted if
|
script will exit. Editions may not apply and will be defaulted if
|
||||||
not provided.
|
not provided.
|
||||||
|
|
||||||
|
**--download** <os> <release> \[edition\]
|
||||||
|
: Download image; no VM configuration
|
||||||
|
|
||||||
|
**--create-config** <os> \[path/url\]
|
||||||
|
: Create VM config for a OS image
|
||||||
|
|
||||||
|
**--open-homepage** <os>
|
||||||
|
: Open homepage for the OS
|
||||||
|
|
||||||
|
**--show** \[os\]
|
||||||
|
: Show OS information
|
||||||
|
|
||||||
|
**--url** \[os\] \[release\] \[edition\]
|
||||||
|
: Show image URL(s)
|
||||||
|
|
||||||
|
**--check** \[os\] \[release\] \[edition\]
|
||||||
|
: Check image URL(s)
|
||||||
|
|
||||||
|
**--list**
|
||||||
|
: List all supported systems
|
||||||
|
|
||||||
|
**--list-csv**
|
||||||
|
: List everything in csv format
|
||||||
|
|
||||||
|
**--list-json**
|
||||||
|
: List everything in json format
|
||||||
|
|
||||||
|
**--version**
|
||||||
|
: Show version
|
||||||
|
|
||||||
|
**--help**
|
||||||
|
: Show this help message
|
||||||
|
|
||||||
# NOTES
|
# NOTES
|
||||||
|
|
||||||
## Ubuntu Guest
|
## Creating Linux guests 🐧
|
||||||
|
|
||||||
|
### Ubuntu
|
||||||
|
|
||||||
`quickget` will automatically download an Ubuntu release and create the
|
`quickget` will automatically download an Ubuntu release and create the
|
||||||
virtual machine configuration.
|
virtual machine configuration.
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
quickget ubuntu 22.04
|
quickget ubuntu 22.04
|
||||||
quickemu --vm ubuntu-22.04.conf
|
quickemu --vm ubuntu-22.04.conf
|
||||||
```
|
```
|
||||||
|
|
||||||
- Complete the installation as normal.
|
- Complete the installation as normal.
|
||||||
- Post-install:
|
- Post-install:
|
||||||
- Install the SPICE agent (`spice-vdagent`) in the guest to enable
|
- Install the SPICE agent (`spice-vdagent`) in the guest to enable
|
||||||
copy/paste and USB redirection
|
copy/paste and USB redirection
|
||||||
- `sudo apt install spice-vdagent`
|
- `sudo apt install spice-vdagent`
|
||||||
- Install the SPICE WebDAV agent (`spice-webdavd`) in the guest to
|
- Install the SPICE WebDAV agent (`spice-webdavd`) in the guest to
|
||||||
enable file sharing.
|
enable file sharing.
|
||||||
- `sudo apt install spice-webdavd`
|
- `sudo apt install spice-webdavd`
|
||||||
|
|
||||||
### Ubuntu devel (daily-live) images
|
### Ubuntu daily-live images
|
||||||
|
|
||||||
`quickget` can also download/refresh devel images via `zsync` for Ubuntu
|
`quickget` can also download/refresh daily-live images via `zsync` for
|
||||||
developers and testers.
|
Ubuntu developers and testers.
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
quickget ubuntu devel
|
quickget ubuntu daily-live
|
||||||
quickemu --vm ubuntu-devel.conf
|
quickemu --vm ubuntu-daily-live.conf
|
||||||
```
|
```
|
||||||
|
|
||||||
You can run `quickget ubuntu devel` to refresh your daily development
|
You can run `quickget ubuntu daily-live` to refresh your daily
|
||||||
image as often as you like, it will even automatically switch to a new
|
development image as often as you like, it will even automatically
|
||||||
series.
|
switch to a new series.
|
||||||
|
|
||||||
### Ubuntu Flavours
|
### Ubuntu Flavours
|
||||||
|
|
||||||
All the official Ubuntu flavours are supported, just replace `ubuntu`
|
All the official Ubuntu flavours are supported, just replace `ubuntu`
|
||||||
with your preferred flavour.
|
with your preferred flavour.
|
||||||
|
|
||||||
- `edubuntu` (Edubuntu)
|
The project
|
||||||
- `kubuntu` (Kubuntu)
|
[wiki](https://github.com/quickemu-project/quickemu/wiki/02-Create-Linux-virtual-machines)
|
||||||
- `lubuntu` (Lubuntu)
|
may have further information.
|
||||||
- `ubuntu-budgie` (Ubuntu Budgie)
|
|
||||||
- `ubuntucinnamon` (Ubuntu Cinnamon)
|
|
||||||
- `ubuntukylin` (Ubuntu Kylin)
|
|
||||||
- `ubuntu-mate` (Ubuntu MATE)
|
|
||||||
- `ubuntu-server` (Ubuntu Server)
|
|
||||||
- `ubuntustudio` (Ubuntu Studio)
|
|
||||||
- `ubuntu` (Ubuntu)
|
|
||||||
- `ubuntu-unity` (Ubuntu Unity)
|
|
||||||
- `xubuntu` (Xubuntu)
|
|
||||||
|
|
||||||
You can also use `quickget` with options to:
|
- `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)
|
||||||
|
|
||||||
``` shell
|
You can also use `quickget` with advanced options :
|
||||||
# show an OS ISO download URL for {os} {release} [edition]
|
|
||||||
quickget --show-iso-url fedora 38 Silverblue
|
``` text
|
||||||
# test if and OS ISO is available for {os} {release} [edition]
|
--download <os> <release> [edition] : Download image; no VM configuration
|
||||||
quickget --test-iso-url nixos 23.05 plasma5
|
--create-config <os> [path/url] [flags] : Create VM config for an OS image
|
||||||
# open an OS distribution homepage in a browser
|
--open-homepage <os> : Open homepage for the OS
|
||||||
quickget --open-distro-homepage ubuntu-mate
|
--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
|
||||||
```
|
```
|
||||||
|
|
||||||
The `--show-iso-url` and `--test-iso-url` options **do not** work for
|
Here are some typical uses
|
||||||
`Windows` (`quickget` will begin downloading the requested release and
|
|
||||||
edition of windows)
|
|
||||||
|
|
||||||
## Other Operating Systems
|
``` 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:
|
`quickget` also supports:
|
||||||
|
|
||||||
- `alma` (Alma Linux)
|
- `alma` (AlmaLinux)
|
||||||
- `alpine` (Alpine Linux)
|
- `alpine` (Alpine Linux)
|
||||||
- `android` (Android x86)
|
- `android` (Android x86)
|
||||||
- `antix` (Antix)
|
- `antix` (Antix)
|
||||||
- `archcraft` (Archcraft)
|
- `archcraft` (Archcraft)
|
||||||
- `archlinux` (Arch Linux)
|
- `archlinux` (Arch Linux)
|
||||||
- `arcolinux` (Arco Linux)
|
- `arcolinux` (Arco Linux)
|
||||||
- `batocera` (Batocera)
|
- `artixlinux` (Artix Linux)
|
||||||
- `blendos` (BlendOS)
|
- `athenaos` (Athena OS)
|
||||||
- `bodhi` (Bodhi)
|
- `batocera` (Batocera)
|
||||||
- `bunsenlabs` (Bunsenlabs)
|
- `bazzite` (Bazzite)
|
||||||
- `cachyos` (CachyOS)
|
- `biglinux` (BigLinux)
|
||||||
- `centos-stream` (CentOS Stream)
|
- `blendos` (BlendOS)
|
||||||
- `debian` (Debian)
|
- `bodhi` (Bodhi)
|
||||||
- `deepin` (Deepin)
|
- `bunsenlabs` (BunsenLabs)
|
||||||
- `devuan` (Devuan)
|
- `cachyos` (CachyOS)
|
||||||
- `dragonflybsd` (DragonFlyBSD)
|
- `centos-stream` (CentOS Stream)
|
||||||
- `elementary` (elementary OS)
|
- `chimeralinux` (Chimera Linux)
|
||||||
- `endeavouros` (EndeavourOS)
|
- `crunchbang++` (Crunchbangplusplus)
|
||||||
- `endless` (Endless OS)
|
- `debian` (Debian)
|
||||||
- `fedora` (Fedora)
|
- `deepin` (Deepin)
|
||||||
- `freebsd` (FreeBSD)
|
- `devuan` (Devuan)
|
||||||
- `freedos` (FreeDOS)
|
- `dragonflybsd` (DragonFlyBSD)
|
||||||
- `garuda` (Garuda Linux)
|
- `easyos` (EasyOS)
|
||||||
- `gentoo` (Gentoo)
|
- `elementary` (elementary OS)
|
||||||
- `ghostbsd` (GhostBSD)
|
- `endeavouros` (EndeavourOS)
|
||||||
- `haiku` (Haiku)
|
- `endless` (Endless OS)
|
||||||
- `holoiso` (SteamOS HoloISO)
|
- `fedora` (Fedora)
|
||||||
- `kali` (Kali)
|
- `freebsd` (FreeBSD)
|
||||||
- `kdeneon` (KDE Neon)
|
- `freedos` (FreeDOS)
|
||||||
- `kolibrios` (KolibriOS)
|
- `garuda` (Garuda Linux)
|
||||||
- `linuxlite` (Linux Lite)
|
- `gentoo` (Gentoo)
|
||||||
- `linuxmint` (Linux Mint)
|
- `ghostbsd` (GhostBSD)
|
||||||
- `lmde` (Linux Mint Debian Edition)
|
- `gnomeos` (GNOME OS)
|
||||||
- `mageia` (Mageia)
|
- `guix` (Guix)
|
||||||
- `manjaro` (Manjaro)
|
- `haiku` (Haiku)
|
||||||
- `mxlinux` (MX Linux)
|
- `holoiso` (HoloISO)
|
||||||
- `netboot` (netboot.xyz)
|
- `kali` (Kali)
|
||||||
- `netbsd` (NetBSD)
|
- `kdeneon` (KDE Neon)
|
||||||
- `nixos` (NixOS)
|
- `kolibrios` (KolibriOS)
|
||||||
- `openbsd` (OpenBSD)
|
- `linuxlite` (Linux Lite)
|
||||||
- `openindiana` (OpenIndiana)
|
- `linuxmint` (Linux Mint)
|
||||||
- `opensuse` (openSUSE)
|
- `lmde` (Linux Mint Debian Edition)
|
||||||
- `oraclelinux` (Oracle Linux)
|
- `maboxlinux` (Mabox Linux)
|
||||||
- `peppermint` (PeppermintOS)
|
- `mageia` (Mageia)
|
||||||
- `popos` (Pop!\_OS)
|
- `manjaro` (Manjaro)
|
||||||
- `porteus` (Porteus)
|
- `mxlinux` (MX Linux)
|
||||||
- `reactos` (ReactOS)
|
- `netboot` (netboot.xyz)
|
||||||
- `rebornos` (RebornOS)
|
- `netbsd` (NetBSD)
|
||||||
- `rockylinux` (Rocky Linux)
|
- `nitrux` (Nitrux)
|
||||||
- `siduction` (Siduction)
|
- `nixos` (NixOS)
|
||||||
- `slackware` (Slackware)
|
- `nwg-shell` (nwg-shell)
|
||||||
- `solus` (Solus)
|
- `openbsd` (OpenBSD)
|
||||||
- `spiral` (Spiral)
|
- `openindiana` (OpenIndiana)
|
||||||
- `tails` (Tails)
|
- `opensuse` (openSUSE)
|
||||||
- `tinycore` (Tiny Core Linux)
|
- `oraclelinux` (Oracle Linux)
|
||||||
- `trisquel` (Trisquel)
|
- `parrotsec` (Parrot Security)
|
||||||
- `truenas-core` (TrueNAS Core)
|
- `peppermint` (PeppermintOS)
|
||||||
- `truenas-scale` (TrueNAS Scale)
|
- `popos` (Pop!\_OS)
|
||||||
- `vanillaos` (Vanilla OS)
|
- `porteus` (Porteus)
|
||||||
- `void` (Void Linux)
|
- `primtux` (PrimTux)
|
||||||
- `vxlinux` (VX Linux)
|
- `proxmox-ve` (Proxmox VE)
|
||||||
- `xerolinux` (XeroLinux)
|
- `pureos` (PureOS)
|
||||||
- `zorin` (Zorin OS)
|
- `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
|
Or you can download a Linux image and manually create a VM
|
||||||
configuration.
|
configuration.
|
||||||
|
|
||||||
- Download a .iso image of a Linux distribution
|
- Download a .iso image of a Linux distribution
|
||||||
- Create a VM configuration file; for example `debian-bullseye.conf`
|
- Create a VM configuration file; for example `debian-bullseye.conf`
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
guest_os="linux"
|
guest_os="linux"
|
||||||
disk_img="debian-bullseye/disk.qcow2"
|
disk_img="debian-bullseye/disk.qcow2"
|
||||||
iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
|
iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
|
||||||
```
|
```
|
||||||
|
|
||||||
- Use `quickemu` to start the virtual machine:
|
- Use `quickemu` to start the virtual machine:
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
quickemu --vm debian-bullseye.conf
|
quickemu --vm debian-bullseye.conf
|
||||||
```
|
```
|
||||||
|
|
||||||
- Complete the installation as normal.
|
- Complete the installation as normal.
|
||||||
- Post-install:
|
- Post-install:
|
||||||
- Install the SPICE agent (`spice-vdagent`) in the guest to enable
|
- Install the SPICE agent (`spice-vdagent`) in the guest to enable
|
||||||
copy/paste and USB redirection.
|
copy/paste and USB redirection.
|
||||||
- Install the SPICE WebDAV agent (`spice-webdavd`) in the guest to
|
- Install the SPICE WebDAV agent (`spice-webdavd`) in the guest to
|
||||||
enable file sharing.
|
enable file sharing.
|
||||||
|
|
||||||
## macOS Guest
|
## Supporting old Linux distros
|
||||||
|
|
||||||
|
If you want to run an old Linux , from 2016 or earlier, change the
|
||||||
|
`guest_os` to `linux_old`. This will enable the `vmware-svga` graphics
|
||||||
|
driver which is better supported on older distros.
|
||||||
|
|
||||||
|
## [Creating macOS Guests](https://github.com/quickemu-project/quickemu/wiki/03-Create-macOS-virtual-machines#automatically-create-macos-guests) 🍏
|
||||||
|
|
||||||
|
**Installing macOS in a VM can be a bit finicky, if you encounter
|
||||||
|
problems, [check the
|
||||||
|
Discussions](https://github.com/quickemu-project/quickemu/discussions)
|
||||||
|
for solutions or ask for help there** 🛟
|
||||||
|
|
||||||
`quickget` automatically downloads a macOS recovery image and creates a
|
`quickget` automatically downloads a macOS recovery image and creates a
|
||||||
virtual machine configuration.
|
virtual machine configuration.
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
quickget macos catalina
|
quickget macos big-sur
|
||||||
quickemu --vm macos-catalina.conf
|
quickemu --vm macos-big-sur.conf
|
||||||
```
|
```
|
||||||
|
|
||||||
macOS `high-sierra`, `mojave`, `catalina`, `big-sur`, `monterey` and
|
macOS `mojave`, `catalina`, `big-sur`, `monterey`, `ventura` and
|
||||||
`ventura` are supported.
|
`sonoma` are supported.
|
||||||
|
|
||||||
- Use cursor keys and enter key to select the **macOS Base System**
|
- Use cursor keys and enter key to select the **macOS Base System**
|
||||||
- From **macOS Utilities**
|
- From **macOS Utilities**
|
||||||
- Click **Disk Utility** and **Continue**
|
- Click **Disk Utility** and **Continue**
|
||||||
- Select `QEMU HARDDISK Media` (\~103.08GB) from the list (on
|
- Select `QEMU HARDDISK Media` (~103.08GB) from the list (on Big Sur
|
||||||
Big Sur and above use `Apple Inc. VirtIO Block Device`) and
|
and above use `Apple Inc. VirtIO Block Device`) and click
|
||||||
click **Erase**.
|
**Erase**.
|
||||||
- Enter a `Name:` for the disk
|
- Enter a `Name:` for the disk
|
||||||
- If you are installing macOS Mojave or later (Catalina, Big
|
- If you are installing macOS Mojave or later (Catalina, Big Sur,
|
||||||
Sur, Monterey and Ventura), choose any of the APFS options
|
Monterey, Ventura and Sonoma), choose any of the APFS options as
|
||||||
as the filesystem. MacOS Extended may not work.
|
the filesystem. MacOS Extended may not work.
|
||||||
- Click **Erase**.
|
- Click **Erase**.
|
||||||
- Click **Done**.
|
- Click **Done**.
|
||||||
- Close Disk Utility
|
- Close Disk Utility
|
||||||
- From **macOS Utilities**
|
- From **macOS Utilities**
|
||||||
- Click **Reinstall macOS** and **Continue**
|
- Click **Reinstall macOS** and **Continue**
|
||||||
- Complete the installation as you normally would.
|
- Complete the installation as you normally would.
|
||||||
- On the first reboot use cursor keys and enter key to select
|
- On the first reboot use cursor keys and enter key to select **macOS
|
||||||
**macOS Installer**
|
Installer**
|
||||||
- On the subsequent reboots use cursor keys and enter key to
|
- On the subsequent reboots use cursor keys and enter key to select
|
||||||
select the disk you named
|
the disk you named
|
||||||
- Once you have finished installing macOS you will be presented with
|
- Once you have finished installing macOS you will be presented with an
|
||||||
an the out-of-the-box first-start wizard to configure various
|
the out-of-the-box first-start wizard to configure various options and
|
||||||
options and set up your username and password
|
set up your username and password
|
||||||
- OPTIONAL: After you have concluded the out-of-the-box wizard, you
|
- OPTIONAL: After you have concluded the out-of-the-box wizard, you may
|
||||||
may want to enable the TRIM feature that the computer industry
|
want to enable the TRIM feature that the computer industry created for
|
||||||
created for SSD disks. This feature in our macOS installation will
|
SSD disks. This feature in our macOS installation will allow QuickEmu
|
||||||
allow QuickEmu to compact (shrink) your macOS disk image whenever
|
to compact (shrink) your macOS disk image whenever you delete files
|
||||||
you delete files inside the Virtual Machine. Without this step your
|
inside the Virtual Machine. Without this step your macOS disk image
|
||||||
macOS disk image will only ever get larger and will not shrink even
|
will only ever get larger and will not shrink even when you delete
|
||||||
when you delete lots of data inside macOS.
|
lots of data inside macOS.
|
||||||
- To enable TRIM, open the Terminal application and type the
|
- To enable TRIM, open the Terminal application and type the following
|
||||||
following command followed by pressing
|
command followed by pressing <kbd>enter</kbd> to tell macos to use
|
||||||
`<kbd>`{=html}enter`</kbd>`{=html} to tell macos to use the TRIM
|
the TRIM command on the hard disk when files are deleted:
|
||||||
command on the hard disk when files are deleted:
|
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
sudo trimforce enable
|
sudo trimforce enable
|
||||||
```
|
```
|
||||||
|
|
||||||
You will be prompted to enter your account's password to gain the
|
You will be prompted to enter your account's password to gain the
|
||||||
privilege needed. Once you've entered your password and pressed
|
privilege needed. Once you've entered your password and pressed
|
||||||
`<kbd>`{=html}enter`</kbd>`{=html} the command will request confirmation
|
<kbd>enter</kbd> the command will request confirmation in the form of
|
||||||
in the form of two questions that require you to type
|
two questions that require you to type <kbd>y</kbd> (for a "yes"
|
||||||
`<kbd>`{=html}y`</kbd>`{=html} (for a "yes" response) followed by
|
response) followed by <kbd>enter</kbd> to confirm.
|
||||||
`<kbd>`{=html}enter`</kbd>`{=html} to confirm. If you press
|
|
||||||
`<kbd>`{=html}enter`</kbd>`{=html} without first typing
|
If you press <kbd>enter</kbd> without first typing <kbd>y</kbd> the
|
||||||
`<kbd>`{=html}y`</kbd>`{=html} the system will consider that a negative
|
system will consider that a negative response as though you said "no":
|
||||||
response as though you said "no":
|
|
||||||
|
|
||||||
``` plain
|
``` plain
|
||||||
IMPORTANT NOTICE: This tool force-enables TRIM for all relevant attached devices, even though such devices may not have been validated for data integrity while using TRIM. Use of this tool to enable TRIM may result in unintended data loss or data corruption. It should not be used in a commercial operating environment or with important data. Before using this tool, you should back up all of your data and regularly back up data while TRIM is enabled. This tool is provided on an "as is" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THIS TOOL OR ITS USE ALONE OR IN COMBINATION WITH YOUR DEVICES, SYSTEMS, OR SERVICES. BY USING THIS TOOL TO ENABLE TRIM, YOU AGREE THAT, TO THE EXTENT PERMITTED BY APPLICABLE LAW, USE OF THE TOOL IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU.
|
IMPORTANT NOTICE: This tool force-enables TRIM for all relevant attached devices, even though such devices may not have been validated for data integrity while using TRIM. Use of this tool to enable TRIM may result in unintended data loss or data corruption. It should not be used in a commercial operating environment or with important data. Before using this tool, you should back up all of your data and regularly back up data while TRIM is enabled. This tool is provided on an "as is" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THIS TOOL OR ITS USE ALONE OR IN COMBINATION WITH YOUR DEVICES, SYSTEMS, OR SERVICES. BY USING THIS TOOL TO ENABLE TRIM, YOU AGREE THAT, TO THE EXTENT PERMITTED BY APPLICABLE LAW, USE OF THE TOOL IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU.
|
||||||
|
@ -285,64 +360,64 @@ soon as the command completes.
|
||||||
|
|
||||||
The default macOS configuration looks like this:
|
The default macOS configuration looks like this:
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
guest_os="macos"
|
guest_os="macos"
|
||||||
img="macos-catalina/RecoveryImage.img"
|
img="macos- big-sur/RecoveryImage.img"
|
||||||
disk_img="macos-catalina/disk.qcow2"
|
disk_img="macos- big-sur/disk.qcow2"
|
||||||
macos_release="catalina"
|
macos_release=" big-sur"
|
||||||
```
|
```
|
||||||
|
|
||||||
- `guest_os="macos"` instructs Quickemu to optimise for macOS.
|
- `guest_os="macos"` instructs Quickemu to optimise for macOS.
|
||||||
- `macos_release="catalina"` instructs Quickemu to optimise for a
|
- `macos_release=" big-sur"` instructs Quickemu to optimise for a
|
||||||
particular macOS release.
|
particular macOS release.
|
||||||
- For example VirtIO Network and Memory Ballooning are available
|
- For example VirtIO Network and Memory Ballooning are available in
|
||||||
in Big Sur and newer, but not previous releases.
|
Big Sur and newer, but not previous releases.
|
||||||
- And VirtIO Block Media (disks) are supported/stable in Catalina
|
- And VirtIO Block Media (disks) are supported/stable in Catalina and
|
||||||
and newer.
|
newer.
|
||||||
|
|
||||||
### macOS compatibility
|
# macOS compatibility
|
||||||
|
|
||||||
There are some considerations when running macOS via Quickemu.
|
There are some considerations when running macOS via Quickemu.
|
||||||
|
|
||||||
- Supported macOS releases:
|
- Supported macOS releases:
|
||||||
- High Sierra
|
- Mojave
|
||||||
- Mojave
|
- Catalina
|
||||||
- Catalina **(Recommended)**
|
- Big Sur
|
||||||
- Big Sur
|
- Monterey
|
||||||
- Monterey
|
- Ventura
|
||||||
- Ventura
|
- Sonoma
|
||||||
- `quickemu` will automatically download the required
|
- `quickemu` will automatically download the required
|
||||||
[OpenCore](https://github.com/acidanthera/OpenCorePkg) bootloader
|
[OpenCore](https://github.com/acidanthera/OpenCorePkg) bootloader and
|
||||||
and OVMF firmware from [OSX-KVM](https://github.com/kholia/OSX-KVM).
|
OVMF firmware from [OSX-KVM](https://github.com/kholia/OSX-KVM).
|
||||||
- Optimised by default, but no GPU acceleration is available.
|
- Optimised by default, but no GPU acceleration is available.
|
||||||
- Host CPU vendor is detected and guest CPU is optimised
|
- Host CPU vendor is detected and guest CPU is optimised accordingly.
|
||||||
accordingly.
|
- [VirtIO Block
|
||||||
- [VirtIO Block
|
Media](https://www.kraxel.org/blog/2019/06/macos-qemu-guest/) is
|
||||||
Media](https://www.kraxel.org/blog/2019/06/macos-qemu-guest/) is
|
used for the system disk where supported.
|
||||||
used for the system disk where supported.
|
- [VirtIO `usb-tablet`](http://philjordan.eu/osx-virt/) is used for
|
||||||
- [VirtIO `usb-tablet`](http://philjordan.eu/osx-virt/) is used
|
the mouse.
|
||||||
for the mouse.
|
- VirtIO Network (`virtio-net`) is supported and enabled on macOS Big
|
||||||
- VirtIO Network (`virtio-net`) is supported and enabled on macOS
|
Sur and newer, but earlier releases use `vmxnet3`.
|
||||||
Big Sur and newer but previous releases use `vmxnet3`.
|
- VirtIO Memory Ballooning is supported and enabled on macOS Big Sur
|
||||||
- VirtIO Memory Ballooning is supported and enabled on macOS Big
|
and newer but disabled for other support macOS releases.
|
||||||
Sur and newer but disabled for other support macOS releases.
|
- USB host and SPICE pass-through is:
|
||||||
- USB host and SPICE pass-through is:
|
- UHCI (USB 2.0) on macOS Catalina and earlier.
|
||||||
- UHCI (USB 2.0) on macOS Catalina and earlier.
|
- XHCI (USB 3.0) on macOS Big Sur and newer.
|
||||||
- XHCI (USB 3.0) on macOS Big Sur and newer.
|
- Display resolution can be changed via `quickemu` using `--width` and
|
||||||
- Display resolution can only be changed via macOS System Preferences.
|
`--height` command line arguments.
|
||||||
- **Full Duplex audio requires [VoodooHDA
|
- **Full Duplex audio requires [VoodooHDA
|
||||||
OC](https://github.com/chris1111/VoodooHDA-OC) or pass-through a USB
|
OC](https://github.com/chris1111/VoodooHDA-OC) or pass-through a USB
|
||||||
audio-device to the macOS guest VM**.
|
audio-device to the macOS guest VM**.
|
||||||
- NOTE! [Gatekeeper](https://disable-gatekeeper.github.io/) and
|
- NOTE! [Gatekeeper](https://disable-gatekeeper.github.io/) and
|
||||||
[System Integrity Protection
|
[System Integrity Protection
|
||||||
(SIP)](https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection)
|
(SIP)](https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection)
|
||||||
need to be disabled to install VoodooHDA OC
|
need to be disabled to install VoodooHDA OC
|
||||||
- File sharing between guest and host is available via
|
- File sharing between guest and host is available via
|
||||||
[virtio-9p](https://wiki.qemu.org/Documentation/9psetup) and [SPICE
|
[virtio-9p](https://wiki.qemu.org/Documentation/9psetup) and [SPICE
|
||||||
webdavd](https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24).
|
webdavd](https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24).
|
||||||
- Copy/paste via SPICE agent is **not available on macOS**.
|
- Copy/paste via SPICE agent is **not available on macOS**.
|
||||||
|
|
||||||
### macOS App Store
|
# macOS App Store
|
||||||
|
|
||||||
If you see *"Your device or computer could not be verified"* when you
|
If you see *"Your device or computer could not be verified"* when you
|
||||||
try to login to the App Store, make sure that your wired ethernet device
|
try to login to the App Store, make sure that your wired ethernet device
|
||||||
|
@ -352,51 +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
|
Preferences* -\> *Network*, delete all the network devices and apply the
|
||||||
changes. Next, open a terminal and run the following:
|
changes. Next, open a terminal and run the following:
|
||||||
|
|
||||||
``` bash
|
``` shell
|
||||||
sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
|
sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
|
||||||
```
|
```
|
||||||
|
|
||||||
Now reboot, and the App Store should work.
|
Now reboot, and the App Store should work.
|
||||||
|
|
||||||
## Windows 8, 10 & 11 Guests
|
There may be further advice and information about macOS guests in the
|
||||||
|
project
|
||||||
|
[wiki](https://github.com/quickemu-project/quickemu/wiki/03-Create-macOS-virtual-machines#automatically-create-macos-guests).
|
||||||
|
|
||||||
`quickget` can download
|
## [Creating Windows guests](https://github.com/quickemu-project/quickemu/wiki/04-Create-Windows-virtual-machines) 🪟
|
||||||
[Windows10](https://www.microsoft.com/software-download/windows10) and
|
|
||||||
[Windows 11](https://www.microsoft.com/software-download/windows11)
|
`quickget` can download [**Windows
|
||||||
|
10**](https://www.microsoft.com/software-download/windows10) and
|
||||||
|
[**Windows 11**](https://www.microsoft.com/software-download/windows11)
|
||||||
automatically and create an optimised virtual machine configuration.
|
automatically and create an optimised virtual machine configuration.
|
||||||
This configuration also includes the [VirtIO drivers for
|
This configuration also includes the [VirtIO drivers for
|
||||||
Windows](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/).
|
Windows](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/).
|
||||||
|
|
||||||
Windows 8.1 is also supported but doesn't feature any automated
|
**Windows 8.1** is also supported but doesn't feature any automated
|
||||||
installation or driver optimisation.
|
installation or driver optimisation.
|
||||||
|
|
||||||
``` bash
|
`quickget` can also download [Windows 10
|
||||||
|
LTSC](https://www.microsoft.com/en-us/evalcenter/download-windows-10-enterprise)
|
||||||
|
and Windows Server
|
||||||
|
[2012-r2](https://www.microsoft.com/en-us/evalcenter/download-windows-server-2012-r2),
|
||||||
|
[2016](https://www.microsoft.com/en-us/evalcenter/download-windows-server-2016),
|
||||||
|
[2019](https://www.microsoft.com/en-us/evalcenter/download-windows-server-2019),
|
||||||
|
and
|
||||||
|
[2022](https://www.microsoft.com/en-us/evalcenter/download-windows-server-2022).
|
||||||
|
No automated installation is supported for these releases.
|
||||||
|
|
||||||
|
``` shell
|
||||||
quickget windows 11
|
quickget windows 11
|
||||||
quickemu --vm windows-11.conf
|
quickemu --vm windows-11.conf
|
||||||
```
|
```
|
||||||
|
|
||||||
- Complete the installation as you normally would.
|
- Complete the installation as you normally would.
|
||||||
- All relevant drivers and services should be installed automatically.
|
- All relevant drivers and services should be installed automatically.
|
||||||
- A local administrator user account is automatically created, with
|
- A local administrator user account is automatically created, with
|
||||||
these credentials:
|
these credentials:
|
||||||
- Username: `Quickemu`
|
- Username: `Quickemu`
|
||||||
- Password: `quickemu`
|
- Password: `quickemu`
|
||||||
|
|
||||||
The default Windows 11 configuration looks like this:
|
Further information is available from the project
|
||||||
|
[wiki](https://github.com/quickemu-project/quickemu/wiki/04-Create-Windows-virtual-machines)
|
||||||
``` bash
|
|
||||||
guest_os="windows"
|
|
||||||
disk_img="windows-11/disk.qcow2"
|
|
||||||
iso="windows-11/windows-11.iso"
|
|
||||||
fixed_iso="windows-11/virtio-win.iso"
|
|
||||||
tpm="on"
|
|
||||||
secureboot="off"
|
|
||||||
```
|
|
||||||
|
|
||||||
- `guest_os="windows"` instructs `quickemu` to optimise for Windows.
|
|
||||||
- `fixed_iso=` specifies the ISO image that provides VirtIO drivers.
|
|
||||||
- `tpm="on"` instructs `quickemu` to create a software emulated TPM
|
|
||||||
device using `swtpm`.
|
|
||||||
|
|
||||||
# AUTHORS
|
# AUTHORS
|
||||||
|
|
||||||
|
@ -411,4 +487,4 @@ Submit bug reports online at:
|
||||||
|
|
||||||
Full sources at: <https://github.com/quickemu-project/quickemu>
|
Full sources at: <https://github.com/quickemu-project/quickemu>
|
||||||
|
|
||||||
quickemu(1), quickemu_conf(1), quickgui(1)
|
quickemu(1), quickemu_conf(5), quickgui(1)
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-schemas": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1721999734,
|
||||||
|
"narHash": "sha256-G5CxYeJVm4lcEtaO87LKzOsVnWeTcHGKbKxNamNWgOw=",
|
||||||
|
"rev": "0a5c42297d870156d9c57d8f99e476b738dcd982",
|
||||||
|
"revCount": 75,
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.1.5/0190ef2f-61e0-794b-ba14-e82f225e55e6/source.tar.gz"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://flakehub.com/f/DeterminateSystems/flake-schemas/%2A.tar.gz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1756217674,
|
||||||
|
"narHash": "sha256-TH1SfSP523QI7kcPiNtMAEuwZR3Jdz0MCDXPs7TS8uo=",
|
||||||
|
"rev": "4e7667a90c167f7a81d906e5a75cba4ad8bee620",
|
||||||
|
"revCount": 808864,
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2505.808864%2Brev-4e7667a90c167f7a81d906e5a75cba4ad8bee620/0198eaa3-105a-74fa-a9b2-0a930acea8de/source.tar.gz"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://flakehub.com/f/NixOS/nixpkgs/%2A.tar.gz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-schemas": "flake-schemas",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
{
|
||||||
|
description = "Quickemu flake";
|
||||||
|
inputs = {
|
||||||
|
flake-schemas.url = "https://flakehub.com/f/DeterminateSystems/flake-schemas/*.tar.gz";
|
||||||
|
nixpkgs.url = "https://flakehub.com/f/NixOS/nixpkgs/*.tar.gz";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = {
|
||||||
|
self,
|
||||||
|
flake-schemas,
|
||||||
|
nixpkgs,
|
||||||
|
}: let
|
||||||
|
# Define supported systems and a helper function for generating system-specific outputs
|
||||||
|
supportedSystems = [ "x86_64-linux" "x86_64-darwin" "aarch64-darwin" "aarch64-linux" ];
|
||||||
|
|
||||||
|
forEachSupportedSystem = f: nixpkgs.lib.genAttrs supportedSystems (system: f {
|
||||||
|
system = system;
|
||||||
|
pkgs = import nixpkgs { inherit system; };
|
||||||
|
});
|
||||||
|
in {
|
||||||
|
# Define schemas for the flake's outputs
|
||||||
|
schemas = flake-schemas.schemas;
|
||||||
|
|
||||||
|
# Define overlays for each supported system
|
||||||
|
overlays = {
|
||||||
|
default = final: prev: {
|
||||||
|
quickemu = final.callPackage ./package.nix { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Define packages for each supported system
|
||||||
|
packages = forEachSupportedSystem ({pkgs, system, ...}: rec {
|
||||||
|
quickemu = pkgs.callPackage ./package.nix { };
|
||||||
|
default = quickemu;
|
||||||
|
});
|
||||||
|
|
||||||
|
# Define devShells for each supported system
|
||||||
|
devShells = forEachSupportedSystem ({pkgs, system, ...}: {
|
||||||
|
default = pkgs.callPackage ./devshell.nix { };
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
518
macrecovery
518
macrecovery
|
@ -1,518 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
"""
|
|
||||||
Gather recovery information for Macs.
|
|
||||||
|
|
||||||
Copyright (c) 2019, vit9696
|
|
||||||
"""
|
|
||||||
|
|
||||||
from __future__ import print_function
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import binascii
|
|
||||||
import datetime
|
|
||||||
import hashlib
|
|
||||||
import json
|
|
||||||
import linecache
|
|
||||||
import os
|
|
||||||
import random
|
|
||||||
import struct
|
|
||||||
import sys
|
|
||||||
import textwrap
|
|
||||||
import time
|
|
||||||
|
|
||||||
try:
|
|
||||||
from urllib.request import Request,HTTPError,urlopen
|
|
||||||
from urllib.parse import urlencode,urlparse
|
|
||||||
except ImportError:
|
|
||||||
from urllib2 import Request,HTTPError,urlopen
|
|
||||||
from urllib import urlencode
|
|
||||||
from urlparse import urlparse
|
|
||||||
|
|
||||||
SELF_DIR = os.path.dirname(os.path.realpath(__file__))
|
|
||||||
|
|
||||||
RECENT_MAC = 'Mac-7BA5B2D9E42DDD94'
|
|
||||||
MLB_ZERO = '00000000000000000'
|
|
||||||
MLB_VALID = 'C02749200YGJ803AX'
|
|
||||||
MLB_PRODUCT = '00000000000J80300'
|
|
||||||
|
|
||||||
TYPE_SID = 16
|
|
||||||
TYPE_K = 64
|
|
||||||
TYPE_FG = 64
|
|
||||||
|
|
||||||
INFO_PRODUCT = 'AP'
|
|
||||||
INFO_IMAGE_LINK = 'AU'
|
|
||||||
INFO_IMAGE_HASH = 'AH'
|
|
||||||
INFO_IMAGE_SESS = 'AT'
|
|
||||||
INFO_SIGN_LINK = 'CU'
|
|
||||||
INFO_SIGN_HASH = 'CH'
|
|
||||||
INFO_SIGN_SESS = 'CT'
|
|
||||||
INFO_REQURED = [ INFO_PRODUCT, INFO_IMAGE_LINK, INFO_IMAGE_HASH, INFO_IMAGE_SESS,
|
|
||||||
INFO_SIGN_LINK, INFO_SIGN_HASH, INFO_SIGN_SESS ]
|
|
||||||
|
|
||||||
def run_query(url, headers, post=None, raw=False):
|
|
||||||
if post is not None:
|
|
||||||
data = '\n'.join([entry + '=' + post[entry] for entry in post])
|
|
||||||
if sys.version_info[0] >= 3:
|
|
||||||
data = data.encode('utf-8')
|
|
||||||
else:
|
|
||||||
data = None
|
|
||||||
|
|
||||||
req = Request(url=url, headers=headers, data=data)
|
|
||||||
try:
|
|
||||||
response = urlopen(req)
|
|
||||||
if raw: return response
|
|
||||||
return dict(response.info()), response.read()
|
|
||||||
except HTTPError as e:
|
|
||||||
print('ERROR: "{}" when connecting to {}'.format(e, url))
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
def generate_id(type, id=None):
|
|
||||||
valid_chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']
|
|
||||||
if id is None:
|
|
||||||
return ''.join(random.choice(valid_chars) for i in range(type))
|
|
||||||
return id
|
|
||||||
|
|
||||||
def product_mlb(mlb):
|
|
||||||
return '00000000000' + mlb[11] + mlb[12] + mlb[13] + mlb[14] + '00'
|
|
||||||
|
|
||||||
def mlb_from_eeee(eeee):
|
|
||||||
if len(eeee) != 4:
|
|
||||||
print('ERROR: Invalid EEEE code length!')
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
return '00000000000' + eeee + '00'
|
|
||||||
|
|
||||||
def int_from_unsigned_bytes(bytes, byteorder):
|
|
||||||
if byteorder == 'little': bytes = bytes[::-1]
|
|
||||||
encoded = binascii.hexlify(bytes)
|
|
||||||
return int(encoded, 16)
|
|
||||||
|
|
||||||
# zhangyoufu https://gist.github.com/MCJack123/943eaca762730ca4b7ae460b731b68e7#gistcomment-3061078 2021-10-08
|
|
||||||
Apple_EFI_ROM_public_key_1 = 0xC3E748CAD9CD384329E10E25A91E43E1A762FF529ADE578C935BDDF9B13F2179D4855E6FC89E9E29CA12517D17DFA1EDCE0BEBF0EA7B461FFE61D94E2BDF72C196F89ACD3536B644064014DAE25A15DB6BB0852ECBD120916318D1CCDEA3C84C92ED743FC176D0BACA920D3FCF3158AFF731F88CE0623182A8ED67E650515F75745909F07D415F55FC15A35654D118C55A462D37A3ACDA08612F3F3F6571761EFCCBCC299AEE99B3A4FD6212CCFFF5EF37A2C334E871191F7E1C31960E010A54E86FA3F62E6D6905E1CD57732410A3EB0C6B4DEFDABE9F59BF1618758C751CD56CEF851D1C0EAA1C558E37AC108DA9089863D20E2E7E4BF475EC66FE6B3EFDCF
|
|
||||||
|
|
||||||
ChunkListHeader = struct.Struct('<4sIBBBxQQQ')
|
|
||||||
assert ChunkListHeader.size == 0x24
|
|
||||||
|
|
||||||
Chunk = struct.Struct('<I32s')
|
|
||||||
assert Chunk.size == 0x24
|
|
||||||
|
|
||||||
def verify_chunklist(cnkpath):
|
|
||||||
with open(cnkpath, 'rb') as f:
|
|
||||||
hash_ctx = hashlib.sha256()
|
|
||||||
data = f.read(ChunkListHeader.size)
|
|
||||||
hash_ctx.update(data)
|
|
||||||
magic, header_size, file_version, chunk_method, signature_method, chunk_count, chunk_offset, signature_offset = ChunkListHeader.unpack(data)
|
|
||||||
assert magic == b'CNKL'
|
|
||||||
assert header_size == ChunkListHeader.size
|
|
||||||
assert file_version == 1
|
|
||||||
assert chunk_method == 1
|
|
||||||
assert signature_method in [1, 2]
|
|
||||||
assert chunk_count > 0
|
|
||||||
assert chunk_offset == 0x24
|
|
||||||
assert signature_offset == chunk_offset + Chunk.size * chunk_count
|
|
||||||
for i in range(chunk_count):
|
|
||||||
data = f.read(Chunk.size)
|
|
||||||
hash_ctx.update(data)
|
|
||||||
chunk_size, chunk_sha256 = Chunk.unpack(data)
|
|
||||||
yield chunk_size, chunk_sha256
|
|
||||||
digest = hash_ctx.digest()
|
|
||||||
if signature_method == 1:
|
|
||||||
data = f.read(256)
|
|
||||||
assert len(data) == 256
|
|
||||||
signature = int_from_unsigned_bytes(data, 'little')
|
|
||||||
plaintext = 0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003031300d0609608648016503040201050004200000000000000000000000000000000000000000000000000000000000000000 | int_from_unsigned_bytes(digest, 'big')
|
|
||||||
assert pow(signature, 0x10001, Apple_EFI_ROM_public_key_1) == plaintext
|
|
||||||
elif signature_method == 2:
|
|
||||||
data = f.read(32)
|
|
||||||
assert data == digest
|
|
||||||
raise RuntimeError('Chunklist missing digital signature')
|
|
||||||
else:
|
|
||||||
raise NotImplementedError
|
|
||||||
assert f.read(1) == b''
|
|
||||||
|
|
||||||
def get_session(args):
|
|
||||||
headers = {
|
|
||||||
'Host' : 'osrecovery.apple.com',
|
|
||||||
'Connection': 'close',
|
|
||||||
'User-Agent': 'InternetRecovery/1.0',
|
|
||||||
}
|
|
||||||
|
|
||||||
headers, output = run_query('http://osrecovery.apple.com/', headers)
|
|
||||||
|
|
||||||
if args.verbose:
|
|
||||||
print('Session headers:')
|
|
||||||
for header in headers:
|
|
||||||
print('{}: {}'.format(header, headers[header]))
|
|
||||||
|
|
||||||
for header in headers:
|
|
||||||
if header.lower() == 'set-cookie':
|
|
||||||
cookies = headers[header].split('; ')
|
|
||||||
for cookie in cookies:
|
|
||||||
if cookie.startswith('session='):
|
|
||||||
return cookie
|
|
||||||
|
|
||||||
raise RuntimeError('No session in headers ' + str(headers))
|
|
||||||
|
|
||||||
def get_image_info(session, bid, mlb=MLB_ZERO, diag = False, os_type = 'default', cid=None):
|
|
||||||
headers = {
|
|
||||||
'Host' : 'osrecovery.apple.com',
|
|
||||||
'Connection' : 'close',
|
|
||||||
'User-Agent' : 'InternetRecovery/1.0',
|
|
||||||
'Cookie' : session,
|
|
||||||
'Content-Type': 'text/plain',
|
|
||||||
}
|
|
||||||
|
|
||||||
post = {
|
|
||||||
'cid': generate_id(TYPE_SID, cid),
|
|
||||||
'sn' : mlb,
|
|
||||||
'bid': bid,
|
|
||||||
'k' : generate_id(TYPE_K),
|
|
||||||
'fg' : generate_id(TYPE_FG)
|
|
||||||
}
|
|
||||||
|
|
||||||
if diag:
|
|
||||||
url = 'http://osrecovery.apple.com/InstallationPayload/Diagnostics'
|
|
||||||
else:
|
|
||||||
url = 'http://osrecovery.apple.com/InstallationPayload/RecoveryImage'
|
|
||||||
post['os'] = os_type
|
|
||||||
|
|
||||||
headers, output = run_query(url, headers, post)
|
|
||||||
|
|
||||||
if sys.version_info[0] >= 3:
|
|
||||||
output = output.decode('utf-8')
|
|
||||||
|
|
||||||
info = {}
|
|
||||||
for line in output.split('\n'):
|
|
||||||
try:
|
|
||||||
key, value = line.split(': ')
|
|
||||||
info[key] = value
|
|
||||||
except:
|
|
||||||
continue
|
|
||||||
|
|
||||||
for k in INFO_REQURED:
|
|
||||||
if k not in info:
|
|
||||||
raise RuntimeError('Missing key ' + k)
|
|
||||||
|
|
||||||
return info
|
|
||||||
|
|
||||||
def save_image(url, sess, filename='', dir=''):
|
|
||||||
purl = urlparse(url)
|
|
||||||
headers = {
|
|
||||||
'Host' : purl.hostname,
|
|
||||||
'Connection': 'close',
|
|
||||||
'User-Agent': 'InternetRecovery/1.0',
|
|
||||||
'Cookie' : '='.join(['AssetToken', sess])
|
|
||||||
}
|
|
||||||
|
|
||||||
if filename == '':
|
|
||||||
filename = os.path.basename(purl.path)
|
|
||||||
if filename.find('/') >= 0 or filename == '':
|
|
||||||
raise RuntimeError('Invalid save path ' + filename)
|
|
||||||
|
|
||||||
print('Saving ' + url + ' to ' + filename + '...')
|
|
||||||
|
|
||||||
with open (os.path.join(dir, filename), 'wb') as fh:
|
|
||||||
response = run_query(url, headers, raw=True)
|
|
||||||
size = 0
|
|
||||||
while True:
|
|
||||||
chunk = response.read(2**20)
|
|
||||||
if not chunk:
|
|
||||||
break
|
|
||||||
fh.write(chunk)
|
|
||||||
size += len(chunk)
|
|
||||||
print('\r{} MBs downloaded...'.format(size / (2**20)), end='')
|
|
||||||
sys.stdout.flush()
|
|
||||||
print('\rDownload complete!')
|
|
||||||
|
|
||||||
return os.path.join(dir, os.path.basename(filename))
|
|
||||||
|
|
||||||
def verify_image(dmgpath, cnkpath):
|
|
||||||
print('Verifying image with chunklist...')
|
|
||||||
|
|
||||||
with open (dmgpath, 'rb') as dmgf:
|
|
||||||
cnkcount = 0
|
|
||||||
for cnksize, cnkhash in verify_chunklist(cnkpath):
|
|
||||||
cnkcount += 1
|
|
||||||
print('\rChunk {} ({} bytes)'.format(cnkcount, cnksize), end='')
|
|
||||||
sys.stdout.flush()
|
|
||||||
cnk = dmgf.read(cnksize)
|
|
||||||
if len(cnk) != cnksize:
|
|
||||||
raise RuntimeError('Invalid chunk {} size: expected {}, read {}'.format(cnkcount, cnksize, len(cnk)))
|
|
||||||
if hashlib.sha256(cnk).digest() != cnkhash:
|
|
||||||
raise RuntimeError('Invalid chunk {}: hash mismatch'.format(cnkcount))
|
|
||||||
if dmgf.read(1) != b'':
|
|
||||||
raise RuntimeError('Invalid image: larger than chunklist')
|
|
||||||
print('\rImage verification complete!')
|
|
||||||
|
|
||||||
def action_download(args):
|
|
||||||
"""
|
|
||||||
Reference information for queries:
|
|
||||||
|
|
||||||
Recovery latest:
|
|
||||||
cid=3076CE439155BA14
|
|
||||||
sn=...
|
|
||||||
bid=Mac-E43C1C25D4880AD6
|
|
||||||
k=4BE523BB136EB12B1758C70DB43BDD485EBCB6A457854245F9E9FF0587FB790C
|
|
||||||
os=latest
|
|
||||||
fg=B2E6AA07DB9088BE5BDB38DB2EA824FDDFB6C3AC5272203B32D89F9D8E3528DC
|
|
||||||
|
|
||||||
Recovery default:
|
|
||||||
cid=4A35CB95FF396EE7
|
|
||||||
sn=...
|
|
||||||
bid=Mac-E43C1C25D4880AD6
|
|
||||||
k=0A385E6FFC3DDD990A8A1F4EC8B98C92CA5E19C9FF1DD26508C54936D8523121
|
|
||||||
os=default
|
|
||||||
fg=B2E6AA07DB9088BE5BDB38DB2EA824FDDFB6C3AC5272203B32D89F9D8E3528DC
|
|
||||||
|
|
||||||
Diagnostics:
|
|
||||||
cid=050C59B51497CEC8
|
|
||||||
sn=...
|
|
||||||
bid=Mac-E43C1C25D4880AD6
|
|
||||||
k=37D42A8282FE04A12A7D946304F403E56A2155B9622B385F3EB959A2FBAB8C93
|
|
||||||
fg=B2E6AA07DB9088BE5BDB38DB2EA824FDDFB6C3AC5272203B32D89F9D8E3528DC
|
|
||||||
"""
|
|
||||||
|
|
||||||
session = get_session(args)
|
|
||||||
info = get_image_info(session, bid=args.board_id, mlb=args.mlb,
|
|
||||||
diag=args.diagnostics, os_type=args.os_type)
|
|
||||||
if args.verbose:
|
|
||||||
print(info)
|
|
||||||
print('Downloading ' + info[INFO_PRODUCT] + '...')
|
|
||||||
dmgname = '' if args.basename == '' else args.basename + '.dmg'
|
|
||||||
dmgpath = save_image(info[INFO_IMAGE_LINK], info[INFO_IMAGE_SESS], dmgname, args.outdir)
|
|
||||||
cnkname = '' if args.basename == '' else args.basename + '.chunklist'
|
|
||||||
cnkpath = save_image(info[INFO_SIGN_LINK], info[INFO_SIGN_SESS], cnkname, args.outdir)
|
|
||||||
try:
|
|
||||||
verify_image(dmgpath, cnkpath)
|
|
||||||
return 0
|
|
||||||
except Exception as err:
|
|
||||||
if isinstance(err, AssertionError) and str(err)=='':
|
|
||||||
try:
|
|
||||||
tb = sys.exc_info()[2]
|
|
||||||
while tb.tb_next:
|
|
||||||
tb = tb.tb_next
|
|
||||||
err = linecache.getline(tb.tb_frame.f_code.co_filename, tb.tb_lineno, tb.tb_frame.f_globals).strip()
|
|
||||||
except:
|
|
||||||
err = "Invalid chunklist"
|
|
||||||
print('\rImage verification failed. ({})'.format(err))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
def action_selfcheck(args):
|
|
||||||
"""
|
|
||||||
Sanity check server logic for recovery:
|
|
||||||
|
|
||||||
if not valid(bid):
|
|
||||||
return error()
|
|
||||||
ppp = get_ppp(sn)
|
|
||||||
if not valid(ppp):
|
|
||||||
return latest_recovery(bid = bid) # Returns newest for bid.
|
|
||||||
if valid(sn):
|
|
||||||
if os == 'default':
|
|
||||||
return default_recovery(sn = sn, ppp = ppp) # Returns oldest for sn.
|
|
||||||
else:
|
|
||||||
return latest_recovery(sn = sn, ppp = ppp) # Returns newest for sn.
|
|
||||||
return default_recovery(ppp = ppp) # Returns oldest.
|
|
||||||
"""
|
|
||||||
|
|
||||||
session = get_session(args)
|
|
||||||
valid_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_VALID,
|
|
||||||
diag=False, os_type='default')
|
|
||||||
valid_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_VALID,
|
|
||||||
diag=False, os_type='latest')
|
|
||||||
product_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_PRODUCT,
|
|
||||||
diag=False, os_type='default')
|
|
||||||
product_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_PRODUCT,
|
|
||||||
diag=False, os_type='latest')
|
|
||||||
generic_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
|
|
||||||
diag=False, os_type='default')
|
|
||||||
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
|
|
||||||
diag=False, os_type='latest')
|
|
||||||
|
|
||||||
if args.verbose:
|
|
||||||
print(valid_default)
|
|
||||||
print(valid_latest)
|
|
||||||
print(product_default)
|
|
||||||
print(product_latest)
|
|
||||||
print(generic_default)
|
|
||||||
print(generic_latest)
|
|
||||||
|
|
||||||
if valid_default[INFO_PRODUCT] == valid_latest[INFO_PRODUCT]:
|
|
||||||
# Valid MLB must give different default and latest if this is not a too new product.
|
|
||||||
print('ERROR: Cannot determine any previous product, got {}'.format(valid_default[INFO_PRODUCT]))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
if product_default[INFO_PRODUCT] != product_latest[INFO_PRODUCT]:
|
|
||||||
# Product-only MLB must give the same value for default and latest.
|
|
||||||
print('ERROR: Latest and default do not match for product MLB, got {} and {}'.format(
|
|
||||||
product_default[INFO_PRODUCT], product_latest[INFO_PRODUCT]))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
if generic_default[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
|
|
||||||
# Zero MLB always give the same value for default and latest.
|
|
||||||
print('ERROR: Generic MLB gives different product, got {} and {}'.format(
|
|
||||||
generic_default[INFO_PRODUCT], generic_latest[INFO_PRODUCT]))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
if valid_latest[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
|
|
||||||
# Valid MLB must always equal generic MLB.
|
|
||||||
print('ERROR: Cannot determine unified latest product, got {} and {}'.format(
|
|
||||||
valid_latest[INFO_PRODUCT], generic_latest[INFO_PRODUCT]))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
if product_default[INFO_PRODUCT] != valid_default[INFO_PRODUCT]:
|
|
||||||
# Product-only MLB can give the same value with valid default MLB.
|
|
||||||
# This is not an error for all models, but for our chosen code it is.
|
|
||||||
print('ERROR: Valid and product MLB give mismatch, got {} and {}'.format(
|
|
||||||
product_default[INFO_PRODUCT], valid_default[INFO_PRODUCT]))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
print('SUCCESS: Found no discrepancies with MLB validation algorithm!')
|
|
||||||
return 0
|
|
||||||
|
|
||||||
def action_verify(args):
|
|
||||||
"""
|
|
||||||
Try to verify MLB serial number.
|
|
||||||
"""
|
|
||||||
session = get_session(args)
|
|
||||||
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
|
|
||||||
diag=False, os_type='latest')
|
|
||||||
uvalid_default = get_image_info(session, bid=args.board_id, mlb=args.mlb,
|
|
||||||
diag=False, os_type='default')
|
|
||||||
uvalid_latest = get_image_info(session, bid=args.board_id, mlb=args.mlb,
|
|
||||||
diag=False, os_type='latest')
|
|
||||||
uproduct_default = get_image_info(session, bid=args.board_id, mlb=product_mlb(args.mlb),
|
|
||||||
diag=False, os_type='default')
|
|
||||||
|
|
||||||
if args.verbose:
|
|
||||||
print(generic_latest)
|
|
||||||
print(uvalid_default)
|
|
||||||
print(uvalid_latest)
|
|
||||||
print(uproduct_default)
|
|
||||||
|
|
||||||
# Verify our MLB number.
|
|
||||||
if uvalid_default[INFO_PRODUCT] != uvalid_latest[INFO_PRODUCT]:
|
|
||||||
if uvalid_latest[INFO_PRODUCT] == generic_latest[INFO_PRODUCT]:
|
|
||||||
print('SUCCESS: {} MLB looks valid and supported!'.format(args.mlb))
|
|
||||||
else:
|
|
||||||
print('SUCCESS: {} MLB looks valid, but probably unsupported!'.format(args.mlb))
|
|
||||||
return 0
|
|
||||||
|
|
||||||
print('UNKNOWN: Run selfcheck, check your board-id, or try again later!')
|
|
||||||
|
|
||||||
# Here we have matching default and latest products. This can only be true for very
|
|
||||||
# new models. These models get either latest or special builds.
|
|
||||||
if uvalid_default[INFO_PRODUCT] == generic_latest[INFO_PRODUCT]:
|
|
||||||
print('UNKNOWN: {} MLB can be valid if very new!'.format(args.mlb))
|
|
||||||
return 0
|
|
||||||
if uproduct_default[INFO_PRODUCT] != uvalid_default[INFO_PRODUCT]:
|
|
||||||
print('UNKNOWN: {} MLB looks invalid, other models use product {} instead of {}!'.format(
|
|
||||||
args.mlb, uproduct_default[INFO_PRODUCT], uvalid_default[INFO_PRODUCT]))
|
|
||||||
return 0
|
|
||||||
print('UNKNOWN: {} MLB can be valid if very new and using special builds!'.format(args.mlb))
|
|
||||||
return 0
|
|
||||||
|
|
||||||
def action_guess(args):
|
|
||||||
"""
|
|
||||||
Attempt to guess which model does this MLB belong.
|
|
||||||
"""
|
|
||||||
|
|
||||||
mlb = args.mlb
|
|
||||||
anon = mlb.startswith('000')
|
|
||||||
|
|
||||||
with open(args.board_db, 'r') as fh:
|
|
||||||
db = json.load(fh)
|
|
||||||
|
|
||||||
supported = {}
|
|
||||||
|
|
||||||
session = get_session(args)
|
|
||||||
|
|
||||||
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
|
|
||||||
diag=False, os_type='latest')
|
|
||||||
|
|
||||||
for model in db:
|
|
||||||
try:
|
|
||||||
if anon:
|
|
||||||
# For anonymous lookup check when given model does not match latest.
|
|
||||||
model_latest = get_image_info(session, bid=model, mlb=MLB_ZERO,
|
|
||||||
diag=False, os_type='latest')
|
|
||||||
|
|
||||||
if model_latest[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
|
|
||||||
if db[model] == 'current':
|
|
||||||
print('WARN: Skipped {} due to using latest product {} instead of {}'.format(
|
|
||||||
model, model_latest[INFO_PRODUCT], generic_latest[INFO_PRODUCT]))
|
|
||||||
continue
|
|
||||||
|
|
||||||
user_default = get_image_info(session, bid=model, mlb=mlb,
|
|
||||||
diag=False, os_type='default')
|
|
||||||
|
|
||||||
if user_default[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
|
|
||||||
supported[model] = [db[model], user_default[INFO_PRODUCT], generic_latest[INFO_PRODUCT]]
|
|
||||||
else:
|
|
||||||
# For normal lookup check when given model has mismatching normal and latest.
|
|
||||||
user_latest = get_image_info(session, bid=model, mlb=mlb,
|
|
||||||
diag=False, os_type='latest')
|
|
||||||
|
|
||||||
user_default = get_image_info(session, bid=model, mlb=mlb,
|
|
||||||
diag=False, os_type='default')
|
|
||||||
|
|
||||||
if user_latest[INFO_PRODUCT] != user_default[INFO_PRODUCT]:
|
|
||||||
supported[model] = [db[model], user_default[INFO_PRODUCT], user_latest[INFO_PRODUCT]]
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print('WARN: Failed to check {}, exception: {}'.format(model, str(e)))
|
|
||||||
|
|
||||||
if len(supported) > 0:
|
|
||||||
print('SUCCESS: MLB {} looks supported for:'.format(mlb))
|
|
||||||
for model in supported:
|
|
||||||
print('- {}, up to {}, default: {}, latest: {}'.format(model, supported[model][0],
|
|
||||||
supported[model][1], supported[model][2]))
|
|
||||||
return 0
|
|
||||||
|
|
||||||
print('UNKNOWN: Failed to determine supported models for MLB {}!'.format(mlb))
|
|
||||||
|
|
||||||
def main():
|
|
||||||
parser = argparse.ArgumentParser(description='Gather recovery information for Macs')
|
|
||||||
parser.add_argument('action', choices = ['download', 'selfcheck', 'verify', 'guess'],
|
|
||||||
help='Action to perform: "download" - performs recovery downloading,'
|
|
||||||
' "selfcheck" checks whether MLB serial validation is possible, "verify" performs'
|
|
||||||
' MLB serial verification, "guess" tries to find suitable mac model for MLB.')
|
|
||||||
parser.add_argument('-o', '--outdir', type=str, default=os.getcwd(),
|
|
||||||
help='customise output directory for downloading, defaults to current directory')
|
|
||||||
parser.add_argument('-n', '--basename', type=str, default='',
|
|
||||||
help='customise base name for downloading, defaults to remote name')
|
|
||||||
parser.add_argument('-b', '--board-id', type=str, default=RECENT_MAC,
|
|
||||||
help='use specified board identifier for downloading, defaults to ' + RECENT_MAC)
|
|
||||||
parser.add_argument('-m', '--mlb', type=str, default=MLB_ZERO,
|
|
||||||
help='use specified logic board serial for downloading, defaults to ' + MLB_ZERO)
|
|
||||||
parser.add_argument('-e', '--code', type=str, default='',
|
|
||||||
help='generate product logic board serial with specified product EEEE code')
|
|
||||||
parser.add_argument('-os', '--os-type', type=str, default='default', choices = ['default', 'latest'],
|
|
||||||
help='use specified os type, defaults to default ' + MLB_ZERO)
|
|
||||||
parser.add_argument('-diag', '--diagnostics', action='store_true', help='download diagnostics image')
|
|
||||||
parser.add_argument('-v', '--verbose', action='store_true', help='print debug information')
|
|
||||||
parser.add_argument('-db', '--board-db', type=str, default=os.path.join(SELF_DIR, 'boards.json'),
|
|
||||||
help='use custom board list for checking, defaults to boards.json')
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
if args.code != '':
|
|
||||||
args.mlb = mlb_from_eeee(args.code)
|
|
||||||
|
|
||||||
if len(args.mlb) != 17:
|
|
||||||
print('ERROR: Cannot use MLBs in non 17 character format!')
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
if args.action == 'download':
|
|
||||||
return action_download(args)
|
|
||||||
elif args.action == 'selfcheck':
|
|
||||||
return action_selfcheck(args)
|
|
||||||
elif args.action == 'verify':
|
|
||||||
return action_verify(args)
|
|
||||||
elif args.action == 'guess':
|
|
||||||
return action_guess(args)
|
|
||||||
else:
|
|
||||||
assert(False)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.exit(main())
|
|
|
@ -0,0 +1,107 @@
|
||||||
|
{ lib
|
||||||
|
, fetchFromGitHub
|
||||||
|
, installShellFiles
|
||||||
|
, makeWrapper
|
||||||
|
, stdenv
|
||||||
|
, testers
|
||||||
|
, cdrtools
|
||||||
|
, curl
|
||||||
|
, gawk
|
||||||
|
, glxinfo
|
||||||
|
, gnugrep
|
||||||
|
, gnused
|
||||||
|
, jq
|
||||||
|
, pciutils
|
||||||
|
, procps
|
||||||
|
, python3
|
||||||
|
, qemu_full
|
||||||
|
, samba
|
||||||
|
, socat
|
||||||
|
, spice-gtk
|
||||||
|
, swtpm
|
||||||
|
, unzip
|
||||||
|
, usbutils
|
||||||
|
, util-linux
|
||||||
|
, xdg-user-dirs
|
||||||
|
, xrandr
|
||||||
|
, zsync
|
||||||
|
, OVMF
|
||||||
|
, OVMFFull
|
||||||
|
, quickemu
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
runtimePaths = [
|
||||||
|
cdrtools
|
||||||
|
curl
|
||||||
|
gawk
|
||||||
|
gnugrep
|
||||||
|
gnused
|
||||||
|
jq
|
||||||
|
pciutils
|
||||||
|
procps
|
||||||
|
python3
|
||||||
|
qemu_full
|
||||||
|
samba
|
||||||
|
socat
|
||||||
|
swtpm
|
||||||
|
unzip
|
||||||
|
util-linux
|
||||||
|
xrandr
|
||||||
|
zsync
|
||||||
|
OVMF
|
||||||
|
OVMFFull
|
||||||
|
] ++ lib.optionals stdenv.isLinux [
|
||||||
|
glxinfo
|
||||||
|
usbutils
|
||||||
|
xdg-user-dirs
|
||||||
|
];
|
||||||
|
versionMatches =
|
||||||
|
builtins.match ''
|
||||||
|
.*
|
||||||
|
readonly[[:blank:]]VERSION="([[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+)"
|
||||||
|
.*
|
||||||
|
'' (builtins.readFile ./quickemu);
|
||||||
|
in
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
pname = "quickemu";
|
||||||
|
version = builtins.concatStringsSep "" versionMatches;
|
||||||
|
src = lib.cleanSource ./.;
|
||||||
|
|
||||||
|
postPatch = ''
|
||||||
|
sed -i \
|
||||||
|
-e '/OVMF_CODE_4M.secboot.fd/s|ovmfs=(|ovmfs=("${OVMFFull.firmware}","${OVMFFull.variables}" |' \
|
||||||
|
-e '/OVMF_CODE_4M.fd/s|ovmfs=(|ovmfs=("${OVMF.firmware}","${OVMF.variables}" |' \
|
||||||
|
-e '/cp "''${VARS_IN}" "''${VARS_OUT}"/a chmod +w "''${VARS_OUT}"' \
|
||||||
|
-e 's,\$(command -v smbd),${samba}/bin/smbd,' \
|
||||||
|
quickemu
|
||||||
|
'';
|
||||||
|
|
||||||
|
nativeBuildInputs = [ makeWrapper installShellFiles ];
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
runHook preInstall
|
||||||
|
|
||||||
|
installManPage docs/quickget.1 docs/quickemu.1 docs/quickemu_conf.5
|
||||||
|
install -Dm755 -t "$out/bin" chunkcheck quickemu quickget quickreport
|
||||||
|
|
||||||
|
# spice-gtk needs to be put in suffix so that when virtualisation.spiceUSBRedirection
|
||||||
|
# is enabled, the wrapped spice-client-glib-usb-acl-helper is used
|
||||||
|
for f in chunkcheck quickget quickemu quickreport; do
|
||||||
|
wrapProgram $out/bin/$f \
|
||||||
|
--prefix PATH : "${lib.makeBinPath runtimePaths}" \
|
||||||
|
--suffix PATH : "${lib.makeBinPath [ spice-gtk ]}"
|
||||||
|
done
|
||||||
|
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru.tests = testers.testVersion { package = quickemu; };
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "Quickly create and run optimised Windows, macOS and Linux virtual machines";
|
||||||
|
homepage = "https://github.com/quickemu-project/quickemu";
|
||||||
|
mainProgram = "quickemu";
|
||||||
|
license = lib.licenses.mit;
|
||||||
|
maintainers = with lib.maintainers; [ fedx-sudo flexiondotorg ];
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,121 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
quick_report() {
|
||||||
|
local GPUS
|
||||||
|
local OS_KERNEL
|
||||||
|
local PRETTY_NAME
|
||||||
|
local QUICKEMU
|
||||||
|
local VERSION
|
||||||
|
OS_KERNEL=$(uname -s)
|
||||||
|
|
||||||
|
if [ "${OS_KERNEL}" == "Darwin" ]; then
|
||||||
|
# Get macOS product name and version using swvers
|
||||||
|
if [ -x "$(command -v sw_vers)" ]; then
|
||||||
|
PRETTY_NAME="$(sw_vers -productName) $(sw_vers -productVersion)"
|
||||||
|
else
|
||||||
|
PRETTY_NAME="macOS"
|
||||||
|
fi
|
||||||
|
elif [ -e /etc/os-release ]; then
|
||||||
|
PRETTY_NAME=$(grep PRETTY_NAME /etc/os-release | cut -d'"' -f2)
|
||||||
|
else
|
||||||
|
PRETTY_NAME="Unknown OS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
CWD="$(dirname "${0}")"
|
||||||
|
if [ -x "${CWD}/quickemu" ]; then
|
||||||
|
QUICKEMU="${CWD}/quickemu"
|
||||||
|
elif [ -x "$(command -v quickemu)" ]; then
|
||||||
|
QUICKEMU="$(command -v quickemu)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "${QUICKEMU}" ]; then
|
||||||
|
VERSION=$(${QUICKEMU} --version)
|
||||||
|
echo \
|
||||||
|
"----------------------------------
|
||||||
|
Quickemu ${VERSION}
|
||||||
|
----------------------------------"
|
||||||
|
echo -e "Distro:\t${PRETTY_NAME}"
|
||||||
|
echo -e "Kernel:\t$(uname -s -r -m)"
|
||||||
|
|
||||||
|
if [ "${OS_KERNEL}" == "Darwin" ]; then
|
||||||
|
echo -e "Memory:\t$(($(sysctl -n hw.memsize) / (1048576*1024)))G"
|
||||||
|
else
|
||||||
|
# Determine the number of gigabytes of RAM in the host by extracting the first numerical value from the output.
|
||||||
|
echo -e "Memory:\t$(free --giga -h | tr ' ' '\n' | grep -m 1 "[0-9]" | cut -d'G' -f 1)G"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Break IFS on new line
|
||||||
|
IFS=$'\n'
|
||||||
|
if [ "${OS_KERNEL}" == "Darwin" ]; then
|
||||||
|
# Get GPU information using system_profiler
|
||||||
|
GPUS=$(system_profiler SPDisplaysDataType | grep "Chipset Model" | awk -F: '{print $2}' | sed 's/^ *//')
|
||||||
|
else
|
||||||
|
GPUS=$(lspci | grep -i vga | cut -d':' -f3)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$(echo "${GPUS}" | wc -l)" -eq 1 ]; then
|
||||||
|
echo "GPU:"
|
||||||
|
else
|
||||||
|
echo "GPUs:"
|
||||||
|
fi
|
||||||
|
for GPU in ${GPUS}; do
|
||||||
|
echo " -${GPU}"
|
||||||
|
done
|
||||||
|
else
|
||||||
|
echo \
|
||||||
|
"----------------------------------
|
||||||
|
Quickemu missing!
|
||||||
|
----------------------------------"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command -v curl &> /dev/null; then
|
||||||
|
VERSION=$(curl --version)
|
||||||
|
echo \
|
||||||
|
"----------------------------------
|
||||||
|
curl $(echo "${VERSION}" | head -n 1 | cut -d' ' -f2)
|
||||||
|
----------------------------------"
|
||||||
|
echo -e "Libraries:$(echo "${VERSION}" | head -n 1 | cut -d')' -f2-)"
|
||||||
|
echo -e "Protocols:$(echo "${VERSION}" | tail -n +3 | head -n 1 | cut -d':' -f2-)"
|
||||||
|
echo -e "Features: $(echo "${VERSION}" | tail -n +4 | head -n 1 | cut -d':' -f2-)"
|
||||||
|
else
|
||||||
|
echo \
|
||||||
|
"----------------------------------
|
||||||
|
curl missing
|
||||||
|
----------------------------------"
|
||||||
|
fi
|
||||||
|
|
||||||
|
local HOST_ARCH
|
||||||
|
HOST_ARCH=$(uname -m)
|
||||||
|
local QEMU_ARCH="${HOST_ARCH}"
|
||||||
|
if [ "${HOST_ARCH}" == "arm64" ]; then
|
||||||
|
QEMU_ARCH="aarch64"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command -v "qemu-system-${QEMU_ARCH}" &> /dev/null; then
|
||||||
|
VERSION=$("qemu-system-${QEMU_ARCH}" --version | head -n 1 | cut -d' ' -f4)
|
||||||
|
echo \
|
||||||
|
"----------------------------------
|
||||||
|
QEMU ${VERSION}
|
||||||
|
----------------------------------"
|
||||||
|
"qemu-system-${QEMU_ARCH}" -cpu help
|
||||||
|
else
|
||||||
|
echo \
|
||||||
|
"----------------------------------
|
||||||
|
QEMU missing
|
||||||
|
----------------------------------"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo \
|
||||||
|
"----------------------------------
|
||||||
|
CPU
|
||||||
|
----------------------------------"
|
||||||
|
if [ "${OS_KERNEL}" == "Darwin" ]; then
|
||||||
|
sysctl -n machdep.cpu.brand_string
|
||||||
|
else
|
||||||
|
lscpu
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
clear
|
||||||
|
quick_report | tee quickreport.txt
|
85
windowskey
85
windowskey
|
@ -1,85 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
|
|
||||||
import html.parser
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import urllib.request
|
|
||||||
|
|
||||||
|
|
||||||
"""
|
|
||||||
Download Windows product keys from MicroSoft
|
|
||||||
"""
|
|
||||||
|
|
||||||
key_page_url = "https://docs.microsoft.com/en-us/windows-server/get-started/kms-client-activation-keys"
|
|
||||||
|
|
||||||
|
|
||||||
def usage():
|
|
||||||
script = os.path.basename(sys.argv[0])
|
|
||||||
message = f"""Usage: {script} [windows-version]
|
|
||||||
|
|
||||||
To specify the version of Windows you'd like, pass a string that matches the
|
|
||||||
name of the operating system you'd like to download. Case doesn't matter, so
|
|
||||||
you can use "windows 10" or "Windows 10".
|
|
||||||
|
|
||||||
e.g.
|
|
||||||
|
|
||||||
{script} "Windows 10"
|
|
||||||
{script} "enterprise"
|
|
||||||
|
|
||||||
"""
|
|
||||||
print(message, file=sys.stderr)
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
|
|
||||||
def download_page(url):
|
|
||||||
response = urllib.request.urlopen(url)
|
|
||||||
return response.read().decode("utf-8")
|
|
||||||
|
|
||||||
|
|
||||||
class WindowsKeyPageParser(html.parser.HTMLParser):
|
|
||||||
def __init__(self, *, convert_charrefs=True):
|
|
||||||
super().__init__(convert_charrefs=True)
|
|
||||||
self.product_keys = {}
|
|
||||||
self.parsing_os = False
|
|
||||||
|
|
||||||
def handle_starttag(self, tag, attrs):
|
|
||||||
self.parsing_os = tag == "td"
|
|
||||||
|
|
||||||
def handle_endtag(self, tag):
|
|
||||||
self.parsing_os = False
|
|
||||||
|
|
||||||
def handle_data(self, data):
|
|
||||||
if self.parsing_os:
|
|
||||||
self.stash_table_cell(data)
|
|
||||||
|
|
||||||
def stash_table_cell(self, data):
|
|
||||||
if "Windows" in data:
|
|
||||||
self.current_os = data
|
|
||||||
else:
|
|
||||||
product_key = data
|
|
||||||
self.product_keys[self.current_os] = product_key
|
|
||||||
|
|
||||||
|
|
||||||
def find_keys_for_all_versions(markup):
|
|
||||||
parser = WindowsKeyPageParser()
|
|
||||||
parser.feed(markup)
|
|
||||||
return parser.product_keys
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
try:
|
|
||||||
arg = sys.argv[1]
|
|
||||||
except IndexError:
|
|
||||||
windows_version = ""
|
|
||||||
else:
|
|
||||||
if arg in ["-h", "--help"]:
|
|
||||||
usage()
|
|
||||||
windows_version = arg
|
|
||||||
|
|
||||||
markup = download_page(key_page_url)
|
|
||||||
product_keys = find_keys_for_all_versions(markup)
|
|
||||||
|
|
||||||
for os_name, product_key in product_keys.items():
|
|
||||||
if windows_version.lower() in os_name.lower():
|
|
||||||
print(f"{os_name}: {product_key}")
|
|
Loading…
Reference in New Issue