Merge branch 'master' of github.com:AlexSSD7/linsk
This commit is contained in:
commit
85971eab7c
17 changed files with 214 additions and 66 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -2,3 +2,4 @@ linsk
|
||||||
linsk.exe
|
linsk.exe
|
||||||
*.qcow2
|
*.qcow2
|
||||||
bin/
|
bin/
|
||||||
|
build/
|
||||||
15
CONTRIBUTING.md
Normal file
15
CONTRIBUTING.md
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
Thank you for showing your interest in contributing! Contributions are the most welcome. Anything including small fixes is greatly appreciated.
|
||||||
|
|
||||||
|
Please keep your new code consistent with the existing codebase and follow the industry's best practices. Before committing, please make sure that your code passes the linting & security scanning suite.
|
||||||
|
|
||||||
|
To install linting tools, execute the following commands:
|
||||||
|
```sh
|
||||||
|
make lint-deps
|
||||||
|
make security-check-deps
|
||||||
|
```
|
||||||
|
|
||||||
|
After that, you will be able to run the linter and the security scanning tool.
|
||||||
|
```sh
|
||||||
|
make lint
|
||||||
|
make security-check
|
||||||
|
```
|
||||||
|
|
@ -33,11 +33,11 @@ After that, you should be able to run `linsk`, or `~/go/bin/linsk` if you have n
|
||||||
|
|
||||||
## Package managers
|
## Package managers
|
||||||
|
|
||||||
//TODO.
|
TODO.
|
||||||
|
|
||||||
## Prebuilt binaries
|
## Prebuilt binaries
|
||||||
|
|
||||||
//TODO.
|
You can find prebuilt binaries in [Linsk GitHub Releases](https://github.com/AlexSSD7/linsk/releases).
|
||||||
|
|
||||||
## Build from Source
|
## Build from Source
|
||||||
Clone the repository using `git` and run `go build` to build the Linsk binary.
|
Clone the repository using `git` and run `go build` to build the Linsk binary.
|
||||||
|
|
|
||||||
|
|
@ -42,11 +42,11 @@ After that, you should be able to run `linsk`, or `%USERPROFILE%\go\bin\linsk.ex
|
||||||
|
|
||||||
## Package managers
|
## Package managers
|
||||||
|
|
||||||
//TODO.
|
TODO.
|
||||||
|
|
||||||
## Prebuilt binaries
|
## Prebuilt binaries
|
||||||
|
|
||||||
//TODO.
|
You can find prebuilt binaries in [Linsk GitHub Releases](https://github.com/AlexSSD7/linsk/releases).
|
||||||
|
|
||||||
## Build from Source
|
## Build from Source
|
||||||
Clone the repository using `git` and run `go build` to build the Linsk binary.
|
Clone the repository using `git` and run `go build` to build the Linsk binary.
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ Yes, you read that right. For development purposes, Linsk remains 100% supported
|
||||||
|
|
||||||
## QEMU
|
## QEMU
|
||||||
|
|
||||||
On Ubuntu (and probably on any other Debian-based distro) you can install the required `qemu-system-$(arch)` binary by running the following:
|
On Ubuntu (and probably on any other Debian-based distro), you can install the required `qemu-system-$(arch)` binary by running the following:
|
||||||
```sh
|
```sh
|
||||||
apt install qemu-system
|
apt install qemu-system
|
||||||
```
|
```
|
||||||
|
|
@ -27,7 +27,3 @@ go build
|
||||||
```
|
```
|
||||||
|
|
||||||
After that is done, you will be able to find the `linsk` binary in the same directory you ran `go build` in.
|
After that is done, you will be able to find the `linsk` binary in the same directory you ran `go build` in.
|
||||||
|
|
||||||
# The next steps
|
|
||||||
|
|
||||||
That's it. You can follow the further usage instructions set in TODO just like with any other OS.
|
|
||||||
54
README.md
54
README.md
|
|
@ -1,54 +1,52 @@
|
||||||
# Linsk
|
# Linsk
|
||||||
|
|
||||||
Linsk is a utility that allows you to access Linux-native file system infrastructure, including LVM and LUKS on Windows and macOS. Unlike other solutions created to access Linux filesystems on unsupported operating systems, Linsk does not reimplement any file system. Instead, Linsk utilizes a lightweight Alpine Linux VM (~130 MB only) combined with network share technologies like SMB, AFP, and FTP.
|
<a href="https://t.me/linsk_foss"><img src="https://badgen.net/static/chat/telegram/229ED9"/></a>
|
||||||
|
|
||||||
|
**Linsk** is a utility that allows you to access Linux-native file system infrastructure, including LVM and LUKS on Windows and macOS. Unlike other solutions created to access Linux filesystems on unsupported operating systems, Linsk does not reimplement any file system. Instead, Linsk utilizes a lightweight Alpine Linux VM (~130 MB only) combined with network share technologies like SMB, AFP, and FTP.
|
||||||
|
|
||||||
Because Linsk uses a native Linux VM, there are no limitations on what you can access. Anything that works on Linux will work under Linsk too (hence the Linux+Disk name).
|
Because Linsk uses a native Linux VM, there are no limitations on what you can access. Anything that works on Linux will work under Linsk too (hence the Linux+Disk name).
|
||||||
|
|
||||||
<!-- TODO: Telegram chat -->
|
To show your thanks, please star this repository if you found it useful.
|
||||||
|
|
||||||
# Supported platforms
|

|
||||||
|
|
||||||
|
# 💻 Supported platforms
|
||||||
|
|
||||||
## CPU architectures
|
## CPU architectures
|
||||||
Linsk natively supports both amd64 (aka x86_64, Intel, AMD, etc.) and arm64 (aka aarch64, Apple M1/M2, and others). Although Linsk uses a virtual machine, CPU is never emulated but hardware accelerators like HVF (macOS), WHPX (Windows), and KVM (Linux) are used.
|
Linsk natively supports both **x86_64** (aka amd64, Intel, AMD, etc.) and **aarch64** (aka arm64, Apple M1/M2, and others).
|
||||||
|
|
||||||
|
Although Linsk uses a virtual machine, the CPU is never emulated but the hardware accelerators like HVF (macOS), WHPX (Windows), and KVM (Linux) are used.
|
||||||
|
|
||||||
## Operating systems
|
## Operating systems
|
||||||
|
|
||||||
* Windows
|
* **Windows**
|
||||||
* macOS
|
* **macOS**
|
||||||
* Linux (for development purposes, mostly)
|
* **Linux** (for development purposes, mostly)
|
||||||
|
|
||||||
## Network file share backends
|
## Network file share backends
|
||||||
|
|
||||||
Linsk relies on network file shares to expose files to the host machine. Below are the types of network shares Linsk supports:
|
Linsk relies on network file shares to expose files to the host machine. Below are the types of network shares Linsk supports:
|
||||||
|
|
||||||
* SMB - The default for Windows.
|
* **SMB** - The default for Windows.
|
||||||
* AFP - The default for macOS.
|
* **AFP** - The default for macOS.
|
||||||
* FTP - An alternative backend.
|
* **FTP** - An alternative backend.
|
||||||
|
|
||||||
# Installation
|
# 💿 Installation
|
||||||
//TODO
|
|
||||||
|
|
||||||
# Contributing
|
- **Windows** - See [INSTALL_WINDOWS.md](INSTALL_WINDOWS.md).
|
||||||
|
- **macOS** - See [INSTALL_MACOS.md](INSTALL_MACOS.md).
|
||||||
|
- **Linux** - Refer to [LINUX_DEV_ENV.md](LINUX_DEV_ENV.md).
|
||||||
|
|
||||||
//TODO: Make it a separate .md file.
|
# 🔧 Usage
|
||||||
|
|
||||||
Contributions are the most welcome. Anything including small fixes is greatly appreciated.
|
- **Windows** - See [USAGE_WINDOWS.md](USAGE_WINDOWS.md).
|
||||||
|
- **macOS** - See [USAGE_MACOS.md](USAGE_MACOS.md).
|
||||||
|
|
||||||
Please keep your new code consistent with the existing and follow the best practices writing Go code. Before committing, please make sure that your code passes the linting & security scanning suite.
|
# 👨💻 Contributing
|
||||||
|
|
||||||
To install linting tools, execute the following commands:
|
Please see [CONTRIBUTING.md](CONTRIBUTING.md).
|
||||||
```sh
|
|
||||||
make lint-deps
|
|
||||||
make security-check-deps
|
|
||||||
```
|
|
||||||
|
|
||||||
After that, you will be able to run the linter and the security scanning tool.
|
# ©️ Copyright and License
|
||||||
```sh
|
|
||||||
make lint
|
|
||||||
make security-check
|
|
||||||
```
|
|
||||||
|
|
||||||
# Copyright and License
|
|
||||||
|
|
||||||
Copyright (c) 2023 The Linsk Authors.
|
Copyright (c) 2023 The Linsk Authors.
|
||||||
|
|
||||||
|
|
|
||||||
13
SHELL.md
Normal file
13
SHELL.md
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
# Linsk shell
|
||||||
|
|
||||||
|
`linsk shell` will start a VM and open a full-fledged Linux shell for you. Linsk will not mount nor configure any file server.
|
||||||
|
|
||||||
|
Linsk's VM runs Alpine Linux, a lightweight busybox-based Linux distribution. Upon the startup, you will find little to no preinstalled tools. This is intentional as the goal is to have the lightest VM possible. There is no default text editor preinstalled either. However, Linsk's Alpine Linux is supplied with `apk` package manager. You can use it to install packages of any kind. An installation of `vim`, for example, would mean running `apk add vim`.
|
||||||
|
|
||||||
|
Linsk's shell can be used to format disks with tools like `mkfs` and run diagnostics with tools like `fsck`. Please note that you will need to install these separately using Alpine Linux's `apk` package manager. The other important purpose of Linsk's shell is to assist with troubleshooting.
|
||||||
|
|
||||||
|
# Access the shell within `linsk run`
|
||||||
|
|
||||||
|
In addition to `linsk shell` that can be used to help investigate disk-related issues, Linsk also provides a `--debug-shell` CLI flag for the `run` command. Unlike `linsk shell` , `linsk run --debug-shell` will start the shell *after* starting a network share. This is useful for investigating file share issues.
|
||||||
|
|
||||||
|
Please note that by default, networking is restricted when `linsk run --debug-shell` is run. You will need to add `--vm-unrestricted-networking` flag in order to be able to access the outside network, which is commonly needed to install packages with `apk`.
|
||||||
21
TROUBLESHOOTING.md
Normal file
21
TROUBLESHOOTING.md
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
# Linsk troubleshooting tools
|
||||||
|
|
||||||
|
To aid with debugging/troubleshooting, Linsk is bundled with a few tools aimed to give you access to the virtual machine's internals.
|
||||||
|
|
||||||
|
### Error messages
|
||||||
|
|
||||||
|
By far, error messages is the single most helpful tool to help with problems of any kind. Before referring to anything, please analyze the errors and logs in detail.
|
||||||
|
|
||||||
|
**A great effort was put into ensuring that errors in Linsk are self-contained and provide enough information to understand what went wrong.** Please use them to your advantage.
|
||||||
|
|
||||||
|
### Shell
|
||||||
|
|
||||||
|
Linsk's shell is a powerful tool to assist with investigating issues inside the VM. Please refer to [SHELL.md](SHELL.md).
|
||||||
|
|
||||||
|
### `--vm-debug` flag
|
||||||
|
|
||||||
|
This flag is applicable in any `linsk` subcommand that starts a VM. Provided `--vm-debug`, Linsk will not start QEMU in headless mode and instead open a window with the virtual machine's display. **This is useful for investigating boot issues.**
|
||||||
|
|
||||||
|
# Common issues
|
||||||
|
|
||||||
|
TBD.
|
||||||
|
|
@ -5,7 +5,7 @@ In this document, you will find instructions on how to get started using Linsk o
|
||||||
# How Linsk works
|
# How Linsk works
|
||||||
As you probably have realized from the initial README, Linsk takes use of a lightweight Alpine Linux virtual machine to tap into the rich world of Linux filesystems.
|
As you probably have realized from the initial README, Linsk takes use of a lightweight Alpine Linux virtual machine to tap into the rich world of Linux filesystems.
|
||||||
|
|
||||||
Linsk will pass through the disk as a raw block device to an ephemeral virtual machine, set up a file share and then expose it to your host computer, along with logging the file share connection details. It's as simple as that.
|
Linsk will pass through the disk as a raw block device to an ephemeral virtual machine, set up a file share, and then expose it to your host computer, along with logging the file share connection details. It's as simple as that.
|
||||||
|
|
||||||
# Use Linsk
|
# Use Linsk
|
||||||
|
|
||||||
|
|
@ -34,7 +34,7 @@ time=2023-09-03T10:33:31.718+01:00 level=INFO msg="Removed base image" caller=st
|
||||||
time=2023-09-03T10:33:31.718+01:00 level=INFO msg="VM image built successfully" path=/Users/Alex/.linsk/3.18.3-x86_64-linsk1.qcow2
|
time=2023-09-03T10:33:31.718+01:00 level=INFO msg="VM image built successfully" path=/Users/Alex/.linsk/3.18.3-x86_64-linsk1.qcow2
|
||||||
```
|
```
|
||||||
|
|
||||||
**NOTE:** Building a VM image requires internet connection. After the initial image build is done, you can use Linsk offline.
|
**NOTE:** Building a VM image requires an internet connection. After the initial image build is done, you can use Linsk offline.
|
||||||
|
|
||||||
## Step 1. Select the drive you want to pass through
|
## Step 1. Select the drive you want to pass through
|
||||||
|
|
||||||
|
|
@ -43,7 +43,9 @@ Find the `/dev/` path of the drive you want to pass through by executing the fol
|
||||||
diskutil list
|
diskutil list
|
||||||
```
|
```
|
||||||
|
|
||||||
Find your disk, and take a note of the disk path that looks like `/dev/diskX` (where X is a number). We will need this in the next step.
|
Find your disk, and take note of the disk path that looks like `/dev/diskX` (where X is a number). We will need this in the next step.
|
||||||
|
|
||||||
|
**IMPORTANT NOTE:** Please ensure that the physical device you are trying to pass through is not mounted anywhere else on the host machine. Otherwise, you run serious risks. No further warnings will be issued.
|
||||||
|
|
||||||
## Step 2. Use `linsk ls` to see what partitions are available in the VM
|
## Step 2. Use `linsk ls` to see what partitions are available in the VM
|
||||||
|
|
||||||
|
|
@ -105,9 +107,9 @@ sudo linsk run dev:/dev/diskX vdb2 ext4
|
||||||
```
|
```
|
||||||
|
|
||||||
Explanation of the command above:
|
Explanation of the command above:
|
||||||
- `dev:dev/diskX` - Tell Linsk to pass through the drive path you obtained from the step 1.
|
- `dev:dev/diskX` - Tell Linsk to pass through the drive path you obtained from step 1.
|
||||||
- `vdb2` - Tell Linsk to mount `/dev/vdb2` inside the filesystem. This was gathered from from the step 2.
|
- `vdb2` - Tell Linsk to mount `/dev/vdb2` inside the filesystem. This was gathered from step 2.
|
||||||
- `ext4` - Tell Linsk to use the Ext4 file system. As with the `vdb2`, this was acquired from the step 2. **NOTE:** Specifying the file system is **REQUIRED**—you need to explicitly tell Linsk what filesystem you want to use.
|
- `ext4` - Tell Linsk to use the Ext4 file system. As with the `vdb2`, this was acquired from step 2. **NOTE:** Specifying the file system is **REQUIRED**—you need to explicitly tell Linsk what filesystem you want to use.
|
||||||
|
|
||||||
Upon running, you will see logs similar to this in your terminal:
|
Upon running, you will see logs similar to this in your terminal:
|
||||||
```
|
```
|
||||||
|
|
@ -129,7 +131,7 @@ Password: <random password>
|
||||||
===========================
|
===========================
|
||||||
```
|
```
|
||||||
|
|
||||||
At this point, you can start Finder, hit Command+K and put in the server URL copied from the output above, along with a static `linsk` username and a randomly-generated password. If you need help, you can find more information on this here: https://support.apple.com/guide/mac-help/mchlp1140/mac.
|
At this point, you can start Finder, hit Command+K and put in the server URL copied from the output above, along with a static `linsk` username and a randomly generated password. If you need help, you can find more information on this here: https://support.apple.com/guide/mac-help/mchlp1140/mac.
|
||||||
|
|
||||||
**That's it!** After that, you should see the network share mounted successfully. That means that you can now access the files on the `vdb2` Ext4 volume right from your Mac.
|
**That's it!** After that, you should see the network share mounted successfully. That means that you can now access the files on the `vdb2` Ext4 volume right from your Mac.
|
||||||
|
|
||||||
|
|
@ -137,7 +139,7 @@ The network share will remain open until you close Linsk, which you can do at an
|
||||||
|
|
||||||
# The advanced use of Linsk
|
# The advanced use of Linsk
|
||||||
|
|
||||||
The example provided above is just a mere preview of the endless power the Linsk's native Linux VM has.
|
The example provided above is just a mere preview of the endless power Linsk's native Linux VM has.
|
||||||
|
|
||||||
## Use LVM
|
## Use LVM
|
||||||
|
|
||||||
|
|
@ -179,6 +181,12 @@ Password: <random password>
|
||||||
|
|
||||||
This example showed how you can use LUKS with LVM2 volumes, but that doesn't mean that you can't use volumes without LVM. You can specify plain device paths like `vdb3` without any issue.
|
This example showed how you can use LUKS with LVM2 volumes, but that doesn't mean that you can't use volumes without LVM. You can specify plain device paths like `vdb3` without any issue.
|
||||||
|
|
||||||
# How to investigate in case something goes wrong
|
# FAQ
|
||||||
|
|
||||||
<!-- TODO: Include a link to a DEBUGGING.md file -->
|
### How do I format disks with Linsk?
|
||||||
|
|
||||||
|
Use `linsk shell`. Please see [SHELL.md](SHELL.md).
|
||||||
|
|
||||||
|
# Troubleshooting
|
||||||
|
|
||||||
|
Please refer to [TROUBLESHOOTING.md](TROUBLESHOOTING.md).
|
||||||
|
|
@ -5,7 +5,7 @@ In this document, you will find instructions on how to get started using Linsk o
|
||||||
# How Linsk works
|
# How Linsk works
|
||||||
As you probably have realized from the initial README, Linsk takes use of a lightweight Alpine Linux virtual machine to tap into the rich world of Linux filesystems.
|
As you probably have realized from the initial README, Linsk takes use of a lightweight Alpine Linux virtual machine to tap into the rich world of Linux filesystems.
|
||||||
|
|
||||||
Linsk will pass through the disk as a raw block device to an ephemeral virtual machine, set up a file share and then expose it to your host computer, along with logging the file share connection details. It's as simple as that.
|
Linsk will pass through the disk as a raw block device to an ephemeral virtual machine, set up a file share, and then expose it to your host computer, along with logging the file share connection details. It's as simple as that.
|
||||||
|
|
||||||
# Use Linsk
|
# Use Linsk
|
||||||
|
|
||||||
|
|
@ -34,7 +34,7 @@ time=2023-09-03T10:33:31.718+01:00 level=INFO msg="Removed base image" caller=st
|
||||||
time=2023-09-03T10:33:31.718+01:00 level=INFO msg="VM image built successfully" path=C:\Users\Alex\Linsk\3.18.3-x86_64-linsk1.qcow2
|
time=2023-09-03T10:33:31.718+01:00 level=INFO msg="VM image built successfully" path=C:\Users\Alex\Linsk\3.18.3-x86_64-linsk1.qcow2
|
||||||
```
|
```
|
||||||
|
|
||||||
**NOTE:** Building a VM image requires internet connection. After the initial image build is done, you can use Linsk offline.
|
**NOTE:** Building a VM image requires an internet connection. After the initial image build is done, you can use Linsk offline.
|
||||||
|
|
||||||
## Step 1. Select the drive you want to pass through
|
## Step 1. Select the drive you want to pass through
|
||||||
|
|
||||||
|
|
@ -43,7 +43,9 @@ Find the path of the physical drive you want to pass through by executing the fo
|
||||||
wmic diskdrive list brief
|
wmic diskdrive list brief
|
||||||
```
|
```
|
||||||
|
|
||||||
Find your disk, and take a note of the disk path that looks like `\\.\PhysicalDriveX` (where X is a number). We will need this in the next step.
|
Find your disk, and take note of the disk path that looks like `\\.\PhysicalDriveX` (where X is a number). We will need this in the next step.
|
||||||
|
|
||||||
|
**IMPORTANT NOTE:** Please ensure that the physical device you are trying to pass through is not mounted anywhere else on the host machine. Otherwise, you run serious risks. No further warnings will be issued.
|
||||||
|
|
||||||
## Step 2. Use `linsk ls` to see what partitions are available in the VM
|
## Step 2. Use `linsk ls` to see what partitions are available in the VM
|
||||||
|
|
||||||
|
|
@ -107,9 +109,9 @@ linsk run dev:\\.\PhysicalDriveX vdb2 ext4
|
||||||
```
|
```
|
||||||
|
|
||||||
Explanation of the command above:
|
Explanation of the command above:
|
||||||
- `dev:\\.\PhysicalDriveX` - Tell Linsk to pass through the drive path you obtained from the step 1.
|
- `dev:\\.\PhysicalDriveX` - Tell Linsk to pass through the drive path you obtained from step 1.
|
||||||
- `vdb2` - Tell Linsk to mount `/dev/vdb2` inside the filesystem. This was gathered from from the step 2.
|
- `vdb2` - Tell Linsk to mount `/dev/vdb2` inside the filesystem. This was gathered from step 2.
|
||||||
- `ext4` - Tell Linsk to use the Ext4 file system. As with the `vdb2`, this was acquired from the step 2. **NOTE:** Specifying the file system is **REQUIRED**—you need to explicitly tell Linsk what filesystem you want to use.
|
- `ext4` - Tell Linsk to use the Ext4 file system. As with the `vdb2`, this was acquired from step 2. **NOTE:** Specifying the file system is **REQUIRED**—you need to explicitly tell Linsk what filesystem you want to use.
|
||||||
|
|
||||||
Upon running, you will see logs similar to this in your terminal:
|
Upon running, you will see logs similar to this in your terminal:
|
||||||
```
|
```
|
||||||
|
|
@ -131,7 +133,7 @@ Password: <random password>
|
||||||
===========================
|
===========================
|
||||||
```
|
```
|
||||||
|
|
||||||
At this point, you can open the file explorer -> Right-click "This PC" -> Show more options (if you're on Windows 11) -> Map network drive. Afterward, you should specify the share URL (the one that starts with `\\`), the static `linsk` username, and a randomly-generated password.
|
At this point, you can open the file explorer -> Right-click "This PC" -> Show more options (if you're on Windows 11) -> Map network drive. Afterward, you should specify the share URL (the one that starts with `\\`), the static `linsk` username, and a randomly generated password.
|
||||||
|
|
||||||
**That's it!** After that, you should see the network share mounted successfully. That means that you can now access the files on the `vdb2` Ext4 volume right from your Mac.
|
**That's it!** After that, you should see the network share mounted successfully. That means that you can now access the files on the `vdb2` Ext4 volume right from your Mac.
|
||||||
|
|
||||||
|
|
@ -139,7 +141,7 @@ The network share will remain open until you close Linsk, which you can do at an
|
||||||
|
|
||||||
# The advanced use of Linsk
|
# The advanced use of Linsk
|
||||||
|
|
||||||
The example provided above is just a mere preview of the endless power the Linsk's native Linux VM has.
|
The example provided above is just a mere preview of the endless power Linsk's native Linux VM has.
|
||||||
|
|
||||||
## Use LVM
|
## Use LVM
|
||||||
|
|
||||||
|
|
@ -183,6 +185,12 @@ Password: <random password>
|
||||||
|
|
||||||
This example showed how you can use LUKS with LVM2 volumes, but that doesn't mean that you can't use volumes without LVM. You can specify plain device paths like `vdb3` without any issue.
|
This example showed how you can use LUKS with LVM2 volumes, but that doesn't mean that you can't use volumes without LVM. You can specify plain device paths like `vdb3` without any issue.
|
||||||
|
|
||||||
# How to investigate in case something goes wrong
|
# FAQ
|
||||||
|
|
||||||
<!-- TODO: Include a link to a DEBUGGING.md file -->
|
### How do I format disks with Linsk?
|
||||||
|
|
||||||
|
Use `linsk shell`. Please see [SHELL.md](SHELL.md).
|
||||||
|
|
||||||
|
# Troubleshooting
|
||||||
|
|
||||||
|
Please refer to [TROUBLESHOOTING.md](TROUBLESHOOTING.md).
|
||||||
BIN
assets/screenshot.png
Normal file
BIN
assets/screenshot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 479 KiB |
37
build-binaries.sh
Normal file
37
build-binaries.sh
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
rm -rf build
|
||||||
|
mkdir build
|
||||||
|
|
||||||
|
trimpath=$PWD
|
||||||
|
echo "Trimming path $trimpath"
|
||||||
|
|
||||||
|
version=$1
|
||||||
|
|
||||||
|
if [ -z "$version" ]; then
|
||||||
|
echo "Version is not specified (first positional argument)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
function build() {
|
||||||
|
name="linsk_${1}_${2}_${version}"
|
||||||
|
binary_name="$name"
|
||||||
|
if [ $1 == "windows" ]; then
|
||||||
|
binary_name="$binary_name.exe"
|
||||||
|
fi
|
||||||
|
|
||||||
|
CGO_ENABLED=0 GOOS=$1 GOARCH=$2 go build -trimpath -o build/$binary_name
|
||||||
|
cd build
|
||||||
|
zip $name.zip $binary_name
|
||||||
|
rm $binary_name
|
||||||
|
cd ..
|
||||||
|
}
|
||||||
|
|
||||||
|
build windows amd64
|
||||||
|
build darwin amd64
|
||||||
|
build darwin arm64
|
||||||
|
|
||||||
|
cd build
|
||||||
|
|
||||||
|
hashes_file="linsk_sha256_$version.txt"
|
||||||
|
|
||||||
|
sha256sum * > $hashes_file
|
||||||
|
gpg --output ${hashes_file}.sig --detach-sign --armor $hashes_file
|
||||||
52
keys/AlexSSD7.key
Normal file
52
keys/AlexSSD7.key
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
|
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
|
||||||
|
BNbvvcRjpJJjv01pCTBeaPWgXPk=
|
||||||
|
=fhOb
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
@ -42,10 +42,11 @@ var safeArgs = map[string]ArgAcceptedValue{
|
||||||
"netdev": ArgAcceptedValueKeyValue,
|
"netdev": ArgAcceptedValueKeyValue,
|
||||||
"serial": ArgAcceptedValueString,
|
"serial": ArgAcceptedValueString,
|
||||||
"cdrom": ArgAcceptedValueString,
|
"cdrom": ArgAcceptedValueString,
|
||||||
"machine": ArgAcceptedValueString,
|
"machine": ArgAcceptedValueKeyValue,
|
||||||
"cpu": ArgAcceptedValueString,
|
"cpu": ArgAcceptedValueString,
|
||||||
"display": ArgAcceptedValueString,
|
"display": ArgAcceptedValueString,
|
||||||
"drive": ArgAcceptedValueKeyValue,
|
"drive": ArgAcceptedValueKeyValue,
|
||||||
|
"bios": ArgAcceptedValueString,
|
||||||
}
|
}
|
||||||
|
|
||||||
type Arg interface {
|
type Arg interface {
|
||||||
|
|
|
||||||
|
|
@ -99,7 +99,9 @@ func NewSSHSessionWithDelayedTimeout(ctx context.Context, timeout time.Duration,
|
||||||
go func() {
|
go func() {
|
||||||
select {
|
select {
|
||||||
case <-time.After(timeout):
|
case <-time.After(timeout):
|
||||||
|
if preTimeout != nil {
|
||||||
preTimeout()
|
preTimeout()
|
||||||
|
}
|
||||||
timedOut = true
|
timedOut = true
|
||||||
_ = sc.Close()
|
_ = sc.Close()
|
||||||
case <-done:
|
case <-done:
|
||||||
|
|
|
||||||
|
|
@ -67,10 +67,6 @@ func configureBaseVMCmd(logger *slog.Logger, cfg Config) (string, []qemucli.Arg,
|
||||||
var accel []qemucli.KeyValueArgItem
|
var accel []qemucli.KeyValueArgItem
|
||||||
switch {
|
switch {
|
||||||
case osspecifics.IsWindows():
|
case osspecifics.IsWindows():
|
||||||
// TODO: To document: For Windows, we need to install QEMU using an installer and add it to PATH.
|
|
||||||
// Then, we should enable Windows Hypervisor Platform in "Turn Windows features on or off".
|
|
||||||
// IMPORTANT: We should also install libusbK drivers for USB devices we want to pass through.
|
|
||||||
// This can be easily done with a program called Zadiag by Akeo.
|
|
||||||
accel = []qemucli.KeyValueArgItem{
|
accel = []qemucli.KeyValueArgItem{
|
||||||
{Key: "whpx"},
|
{Key: "whpx"},
|
||||||
{Key: "kernel-irqchip", Value: "off"},
|
{Key: "kernel-irqchip", Value: "off"},
|
||||||
|
|
|
||||||
|
|
@ -113,7 +113,7 @@ func (fm *FileManager) luksOpen(sc *ssh.Client, fullDevPath string) error {
|
||||||
return errors.Wrap(err, "write prompt to stderr")
|
return errors.Wrap(err, "write prompt to stderr")
|
||||||
}
|
}
|
||||||
|
|
||||||
pwd, err := term.ReadPassword(int(syscall.Stdin))
|
pwd, err := term.ReadPassword(int(syscall.Stdin)) //nolint:unconvert // On Windows it's a different non-int type.
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "read luks password")
|
return errors.Wrap(err, "read luks password")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue