Repository: code-ready/crc
Pull request #2558 (2021-07-09 11:53:39)

linux: Add systemd-socket activation
At the moment, crc daemon must be run manually before one can use its HTTP API, or when using usermode networking. Using systemd socket activation would let systemd listen for HTTP/vsock connection attempts, and tell it to automatically start the daemon when such a connection attempt is made.

The end result is that after this PR, it's possible to do

```
crc config set network-mode user
crc cleanup
crc setup
crc start
```
without having to run crc daemon explicitly

After this PR, `systemctl --user status crc-http.socket crc-vsock.socket crc-daemon.service` knows about these 3 new units.
The socket units are listening/running, and the daemon is by  default not started. As soon as something interacts with the sockets in `~/.crc`, the daemon starts (can be tested with `nc -U ~/.crc/crc-http.sock`).


**Fixes:** Issue https://github.com/code-ready/crc/issues/2556


## Proposed changes

List main as well as consequential changes you introduced or had to introduce.

1. running `crc daemon` manually is no longer needed
2. if one wants to keep running `crc daemon` manually, the new preflight check for systemd socket units needs to be disabled

openshift-ci[bot]: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/code-ready/crc/pull/2558#" title="Author self-approved">cfergeau</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=code-ready%2Fcrc).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/code-ready/crc/blob/master/OWNERS)~~ [cfergeau]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
openshift-ci[bot]: @cfergeau: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/integration-crc | 1a849d6520c92fbb423ada0dcbb630628278958a | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1413466378777661440) | `/test integration-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/integration-crc | 1a849d6520c92fbb423ada0dcbb630628278958a | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1413466378777661440) | `/test integration-crc`
ci/prow/e2e-crc | 1a849d6520c92fbb423ada0dcbb630628278958a | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1413466378714746880) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | 1a849d6520c92fbb423ada0dcbb630628278958a | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1413466378714746880) | `/test e2e-crc`
ci/prow/integration-crc | 019bc1ac3767f0a0e87d174823fe3939b85d3437 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1413516326932058112) | `/test integration-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
cfergeau: CI is failing because the code in `preflight: Add symlink to crc binary in ~/.crc/bin` does not deal with the situation where `crc` is in the path and is started with just `crc`. https://golang.org/pkg/os/exec/#LookPath needs to be used somehow.
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/integration-crc | 019bc1ac3767f0a0e87d174823fe3939b85d3437 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1413516326932058112) | `/test integration-crc`
ci/prow/e2e-crc | 019bc1ac3767f0a0e87d174823fe3939b85d3437 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1413516326864949248) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/integration-crc | 019bc1ac3767f0a0e87d174823fe3939b85d3437 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1413516326932058112) | `/test integration-crc`
ci/prow/e2e-crc | 019bc1ac3767f0a0e87d174823fe3939b85d3437 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1413516326864949248) | `/test e2e-crc`
ci/prow/images | 342e4a4665119aed431d64f76d2ac01c24b20172 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-images/1413526501453729792) | `/test images`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/integration-crc | 019bc1ac3767f0a0e87d174823fe3939b85d3437 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1413516326932058112) | `/test integration-crc`
ci/prow/images | 342e4a4665119aed431d64f76d2ac01c24b20172 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-images/1413526501453729792) | `/test images`
ci/prow/e2e-crc | 342e4a4665119aed431d64f76d2ac01c24b20172 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1413526501415981056) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/images | 342e4a4665119aed431d64f76d2ac01c24b20172 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-images/1413526501453729792) | `/test images`
ci/prow/e2e-crc | 342e4a4665119aed431d64f76d2ac01c24b20172 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1413526501415981056) | `/test e2e-crc`
ci/prow/integration-crc | 342e4a4665119aed431d64f76d2ac01c24b20172 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1413526501541810176) | `/test integration-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
cfergeau: The latest CI failure is more problematic (on `ci.centos.org`):
```
level=info msg="Setting up crc daemon systemd socket units"
Executing systemctl action failed:  exit status 1: Failed to connect to bus: No such file or directory
```

Not sure what to do about this one :-/
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | 342e4a4665119aed431d64f76d2ac01c24b20172 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1413526501415981056) | `/test e2e-crc`
ci/prow/integration-crc | 4ef1b6dfb7d633b9c8fd33416efa104814e68c38 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1413552281726488576) | `/test integration-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/integration-crc | 4ef1b6dfb7d633b9c8fd33416efa104814e68c38 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1413552281726488576) | `/test integration-crc`
ci/prow/e2e-crc | 4ef1b6dfb7d633b9c8fd33416efa104814e68c38 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1413552281650991104) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | 4ef1b6dfb7d633b9c8fd33416efa104814e68c38 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1413552281650991104) | `/test e2e-crc`
ci/prow/integration-crc | 7d506b7a5fc86db0ed31d77f9a7a6adbf3e9f95b | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1420734284842405888) | `/test integration-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/integration-crc | 7d506b7a5fc86db0ed31d77f9a7a6adbf3e9f95b | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1420734284842405888) | `/test integration-crc`
ci/prow/e2e-crc | 7d506b7a5fc86db0ed31d77f9a7a6adbf3e9f95b | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1420734284758519808) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | 7d506b7a5fc86db0ed31d77f9a7a6adbf3e9f95b | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1420734284758519808) | `/test e2e-crc`
ci/prow/integration-crc | a9c7ae9fd3d0da0aaf6dfd17be3eeaf0a9c72692 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1420750218772615168) | `/test integration-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/integration-crc | a9c7ae9fd3d0da0aaf6dfd17be3eeaf0a9c72692 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1420750218772615168) | `/test integration-crc`
ci/prow/e2e-crc | a9c7ae9fd3d0da0aaf6dfd17be3eeaf0a9c72692 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1420750218705506304) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | a9c7ae9fd3d0da0aaf6dfd17be3eeaf0a9c72692 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1420750218705506304) | `/test e2e-crc`
ci/prow/integration-crc | ab9444472d787a2386c20e6008d2d7a4ac916448 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1420762334548201472) | `/test integration-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/integration-crc | ab9444472d787a2386c20e6008d2d7a4ac916448 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1420762334548201472) | `/test integration-crc`
ci/prow/e2e-crc | ab9444472d787a2386c20e6008d2d7a4ac916448 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1420762334447538176) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | ab9444472d787a2386c20e6008d2d7a4ac916448 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1420762334447538176) | `/test e2e-crc`
ci/prow/integration-crc | b50b7d2ab8892bc263831a502ef1e5df378557a7 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1420772635813351424) | `/test integration-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/integration-crc | b50b7d2ab8892bc263831a502ef1e5df378557a7 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1420772635813351424) | `/test integration-crc`
ci/prow/e2e-crc | b50b7d2ab8892bc263831a502ef1e5df378557a7 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1420772635482001408) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | b50b7d2ab8892bc263831a502ef1e5df378557a7 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1420772635482001408) | `/test e2e-crc`
ci/prow/integration-crc | 754f710ad4405bef058817ccb5773242d2cba336 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1421027181177344000) | `/test integration-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | b50b7d2ab8892bc263831a502ef1e5df378557a7 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1420772635482001408) | `/test e2e-crc`
ci/prow/integration-crc | 4cb2ecfc2c03c15bd5d1aa9260b45ed4e7e122ff | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1421039374618857472) | `/test integration-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/integration-crc | 4cb2ecfc2c03c15bd5d1aa9260b45ed4e7e122ff | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1421039374618857472) | `/test integration-crc`
ci/prow/e2e-crc | 4cb2ecfc2c03c15bd5d1aa9260b45ed4e7e122ff | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1421039374551748608) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | 4cb2ecfc2c03c15bd5d1aa9260b45ed4e7e122ff | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1421039374551748608) | `/test e2e-crc`
ci/prow/integration-crc | 41c21bbd1796f275e9de0c994384d0ece463fb7b | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1421096348534444032) | `/test integration-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
cfergeau: Phew, made progress with CI. Looks like non-obvious steps are involved to use `systemctl --user` as a different user which is different from the one who logged in (ie use of `su` or `runuser`). I had to add:
```
# this creates /run/user/1000/ even if crc_ci is not logged in
$ loginctl enable-linger crc_ci
$ export XDG_RUNTIME_DIR="/run/user/$UID"
$ export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
```
and only after this would `systemctl --user list-units` work without complaining about the bus not being found, or systemd not being found.
openshift-ci[bot]: @cfergeau: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/integration-crc | 41c21bbd1796f275e9de0c994384d0ece463fb7b | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-integration-crc/1421096348534444032) | `/test integration-crc`
ci/prow/e2e-crc | 41c21bbd1796f275e9de0c994384d0ece463fb7b | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1421096348471529472) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | 336429e23087247e76c29901dcd03ceef385018c | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1421121910837612544) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
cfergeau: /retest

cfergeau: centos CI is failing with 
```
13:39:10   Scenario: Bundle generation check # features/basic.feature:147
13:39:10     Given executing "crc bundle generate -f" succeeds # features/basic.feature:151
13:39:10       Error: command 'crc bundle generate -f', expected to succeed, exited with exit code: 1
13:39:10 Command stdout: 
13:39:10 Command stderr: level=info msg="Removing user's pull secret from instance disk and from cluster secret..."
13:39:10 Error removing pull secret from cluster: Temporary error: machine config is not rendered after removing pull secret (x22)
```
but I don't think that's related to this PR.
openshift-ci[bot]: @cfergeau: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | 3f9a5bb44ebd0c4a81623f347833f95945e28702 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1422839178487402496) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci[bot]: @cfergeau: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | de8f30d25c16663af84524c95a375a60ca852d0e | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2558/pull-ci-code-ready-crc-master-e2e-crc/1422862196089556992) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2558). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:cfergeau).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
praveenkumar: /lgtm

Patch:
diff --git a/centos_ci.sh b/centos_ci.sh
index 62056ce88..432ae2393 100644
--- a/centos_ci.sh
+++ b/centos_ci.sh
@@ -75,6 +75,8 @@ function prepare_ci_user() {
   chown -R crc_ci:crc_ci /home/crc_ci/payload
   # Copy the jenkins-env into crc_ci home dir
   cp ~/.jenkins-env /home/crc_ci/jenkins-env
+
+  loginctl enable-linger crc_ci
 }
 
 function setup_golang() {
@@ -148,6 +150,8 @@ if [[ "$UID" = 0 ]]; then
 	runuser -l crc_ci -c "/bin/bash centos_ci.sh"
 else
 	source ~/jenkins-env # Source environment variables for minishift_ci user
+	export XDG_RUNTIME_DIR="/run/user/$UID"
+	export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
 	export TERM=xterm-256color
 	get_bundle
 	setup_golang
diff --git a/cmd/crc/cmd/daemon.go b/cmd/crc/cmd/daemon.go
index 49be1c41c..ca977f005 100644
--- a/cmd/crc/cmd/daemon.go
+++ b/cmd/crc/cmd/daemon.go
@@ -38,13 +38,20 @@ func init() {
 
 const hostVirtualIP = "192.168.127.254"
 
+func checkDaemonVersion() (bool, error) {
+	if _, err := daemonclient.New().APIClient.Version(); err == nil {
+		return true, errors.New("daemon is already running")
+	}
+	return false, nil
+}
+
 var daemonCmd = &cobra.Command{
 	Use:    "daemon",
 	Short:  "Run the crc daemon",
 	Long:   "Run the crc daemon",
 	Hidden: true,
 	RunE: func(cmd *cobra.Command, args []string) error {
-		if _, err := daemonclient.New().APIClient.Version(); err == nil {
+		if running, _ := checkIfDaemonIsRunning(); running {
 			return errors.New("daemon is already running")
 		}
 
@@ -161,6 +168,8 @@ func run(configuration *types.Configuration) error {
 		}
 	}()
 
+	startupDone()
+
 	if isDebugLog() {
 		go func() {
 			for {
diff --git a/cmd/crc/cmd/daemon_darwin.go b/cmd/crc/cmd/daemon_darwin.go
index aca870932..a2c969b5a 100644
--- a/cmd/crc/cmd/daemon_darwin.go
+++ b/cmd/crc/cmd/daemon_darwin.go
@@ -27,3 +27,10 @@ func httpListener() (net.Listener, error) {
 	}
 	return ln, nil
 }
+
+func checkIfDaemonIsRunning() (bool, error) {
+	return checkDaemonVersion()
+}
+
+func startupDone() {
+}
diff --git a/cmd/crc/cmd/daemon_linux.go b/cmd/crc/cmd/daemon_linux.go
index 15bab5cff..4ee34048e 100644
--- a/cmd/crc/cmd/daemon_linux.go
+++ b/cmd/crc/cmd/daemon_linux.go
@@ -1,16 +1,101 @@
 package cmd
 
 import (
+	"fmt"
 	"net"
 	"os"
 
 	"github.com/code-ready/crc/pkg/crc/constants"
 	"github.com/code-ready/crc/pkg/crc/logging"
 	"github.com/code-ready/gvisor-tap-vsock/pkg/transport"
+
+	"github.com/coreos/go-systemd/activation"
+	"github.com/coreos/go-systemd/daemon"
+	"github.com/mdlayher/vsock"
+)
+
+const (
+	vsockUnitName = "crc-vsock.socket"
+	httpUnitName  = "crc-http.socket"
 )
 
+// listenerWithNames() cannot be called multiple times, call it once at
+// startup, and then use `systemdListeners` in the rest of the code
+var systemdListeners, _ = listenersWithNames()
+
+func checkIfDaemonIsRunning() (bool, error) {
+	ln, _ := getSystemdListener(httpUnitName)
+	if ln != nil {
+		/* detect if the daemon is being started by systemd,
+		* and socket activation is in use. In this scenario,
+		* trying to send an HTTP version check on the daemon
+		* HTTP socket would hang as the socket is listening for
+		* connections but is not setup to handle them yet.
+		 */
+		return false, nil
+	}
+
+	return checkDaemonVersion()
+}
+
+// listenersWithNames maps a listener name to a set of net.Listener instances.
+// This is the same code as https://github.com/coreos/go-systemd/blob/main/activation/listeners.go
+// with support for vsock
+//
+// This function can only be called once, subsequent calls will always return an empty list
+func listenersWithNames() (map[string][]net.Listener, error) {
+	files := activation.Files(true)
+	listeners := map[string][]net.Listener{}
+
+	for _, f := range files {
+		pc, err := net.FileListener(f)
+		if err != nil {
+			logging.Infof("got error %t %v", err, err)
+			// net.FileListener does not support vsock, need to fallback to vsock-specific code
+			pc, err = vsock.FileListener(f)
+			if err != nil {
+				logging.Debugf("failed to create listener for %s: %v", f.Name(), err)
+				continue
+			}
+		}
+		current, ok := listeners[f.Name()]
+		if !ok {
+			listeners[f.Name()] = []net.Listener{pc}
+		} else {
+			listeners[f.Name()] = append(current, pc)
+		}
+		f.Close()
+	}
+	return listeners, nil
+}
+
+func getSystemdListener(unitName string) (net.Listener, error) {
+	listeners, found := systemdListeners[unitName]
+	if !found {
+		logging.Debugf("no listener for %s: %+v", unitName, systemdListeners)
+		// it's not an error if systemd provided no listener
+		return nil, nil
+	}
+	if len(listeners) != 1 {
+		logging.Debugf("unexpected number of sockets for %s (%d != 1)", unitName, len(listeners))
+		return nil, fmt.Errorf("unexpected number of sockets for %s (%d != 1)", unitName, len(listeners))
+	}
+
+	return listeners[0], nil
+}
+
 func vsockListener() (net.Listener, error) {
-	ln, err := transport.Listen(transport.DefaultURL)
+	ln, err := getSystemdListener(vsockUnitName)
+	if err != nil {
+		return nil, err
+	}
+	if ln != nil {
+		logging.Infof("using socket provided by %s", vsockUnitName)
+		return ln, nil
+	}
+
+	// no socket activation, we need to create the listener
+	ln, err = transport.Listen(transport.DefaultURL)
 	logging.Infof("listening %s", transport.DefaultURL)
 	if err != nil {
 		return nil, err
@@ -19,11 +104,26 @@ func vsockListener() (net.Listener, error) {
 }
 
 func httpListener() (net.Listener, error) {
+	// check for systemd socket-activation
+	ln, err := getSystemdListener(httpUnitName)
+	if err != nil {
+		return nil, err
+	}
+	if ln != nil {
+		logging.Infof("using socket provided by %s", httpUnitName)
+		return ln, nil
+	}
+
+	// no socket activation, we need to create the listener
 	_ = os.Remove(constants.DaemonHTTPSocketPath)
-	ln, err := net.Listen("unix", constants.DaemonHTTPSocketPath)
+	ln, err = net.Listen("unix", constants.DaemonHTTPSocketPath)
 	logging.Infof("listening %s", constants.DaemonHTTPSocketPath)
 	if err != nil {
 		return nil, err
 	}
 	return ln, nil
 }
+
+func startupDone() {
+	_, _ = daemon.SdNotify(false, daemon.SdNotifyReady)
+}
diff --git a/cmd/crc/cmd/daemon_windows.go b/cmd/crc/cmd/daemon_windows.go
index 89fd3d0c6..711e7abc3 100644
--- a/cmd/crc/cmd/daemon_windows.go
+++ b/cmd/crc/cmd/daemon_windows.go
@@ -30,3 +30,10 @@ func httpListener() (net.Listener, error) {
 	}
 	return ln, nil
 }
+
+func checkIfDaemonIsRunning() (bool, error) {
+	return checkDaemonVersion()
+}
+
+func startupDone() {
+}
diff --git a/go.mod b/go.mod
index 69b436191..ef3f34d9b 100644
--- a/go.mod
+++ b/go.mod
@@ -15,6 +15,7 @@ require (
 	github.com/code-ready/clicumber v0.0.0-20210201104241-cecb794bdf9a
 	github.com/code-ready/gvisor-tap-vsock v0.0.0-20210308122700-d61f9aac135c
 	github.com/code-ready/machine v0.0.0-20210616065635-eff475d32b9a
+	github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf
 	github.com/cucumber/godog v0.9.0
 	github.com/cucumber/messages-go/v10 v10.0.3
 	github.com/docker/go-units v0.4.0
@@ -35,6 +36,7 @@ require (
 	github.com/magiconair/properties v1.8.5 // indirect
 	github.com/mattn/go-colorable v0.1.8
 	github.com/mattn/go-runewidth v0.0.13 // indirect
+	github.com/mdlayher/vsock v0.0.0-20210303205602-10d591861736
 	github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect
 	github.com/mitchellh/mapstructure v1.4.1 // indirect
 	github.com/onsi/ginkgo v1.16.2
@@ -88,3 +90,5 @@ replace (
 	k8s.io/client-go => github.com/openshift/kubernetes-client-go v0.0.0-20210108114446-0829bdd68114
 	k8s.io/kubectl => github.com/openshift/kubernetes-kubectl v0.0.0-20210108115031-c0d78c0aeda3
 )
+
+replace github.com/mdlayher/vsock => github.com/cfergeau/vsock v0.0.0-20210707084117-4d87f8a20ba8
diff --git a/go.sum b/go.sum
index 5a88e5b71..460715a37 100644
--- a/go.sum
+++ b/go.sum
@@ -132,6 +132,8 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA
 github.com/certifi/gocertifi v0.0.0-20180905225744-ee1a9a0726d2/go.mod h1:GJKEexRPVJrBSOjoqN5VNOIKJ5Q3RViH6eu3puDRwx4=
 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cfergeau/vsock v0.0.0-20210707084117-4d87f8a20ba8 h1:hIjEjbU0CpHqhoCNVz3lSMrJ5aIdqNUg1KiTk3sTdjs=
+github.com/cfergeau/vsock v0.0.0-20210707084117-4d87f8a20ba8/go.mod h1:OGwlMd1v7fjifRz7LiKLMfs7fS1G72qRZD71PTjH0aY=
 github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw=
 github.com/cheggaaa/pb/v3 v3.0.8 h1:bC8oemdChbke2FHIIGy9mn4DPJ2caZYQnfbRqwmdCoA=
 github.com/cheggaaa/pb/v3 v3.0.8/go.mod h1:UICbiLec/XO6Hw6k+BHEtHeQFzzBH4i2/qk/ow1EJTA=
@@ -188,6 +190,7 @@ github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee
 github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU=
 github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
 github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
@@ -622,8 +625,6 @@ github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsO
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
 github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY=
-github.com/mdlayher/vsock v0.0.0-20200508120832-7ad3638b3fbc h1:7EXQyTVWQtagOIR7s0tNFKX7ex4Lxq+sIR0jZ82cSP4=
-github.com/mdlayher/vsock v0.0.0-20200508120832-7ad3638b3fbc/go.mod h1:OGwlMd1v7fjifRz7LiKLMfs7fS1G72qRZD71PTjH0aY=
 github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
 github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI=
 github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
diff --git a/pkg/crc/constants/constants.go b/pkg/crc/constants/constants.go
index 9268c737b..f20fa66fc 100644
--- a/pkg/crc/constants/constants.go
+++ b/pkg/crc/constants/constants.go
@@ -89,6 +89,7 @@ var (
 	CrcBaseDir         = filepath.Join(GetHomeDir(), ".crc")
 	CrcBinDir          = filepath.Join(CrcBaseDir, "bin")
 	CrcOcBinDir        = filepath.Join(CrcBinDir, "oc")
+	CrcSymlinkPath     = filepath.Join(CrcBinDir, "crc")
 	ConfigPath         = filepath.Join(CrcBaseDir, ConfigFile)
 	LogFilePath        = filepath.Join(CrcBaseDir, LogFile)
 	DaemonLogFilePath  = filepath.Join(CrcBaseDir, DaemonLogFile)
diff --git a/pkg/crc/preflight/preflight_checks_linux.go b/pkg/crc/preflight/preflight_checks_linux.go
index 5aafb8f59..18282afd6 100644
--- a/pkg/crc/preflight/preflight_checks_linux.go
+++ b/pkg/crc/preflight/preflight_checks_linux.go
@@ -263,26 +263,173 @@ func checkCurrentGroups(distro *linux.OsRelease) func() error {
 	}
 }
 
+func systemdUnitRunning(sd *systemd.Commander, unitName string) bool {
+	status, err := sd.Status(unitName)
+	if err != nil {
+		logging.Debugf("Could not get %s  status: %v", unitName, err)
+		return false
+	}
+	switch status {
+	case states.Running:
+		logging.Debugf("%s is running", unitName)
+		return true
+	case states.Listening:
+		logging.Debugf("%s is listening", unitName)
+		return true
+	default:
+		logging.Debugf("%s is neither running nor listening", unitName)
+		return false
+	}
+}
+
+const (
+	vsockUnitName = "crc-vsock.socket"
+	vsockUnit     = `[Unit]
+Description=CodeReady Containers vsock socket
+
+[Socket]
+ListenStream=vsock::1024
+Service=crc-daemon.service
+`
+
+	httpUnitName = "crc-http.socket"
+	httpUnit     = `[Unit]
+Description=CodeReady Containers HTTP socket
+
+[Socket]
+ListenStream=%h/.crc/crc-http.sock
+Service=crc-daemon.service
+`
+
+	daemonUnitName     = "crc-daemon.service"
+	daemonUnitTemplate = `
+[Unit]
+Description=CodeReady Containers daemon
+Requires=crc-http.socket
+Requires=crc-vsock.socket
+
+[Service]
+# This allows systemd to know when startup is not complete (for example, because of a preflight failure)
+# daemon.SdNotify(false, daemon.SdNotifyReady) must be called before the startup is successful
+Type=notify
+ExecStart=%s daemon
+`
+)
+
+func checkSystemdUnit(unitName string, unitContent string, shouldBeRunning bool) error {
+	sd := systemd.NewHostSystemdCommander().User()
+
+	logging.Debugf("Checking if %s is running", unitName)
+	running := systemdUnitRunning(sd, unitName)
+	if !running && shouldBeRunning {
+		return fmt.Errorf("%s is not running", unitName)
+	} else if running && !shouldBeRunning {
+		return fmt.Errorf("%s is running", unitName)
+	}
+
+	logging.Debugf("Checking if %s has the expected content", unitName)
+	unitPath := systemd.UserUnitPath(unitName)
+	return crcos.FileContentMatches(unitPath, []byte(unitContent))
+}
+
+func daemonUnitContent() string {
+	return fmt.Sprintf(daemonUnitTemplate, constants.CrcSymlinkPath)
+}
+
+func checkDaemonSystemdSockets() error {
+	logging.Debug("Checking crc daemon systemd socket units")
+
+	if err := checkSystemdUnit(httpUnitName, httpUnit, true); err != nil {
+		return err
+	}
+
+	return checkSystemdUnit(vsockUnitName, vsockUnit, true)
+}
+
+func checkDaemonSystemdService() error {
+	logging.Debug("Checking crc daemon systemd service")
+
+	// the daemon should not be running at the end of setup, as it must be restarted on upgrades
+	return checkSystemdUnit(daemonUnitName, daemonUnitContent(), false)
+}
+
+func fixSystemdUnit(unitName string, unitContent string, shouldBeRunning bool) error {
+	logging.Debugf("Setting up %s", unitName)
+
+	sd := systemd.NewHostSystemdCommander().User()
+
+	if err := os.MkdirAll(systemd.UserUnitsDir(), 0750); err != nil {
+		return err
+	}
+	unitPath := systemd.UserUnitPath(unitName)
+	if crcos.FileContentMatches(unitPath, []byte(unitContent)) != nil {
+		logging.Debugf("Creating %s", unitPath)
+		if err := ioutil.WriteFile(unitPath, []byte(unitContent), 0600); err != nil {
+			return err
+		}
+		_ = sd.DaemonReload()
+	}
+
+	running := systemdUnitRunning(sd, unitName)
+	if !running && shouldBeRunning {
+		logging.Debugf("Starting %s", unitName)
+		return sd.Start(unitName)
+	} else if running && !shouldBeRunning {
+		logging.Debugf("Stopping %s", unitName)
+		return sd.Stop(unitName)
+	}
+
+	return nil
+}
+
+func fixDaemonSystemdSockets() error {
+	logging.Debugf("Setting up crc daemon systemd socket units")
+	if err := fixSystemdUnit(httpUnitName, httpUnit, true); err != nil {
+		return err
+	}
+
+	return fixSystemdUnit(vsockUnitName, vsockUnit, true)
+}
+
+func fixDaemonSystemdService() error {
+	logging.Debugf("Setting up crc daemon systemd unit")
+	return fixSystemdUnit(daemonUnitName, daemonUnitContent(), false)
+}
+
+func removeDaemonSystemdSockets() error {
+	logging.Debugf("Removing crc daemon systemd socket units")
+
+	sd := systemd.NewHostSystemdCommander().User()
+
+	_ = sd.Stop(httpUnitName)
+	os.Remove(systemd.UserUnitPath(httpUnitName))
+
+	_ = sd.Stop(vsockUnitName)
+	os.Remove(systemd.UserUnitPath(vsockUnitName))
+
+	return nil
+}
+
+func removeDaemonSystemdService() error {
+	logging.Debugf("Removing crc daemon systemd service")
+
+	sd := systemd.NewHostSystemdCommander().User()
+
+	_ = sd.Stop(daemonUnitName)
+	os.Remove(systemd.UserUnitPath(daemonUnitName))
+
+	return nil
+}
+
 func checkLibvirtServiceRunning() error {
 	logging.Debug("Checking if libvirtd service is running")
 	sd := systemd.NewHostSystemdCommander()
 
 	libvirtSystemdUnits := []string{"virtqemud.socket", "libvirtd.socket", "virtqemud.service", "libvirtd.service"}
 	for _, unit := range libvirtSystemdUnits {
-		status, err := sd.Status(unit)
-		if err == nil {
-			switch status {
-			case states.Running:
-				logging.Debugf("%s is running", unit)
-				return nil
-			case states.Listening:
-				logging.Debugf("%s is listening", unit)
-				return nil
-			default:
-				logging.Debugf("%s is neither running nor listening", unit)
-			}
+		if systemdUnitRunning(sd, unit) {
+			return nil
 		}
-
 	}
 
 	logging.Warnf("No active (running) libvirtd systemd unit could be found - make sure one of libvirt systemd units is enabled so that it's autostarted at boot time.")
@@ -516,3 +663,50 @@ func getCPUFlags() (string, error) {
 	}
 	return flags, nil
 }
+
+func runtimeExecutablePath() (string, error) {
+	path, err := exec.LookPath(os.Args[0])
+	if err != nil {
+		// os.Args[0] is not in $PATH, crc must have been started by specifying the path to its binary
+		path = os.Args[0]
+	}
+	path, err = filepath.Abs(path)
+	if err != nil {
+		return "", err
+	}
+	return filepath.EvalSymlinks(path)
+}
+
+func checkCrcSymlink() error {
+	runtimePath, err := runtimeExecutablePath()
+	if err != nil {
+		return err
+	}
+	symlinkPath, err := filepath.EvalSymlinks(constants.CrcSymlinkPath)
+	if err != nil {
+		return err
+	}
+	if symlinkPath != runtimePath {
+		return fmt.Errorf("%s points to %s, not to %s", constants.CrcSymlinkPath, symlinkPath, runtimePath)
+	}
+
+	return nil
+}
+
+func fixCrcSymlink() error {
+	_ = os.Remove(constants.CrcSymlinkPath)
+
+	runtimePath, err := runtimeExecutablePath()
+	if err != nil {
+		return err
+	}
+	logging.Debugf("symlinking %s to %s", runtimePath, constants.CrcSymlinkPath)
+	return os.Symlink(runtimePath, constants.CrcSymlinkPath)
+}
+
+func removeCrcSymlink() error {
+	if crcos.FileExists(constants.CrcSymlinkPath) {
+		return os.Remove(constants.CrcSymlinkPath)
+	}
+	return nil
+}
diff --git a/pkg/crc/preflight/preflight_linux.go b/pkg/crc/preflight/preflight_linux.go
index 4f92a7be2..7b83a66c4 100644
--- a/pkg/crc/preflight/preflight_linux.go
+++ b/pkg/crc/preflight/preflight_linux.go
@@ -17,6 +17,17 @@ import (
 
 func libvirtPreflightChecks(distro *linux.OsRelease) []Check {
 	checks := []Check{
+		{
+			configKeySuffix:    "check-crc-symlink",
+			checkDescription:   "Checking if crc executable symlink exists",
+			check:              checkCrcSymlink,
+			fixDescription:     "Creating symlink for crc executable",
+			fix:                fixCrcSymlink,
+			cleanupDescription: "Removing crc executable symlink",
+			cleanup:            removeCrcSymlink,
+
+			labels: labels{Os: Linux},
+		},
 		{
 			configKeySuffix:  "check-virt-enabled",
 			checkDescription: "Checking if Virtualization is enabled",
@@ -94,6 +105,29 @@ func libvirtPreflightChecks(distro *linux.OsRelease) []Check {
 			cleanup:            removeCrcVM,
 			flags:              CleanUpOnly,
 
+			labels: labels{Os: Linux},
+		},
+		{
+			configKeySuffix:    "check-daemon-systemd-unit",
+			checkDescription:   "Checking crc daemon systemd service",
+			check:              checkDaemonSystemdService,
+			fixDescription:     "Setting up crc daemon systemd service",
+			fix:                fixDaemonSystemdService,
+			cleanupDescription: "Removing crc daemon systemd service",
+			cleanup:            removeDaemonSystemdService,
+			flags:              SetupOnly,
+
+			labels: labels{Os: Linux},
+		},
+		{
+			configKeySuffix:    "check-daemon-systemd-sockets",
+			checkDescription:   "Checking crc daemon systemd socket units",
+			check:              checkDaemonSystemdSockets,
+			fixDescription:     "Setting up crc daemon systemd socket units",
+			fix:                fixDaemonSystemdSockets,
+			cleanupDescription: "Removing crc daemon systemd socket units",
+			cleanup:            removeDaemonSystemdSockets,
+
 			labels: labels{Os: Linux},
 		},
 	}
diff --git a/pkg/crc/systemd/systemd.go b/pkg/crc/systemd/systemd.go
index a986a815c..6fb134f6f 100644
--- a/pkg/crc/systemd/systemd.go
+++ b/pkg/crc/systemd/systemd.go
@@ -70,6 +70,7 @@ func (c Commander) service(name string, action actions.Action) (states.State, er
 		stdOut, stdErr string
 		err            error
 	)
+
 	if action.IsPriviledged() {
 		msg := fmt.Sprintf("Executing systemctl %s %s", action.String(), name)
 		stdOut, stdErr, err = c.commandRunner.RunPrivileged(msg, "systemctl", action.String(), name)
@@ -92,3 +93,38 @@ func (c Commander) service(name string, action actions.Action) (states.State, er
 
 	return states.Compare(stdOut), nil
 }
+
+type systemctlUserRunner struct {
+	runner crcos.CommandRunner
+}
+
+func (userRunner *systemctlUserRunner) Run(command string, args ...string) (string, string, error) {
+	if command != "systemctl" {
+		return "", "", fmt.Errorf("Invalid command: '%s'", command)
+	}
+	return userRunner.runner.Run("systemctl", append([]string{"--user"}, args...)...)
+}
+
+func (userRunner *systemctlUserRunner) RunPrivate(command string, args ...string) (string, string, error) {
+	if command != "systemctl" {
+		return "", "", fmt.Errorf("Invalid command: '%s'", command)
+	}
+	return userRunner.runner.RunPrivate("systemctl", append([]string{"--user"}, args...)...)
+}
+
+func (userRunner *systemctlUserRunner) RunPrivileged(reason string, cmdAndArgs ...string) (string, string, error) {
+	command := cmdAndArgs[0]
+	args := cmdAndArgs[1:]
+	if command != "systemctl" {
+		return "", "", fmt.Errorf("Invalid command: '%s'", command)
+	}
+	return userRunner.runner.Run("systemctl", append([]string{"--user"}, args...)...)
+}
+
+func (c *Commander) User() *Commander {
+	return &Commander{
+		commandRunner: &systemctlUserRunner{
+			c.commandRunner,
+		},
+	}
+}
diff --git a/pkg/crc/systemd/systemd_linux.go b/pkg/crc/systemd/systemd_linux.go
index d59e03219..4e5ce9cf5 100644
--- a/pkg/crc/systemd/systemd_linux.go
+++ b/pkg/crc/systemd/systemd_linux.go
@@ -1,9 +1,23 @@
 package systemd
 
-import crcos "github.com/code-ready/crc/pkg/os"
+import (
+	"os"
+	"path/filepath"
+
+	crcos "github.com/code-ready/crc/pkg/os"
+)
 
 func NewHostSystemdCommander() *Commander {
 	return &Commander{
 		commandRunner: crcos.NewLocalCommandRunner(),
 	}
 }
+
+func UserUnitsDir() string {
+	userConfigDir, _ := os.UserConfigDir()
+	return filepath.Join(userConfigDir, "systemd", "user")
+}
+
+func UserUnitPath(unitName string) string {
+	return filepath.Join(UserUnitsDir(), unitName)
+}
diff --git a/vendor/github.com/coreos/go-systemd/LICENSE b/vendor/github.com/coreos/go-systemd/LICENSE
new file mode 100644
index 000000000..37ec93a14
--- /dev/null
+++ b/vendor/github.com/coreos/go-systemd/LICENSE
@@ -0,0 +1,191 @@
+Apache License
+Version 2.0, January 2004
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and
+distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright
+owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities
+that control, are controlled by, or are under common control with that entity.
+For the purposes of this definition, "control" means (i) the power, direct or
+indirect, to cause the direction or management of such entity, whether by
+contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
+outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising
+permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including
+but not limited to software source code, documentation source, and configuration
+files.
+
+"Object" form shall mean any form resulting from mechanical transformation or
+translation of a Source form, including but not limited to compiled object code,
+generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made
+available under the License, as indicated by a copyright notice that is included
+in or attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that
+is based on (or derived from) the Work and for which the editorial revisions,
+annotations, elaborations, or other modifications represent, as a whole, an
+original work of authorship. For the purposes of this License, Derivative Works
+shall not include works that remain separable from, or merely link (or bind by
+name) to the interfaces of, the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version
+of the Work and any modifications or additions to that Work or Derivative Works
+thereof, that is intentionally submitted to Licensor for inclusion in the Work
+by the copyright owner or by an individual or Legal Entity authorized to submit
+on behalf of the copyright owner. For the purposes of this definition,
+"submitted" means any form of electronic, verbal, or written communication sent
+to the Licensor or its representatives, including but not limited to
+communication on electronic mailing lists, source code control systems, and
+issue tracking systems that are managed by, or on behalf of, the Licensor for
+the purpose of discussing and improving the Work, but excluding communication
+that is conspicuously marked or otherwise designated in writing by the copyright
+owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
+of whom a Contribution has been received by Licensor and subsequently
+incorporated within the Work.
+
+2. Grant of Copyright License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable copyright license to reproduce, prepare Derivative Works of,
+publicly display, publicly perform, sublicense, and distribute the Work and such
+Derivative Works in Source or Object form.
+
+3. Grant of Patent License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable (except as stated in this section) patent license to make, have
+made, use, offer to sell, sell, import, and otherwise transfer the Work, where
+such license applies only to those patent claims licensable by such Contributor
+that are necessarily infringed by their Contribution(s) alone or by combination
+of their Contribution(s) with the Work to which such Contribution(s) was
+submitted. If You institute patent litigation against any entity (including a
+cross-claim or counterclaim in a lawsuit) alleging that the Work or a
+Contribution incorporated within the Work constitutes direct or contributory
+patent infringement, then any patent licenses granted to You under this License
+for that Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution.
+
+You may reproduce and distribute copies of the Work or Derivative Works thereof
+in any medium, with or without modifications, and in Source or Object form,
+provided that You meet the following conditions:
+
+You must give any other recipients of the Work or Derivative Works a copy of
+this License; and
+You must cause any modified files to carry prominent notices stating that You
+changed the files; and
+You must retain, in the Source form of any Derivative Works that You distribute,
+all copyright, patent, trademark, and attribution notices from the Source form
+of the Work, excluding those notices that do not pertain to any part of the
+Derivative Works; and
+If the Work includes a "NOTICE" text file as part of its distribution, then any
+Derivative Works that You distribute must include a readable copy of the
+attribution notices contained within such NOTICE file, excluding those notices
+that do not pertain to any part of the Derivative Works, in at least one of the
+following places: within a NOTICE text file distributed as part of the
+Derivative Works; within the Source form or documentation, if provided along
+with the Derivative Works; or, within a display generated by the Derivative
+Works, if and wherever such third-party notices normally appear. The contents of
+the NOTICE file are for informational purposes only and do not modify the
+License. You may add Your own attribution notices within Derivative Works that
+You distribute, alongside or as an addendum to the NOTICE text from the Work,
+provided that such additional attribution notices cannot be construed as
+modifying the License.
+You may add Your own copyright statement to Your modifications and may provide
+additional or different license terms and conditions for use, reproduction, or
+distribution of Your modifications, or for any such Derivative Works as a whole,
+provided Your use, reproduction, and distribution of the Work otherwise complies
+with the conditions stated in this License.
+
+5. Submission of Contributions.
+
+Unless You explicitly state otherwise, any Contribution intentionally submitted
+for inclusion in the Work by You to the Licensor shall be under the terms and
+conditions of this License, without any additional terms or conditions.
+Notwithstanding the above, nothing herein shall supersede or modify the terms of
+any separate license agreement you may have executed with Licensor regarding
+such Contributions.
+
+6. Trademarks.
+
+This License does not grant permission to use the trade names, trademarks,
+service marks, or product names of the Licensor, except as required for
+reasonable and customary use in describing the origin of the Work and
+reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty.
+
+Unless required by applicable law or agreed to in writing, Licensor provides the
+Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
+including, without limitation, any warranties or conditions of TITLE,
+NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
+solely responsible for determining the appropriateness of using or
+redistributing the Work and assume any risks associated with Your exercise of
+permissions under this License.
+
+8. Limitation of Liability.
+
+In no event and under no legal theory, whether in tort (including negligence),
+contract, or otherwise, unless required by applicable law (such as deliberate
+and grossly negligent acts) or agreed to in writing, shall any Contributor be
+liable to You for damages, including any direct, indirect, special, incidental,
+or consequential damages of any character arising as a result of this License or
+out of the use or inability to use the Work (including but not limited to
+damages for loss of goodwill, work stoppage, computer failure or malfunction, or
+any and all other commercial damages or losses), even if such Contributor has
+been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability.
+
+While redistributing the Work or Derivative Works thereof, You may choose to
+offer, and charge a fee for, acceptance of support, warranty, indemnity, or
+other liability obligations and/or rights consistent with this License. However,
+in accepting such obligations, You may act only on Your own behalf and on Your
+sole responsibility, not on behalf of any other Contributor, and only if You
+agree to indemnify, defend, and hold each Contributor harmless for any liability
+incurred by, or claims asserted against, such Contributor by reason of your
+accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work
+
+To apply the Apache License to your work, attach the following boilerplate
+notice, with the fields enclosed by brackets "[]" replaced with your own
+identifying information. (Don't include the brackets!) The text should be
+enclosed in the appropriate comment syntax for the file format. We also
+recommend that a file or class name and description of purpose be included on
+the same "printed page" as the copyright notice for easier identification within
+third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/vendor/github.com/coreos/go-systemd/NOTICE b/vendor/github.com/coreos/go-systemd/NOTICE
new file mode 100644
index 000000000..23a0ada2f
--- /dev/null
+++ b/vendor/github.com/coreos/go-systemd/NOTICE
@@ -0,0 +1,5 @@
+CoreOS Project
+Copyright 2018 CoreOS, Inc
+
+This product includes software developed at CoreOS, Inc.
+(http://www.coreos.com/).
diff --git a/vendor/github.com/coreos/go-systemd/activation/files.go b/vendor/github.com/coreos/go-systemd/activation/files.go
new file mode 100644
index 000000000..29dd18def
--- /dev/null
+++ b/vendor/github.com/coreos/go-systemd/activation/files.go
@@ -0,0 +1,67 @@
+// Copyright 2015 CoreOS, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Package activation implements primitives for systemd socket activation.
+package activation
+
+import (
+	"os"
+	"strconv"
+	"strings"
+	"syscall"
+)
+
+const (
+	// listenFdsStart corresponds to `SD_LISTEN_FDS_START`.
+	listenFdsStart = 3
+)
+
+// Files returns a slice containing a `os.File` object for each
+// file descriptor passed to this process via systemd fd-passing protocol.
+//
+// The order of the file descriptors is preserved in the returned slice.
+// `unsetEnv` is typically set to `true` in order to avoid clashes in
+// fd usage and to avoid leaking environment flags to child processes.
+func Files(unsetEnv bool) []*os.File {
+	if unsetEnv {
+		defer os.Unsetenv("LISTEN_PID")
+		defer os.Unsetenv("LISTEN_FDS")
+		defer os.Unsetenv("LISTEN_FDNAMES")
+	}
+
+	pid, err := strconv.Atoi(os.Getenv("LISTEN_PID"))
+	if err != nil || pid != os.Getpid() {
+		return nil
+	}
+
+	nfds, err := strconv.Atoi(os.Getenv("LISTEN_FDS"))
+	if err != nil || nfds == 0 {
+		return nil
+	}
+
+	names := strings.Split(os.Getenv("LISTEN_FDNAMES"), ":")
+
+	files := make([]*os.File, 0, nfds)
+	for fd := listenFdsStart; fd < listenFdsStart+nfds; fd++ {
+		syscall.CloseOnExec(fd)
+		name := "LISTEN_FD_" + strconv.Itoa(fd)
+		offset := fd - listenFdsStart
+		if offset < len(names) && len(names[offset]) > 0 {
+			name = names[offset]
+		}
+		files = append(files, os.NewFile(uintptr(fd), name))
+	}
+
+	return files
+}
diff --git a/vendor/github.com/coreos/go-systemd/activation/listeners.go b/vendor/github.com/coreos/go-systemd/activation/listeners.go
new file mode 100644
index 000000000..3dbe2b087
--- /dev/null
+++ b/vendor/github.com/coreos/go-systemd/activation/listeners.go
@@ -0,0 +1,103 @@
+// Copyright 2015 CoreOS, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package activation
+
+import (
+	"crypto/tls"
+	"net"
+)
+
+// Listeners returns a slice containing a net.Listener for each matching socket type
+// passed to this process.
+//
+// The order of the file descriptors is preserved in the returned slice.
+// Nil values are used to fill any gaps. For example if systemd were to return file descriptors
+// corresponding with "udp, tcp, tcp", then the slice would contain {nil, net.Listener, net.Listener}
+func Listeners() ([]net.Listener, error) {
+	files := Files(true)
+	listeners := make([]net.Listener, len(files))
+
+	for i, f := range files {
+		if pc, err := net.FileListener(f); err == nil {
+			listeners[i] = pc
+			f.Close()
+		}
+	}
+	return listeners, nil
+}
+
+// ListenersWithNames maps a listener name to a set of net.Listener instances.
+func ListenersWithNames() (map[string][]net.Listener, error) {
+	files := Files(true)
+	listeners := map[string][]net.Listener{}
+
+	for _, f := range files {
+		if pc, err := net.FileListener(f); err == nil {
+			current, ok := listeners[f.Name()]
+			if !ok {
+				listeners[f.Name()] = []net.Listener{pc}
+			} else {
+				listeners[f.Name()] = append(current, pc)
+			}
+			f.Close()
+		}
+	}
+	return listeners, nil
+}
+
+// TLSListeners returns a slice containing a net.listener for each matching TCP socket type
+// passed to this process.
+// It uses default Listeners func and forces TCP sockets handlers to use TLS based on tlsConfig.
+func TLSListeners(tlsConfig *tls.Config) ([]net.Listener, error) {
+	listeners, err := Listeners()
+
+	if listeners == nil || err != nil {
+		return nil, err
+	}
+
+	if tlsConfig != nil {
+		for i, l := range listeners {
+			// Activate TLS only for TCP sockets
+			if l.Addr().Network() == "tcp" {
+				listeners[i] = tls.NewListener(l, tlsConfig)
+			}
+		}
+	}
+
+	return listeners, err
+}
+
+// TLSListenersWithNames maps a listener name to a net.Listener with
+// the associated TLS configuration.
+func TLSListenersWithNames(tlsConfig *tls.Config) (map[string][]net.Listener, error) {
+	listeners, err := ListenersWithNames()
+
+	if listeners == nil || err != nil {
+		return nil, err
+	}
+
+	if tlsConfig != nil {
+		for _, ll := range listeners {
+			// Activate TLS only for TCP sockets
+			for i, l := range ll {
+				if l.Addr().Network() == "tcp" {
+					ll[i] = tls.NewListener(l, tlsConfig)
+				}
+			}
+		}
+	}
+
+	return listeners, err
+}
diff --git a/vendor/github.com/coreos/go-systemd/activation/packetconns.go b/vendor/github.com/coreos/go-systemd/activation/packetconns.go
new file mode 100644
index 000000000..a97206785
--- /dev/null
+++ b/vendor/github.com/coreos/go-systemd/activation/packetconns.go
@@ -0,0 +1,38 @@
+// Copyright 2015 CoreOS, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package activation
+
+import (
+	"net"
+)
+
+// PacketConns returns a slice containing a net.PacketConn for each matching socket type
+// passed to this process.
+//
+// The order of the file descriptors is preserved in the returned slice.
+// Nil values are used to fill any gaps. For example if systemd were to return file descriptors
+// corresponding with "udp, tcp, udp", then the slice would contain {net.PacketConn, nil, net.PacketConn}
+func PacketConns() ([]net.PacketConn, error) {
+	files := Files(true)
+	conns := make([]net.PacketConn, len(files))
+
+	for i, f := range files {
+		if pc, err := net.FilePacketConn(f); err == nil {
+			conns[i] = pc
+			f.Close()
+		}
+	}
+	return conns, nil
+}
diff --git a/vendor/github.com/coreos/go-systemd/daemon/sdnotify.go b/vendor/github.com/coreos/go-systemd/daemon/sdnotify.go
new file mode 100644
index 000000000..ba4ae31f1
--- /dev/null
+++ b/vendor/github.com/coreos/go-systemd/daemon/sdnotify.go
@@ -0,0 +1,84 @@
+// Copyright 2014 Docker, Inc.
+// Copyright 2015-2018 CoreOS, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+// Package daemon provides a Go implementation of the sd_notify protocol.
+// It can be used to inform systemd of service start-up completion, watchdog
+// events, and other status changes.
+//
+// https://www.freedesktop.org/software/systemd/man/sd_notify.html#Description
+package daemon
+
+import (
+	"net"
+	"os"
+)
+
+const (
+	// SdNotifyReady tells the service manager that service startup is finished
+	// or the service finished loading its configuration.
+	SdNotifyReady = "READY=1"
+
+	// SdNotifyStopping tells the service manager that the service is beginning
+	// its shutdown.
+	SdNotifyStopping = "STOPPING=1"
+
+	// SdNotifyReloading tells the service manager that this service is
+	// reloading its configuration. Note that you must call SdNotifyReady when
+	// it completed reloading.
+	SdNotifyReloading = "RELOADING=1"
+
+	// SdNotifyWatchdog tells the service manager to update the watchdog
+	// timestamp for the service.
+	SdNotifyWatchdog = "WATCHDOG=1"
+)
+
+// SdNotify sends a message to the init daemon. It is common to ignore the error.
+// If `unsetEnvironment` is true, the environment variable `NOTIFY_SOCKET`
+// will be unconditionally unset.
+//
+// It returns one of the following:
+// (false, nil) - notification not supported (i.e. NOTIFY_SOCKET is unset)
+// (false, err) - notification supported, but failure happened (e.g. error connecting to NOTIFY_SOCKET or while sending data)
+// (true, nil) - notification supported, data has been sent
+func SdNotify(unsetEnvironment bool, state string) (bool, error) {
+	socketAddr := &net.UnixAddr{
+		Name: os.Getenv("NOTIFY_SOCKET"),
+		Net:  "unixgram",
+	}
+
+	// NOTIFY_SOCKET not set
+	if socketAddr.Name == "" {
+		return false, nil
+	}
+
+	if unsetEnvironment {
+		if err := os.Unsetenv("NOTIFY_SOCKET"); err != nil {
+			return false, err
+		}
+	}
+
+	conn, err := net.DialUnix(socketAddr.Net, nil, socketAddr)
+	// Error connecting to NOTIFY_SOCKET
+	if err != nil {
+		return false, err
+	}
+	defer conn.Close()
+
+	if _, err = conn.Write([]byte(state)); err != nil {
+		return false, err
+	}
+	return true, nil
+}
diff --git a/vendor/github.com/coreos/go-systemd/daemon/watchdog.go b/vendor/github.com/coreos/go-systemd/daemon/watchdog.go
new file mode 100644
index 000000000..7a0e0d3a5
--- /dev/null
+++ b/vendor/github.com/coreos/go-systemd/daemon/watchdog.go
@@ -0,0 +1,73 @@
+// Copyright 2016 CoreOS, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package daemon
+
+import (
+	"fmt"
+	"os"
+	"strconv"
+	"time"
+)
+
+// SdWatchdogEnabled returns watchdog information for a service.
+// Processes should call daemon.SdNotify(false, daemon.SdNotifyWatchdog) every
+// time / 2.
+// If `unsetEnvironment` is true, the environment variables `WATCHDOG_USEC` and
+// `WATCHDOG_PID` will be unconditionally unset.
+//
+// It returns one of the following:
+// (0, nil) - watchdog isn't enabled or we aren't the watched PID.
+// (0, err) - an error happened (e.g. error converting time).
+// (time, nil) - watchdog is enabled and we can send ping.
+//   time is delay before inactive service will be killed.
+func SdWatchdogEnabled(unsetEnvironment bool) (time.Duration, error) {
+	wusec := os.Getenv("WATCHDOG_USEC")
+	wpid := os.Getenv("WATCHDOG_PID")
+	if unsetEnvironment {
+		wusecErr := os.Unsetenv("WATCHDOG_USEC")
+		wpidErr := os.Unsetenv("WATCHDOG_PID")
+		if wusecErr != nil {
+			return 0, wusecErr
+		}
+		if wpidErr != nil {
+			return 0, wpidErr
+		}
+	}
+
+	if wusec == "" {
+		return 0, nil
+	}
+	s, err := strconv.Atoi(wusec)
+	if err != nil {
+		return 0, fmt.Errorf("error converting WATCHDOG_USEC: %s", err)
+	}
+	if s <= 0 {
+		return 0, fmt.Errorf("error WATCHDOG_USEC must be a positive number")
+	}
+	interval := time.Duration(s) * time.Microsecond
+
+	if wpid == "" {
+		return interval, nil
+	}
+	p, err := strconv.Atoi(wpid)
+	if err != nil {
+		return 0, fmt.Errorf("error converting WATCHDOG_PID: %s", err)
+	}
+	if os.Getpid() != p {
+		return 0, nil
+	}
+
+	return interval, nil
+}
diff --git a/vendor/github.com/mdlayher/vsock/fd_linux.go b/vendor/github.com/mdlayher/vsock/fd_linux.go
index 4c593047b..3b5935629 100644
--- a/vendor/github.com/mdlayher/vsock/fd_linux.go
+++ b/vendor/github.com/mdlayher/vsock/fd_linux.go
@@ -129,8 +129,22 @@ type sysConnFD struct {
 
 // Blocking mode methods.
 
-func (cfd *sysConnFD) Connect(sa unix.Sockaddr) error      { return unix.Connect(cfd.fd, sa) }
 func (cfd *sysConnFD) Getsockname() (unix.Sockaddr, error) { return unix.Getsockname(cfd.fd) }
+func (cfd *sysConnFD) Connect(sa unix.Sockaddr) error {
+	var err error
+
+	for {
+		err = unix.Connect(cfd.fd, sa)
+		if err == unix.EINTR {
+			// Retry on interrupted syscalls.
+			continue
+		}
+
+		break
+	}
+
+	return err
+}
 
 // EarlyClose is a blocking version of Close, only used for cleanup before
 // entering non-blocking mode.
@@ -187,23 +201,34 @@ func socket() (int, error) {
 	//
 	// Explanation copied from netlink, courtesy of acln:
 	// https://github.com/mdlayher/netlink/pull/138.
-	fd, err := unix.Socket(unix.AF_VSOCK, unix.SOCK_STREAM|unix.SOCK_CLOEXEC, 0)
-	switch err {
-	case nil:
-		return fd, nil
-	case unix.EINVAL:
-		syscall.ForkLock.RLock()
-		defer syscall.ForkLock.RUnlock()
-
-		fd, err = unix.Socket(unix.AF_VSOCK, unix.SOCK_STREAM, 0)
-		if err != nil {
+	for {
+		fd, err := unix.Socket(unix.AF_VSOCK, unix.SOCK_STREAM|unix.SOCK_CLOEXEC, 0)
+		switch err {
+		case nil:
+			return fd, nil
+		case unix.EINTR:
+			// Retry on interrupted syscalls.
+			continue
+		case unix.EINVAL:
+			syscall.ForkLock.RLock()
+
+			fd, err = unix.Socket(unix.AF_VSOCK, unix.SOCK_STREAM, 0)
+			if err != nil {
+				syscall.ForkLock.RUnlock()
+				if err == unix.EINTR {
+					// Retry on interrupted syscalls.
+					continue
+				}
+
+				return 0, err
+			}
+			unix.CloseOnExec(fd)
+			syscall.ForkLock.RUnlock()
+
+			return fd, nil
+		default:
 			return 0, err
 		}
-		unix.CloseOnExec(fd)
-
-		return fd, nil
-	default:
-		return 0, err
 	}
 }
 
diff --git a/vendor/github.com/mdlayher/vsock/listener_linux.go b/vendor/github.com/mdlayher/vsock/listener_linux.go
index 2c16a336a..d3e0e8eb6 100644
--- a/vendor/github.com/mdlayher/vsock/listener_linux.go
+++ b/vendor/github.com/mdlayher/vsock/listener_linux.go
@@ -3,7 +3,9 @@
 package vsock
 
 import (
+	"fmt"
 	"net"
+	"os"
 	"time"
 
 	"golang.org/x/sys/unix"
@@ -47,6 +49,19 @@ func (l *listener) Accept() (net.Conn, error) {
 	return newConn(cfd, l.addr, remote)
 }
 
+func FileListener(f *os.File) (ln net.Listener, err error) {
+	fd, err := unix.Dup(int(f.Fd()))
+	if err != nil {
+		return nil, err
+	}
+
+	lfd := &sysListenFD{
+		fd: fd,
+	}
+
+	return newListener(lfd)
+}
+
 // listen is the entry point for Listen on Linux.
 func listen(cid, port uint32) (*Listener, error) {
 	lfd, err := newListenFD()
@@ -57,6 +72,41 @@ func listen(cid, port uint32) (*Listener, error) {
 	return listenLinux(lfd, cid, port)
 }
 
+func newListener(lfd listenFD) (l *Listener, err error) {
+	lsa, err := lfd.Getsockname()
+	if err != nil {
+		return nil, err
+	}
+
+	// Done with blocking mode setup, transition to non-blocking before the
+	// caller has a chance to start calling things concurrently that might make
+	// the locking situation tricky.
+	//
+	// Note: if any calls fail after this point, lfd.Close should be invoked
+	// for cleanup because the socket is now non-blocking.
+	if err := lfd.SetNonblocking("vsock-listen"); err != nil {
+		return nil, err
+	}
+
+	switch lsavm := lsa.(type) {
+	case *unix.SockaddrVM:
+		addr := &Addr{
+			ContextID: lsavm.CID,
+			Port:      lsavm.Port,
+		}
+		return &Listener{
+			l: &listener{
+				fd:   lfd,
+				addr: addr,
+			},
+		}, nil
+		return
+
+	default:
+		return nil, fmt.Errorf("not an AF_VSOCK file")
+	}
+}
+
 // listenLinux is the entry point for tests on Linux.
 func listenLinux(lfd listenFD, cid, port uint32) (l *Listener, err error) {
 	defer func() {
@@ -85,31 +135,5 @@ func listenLinux(lfd listenFD, cid, port uint32) (l *Listener, err error) {
 		return nil, err
 	}
 
-	lsa, err := lfd.Getsockname()
-	if err != nil {
-		return nil, err
-	}
-
-	// Done with blocking mode setup, transition to non-blocking before the
-	// caller has a chance to start calling things concurrently that might make
-	// the locking situation tricky.
-	//
-	// Note: if any calls fail after this point, lfd.Close should be invoked
-	// for cleanup because the socket is now non-blocking.
-	if err := lfd.SetNonblocking("vsock-listen"); err != nil {
-		return nil, err
-	}
-
-	lsavm := lsa.(*unix.SockaddrVM)
-	addr := &Addr{
-		ContextID: lsavm.CID,
-		Port:      lsavm.Port,
-	}
-
-	return &Listener{
-		l: &listener{
-			fd:   lfd,
-			addr: addr,
-		},
-	}, nil
+	return newListener(lfd)
 }
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 6cc09fa9d..843053c74 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -63,6 +63,10 @@ github.com/code-ready/machine/libmachine/drivers/plugin/localbinary
 github.com/code-ready/machine/libmachine/drivers/rpc
 github.com/code-ready/machine/libmachine/state
 github.com/code-ready/machine/libmachine/version
+# github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf
+## explicit
+github.com/coreos/go-systemd/activation
+github.com/coreos/go-systemd/daemon
 # github.com/cucumber/gherkin-go/v11 v11.0.0
 github.com/cucumber/gherkin-go/v11
 # github.com/cucumber/godog v0.9.0
@@ -201,7 +205,8 @@ github.com/mattn/go-isatty
 # github.com/mattn/go-runewidth v0.0.13
 ## explicit
 github.com/mattn/go-runewidth
-# github.com/mdlayher/vsock v0.0.0-20200508120832-7ad3638b3fbc
+# github.com/mdlayher/vsock v0.0.0-20210303205602-10d591861736 => github.com/cfergeau/vsock v0.0.0-20210707084117-4d87f8a20ba8
+## explicit
 github.com/mdlayher/vsock
 # github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d
 ## explicit
@@ -631,3 +636,4 @@ sigs.k8s.io/yaml
 # k8s.io/apimachinery => github.com/openshift/kubernetes-apimachinery v0.0.0-20210108114224-194a87c5b03a
 # k8s.io/client-go => github.com/openshift/kubernetes-client-go v0.0.0-20210108114446-0829bdd68114
 # k8s.io/kubectl => github.com/openshift/kubernetes-kubectl v0.0.0-20210108115031-c0d78c0aeda3
+# github.com/mdlayher/vsock => github.com/cfergeau/vsock v0.0.0-20210707084117-4d87f8a20ba8


Test patch:
diff --git a/pkg/crc/preflight/preflight_linux_test.go b/pkg/crc/preflight/preflight_linux_test.go
index 31952142f..521eed6c0 100644
--- a/pkg/crc/preflight/preflight_linux_test.go
+++ b/pkg/crc/preflight/preflight_linux_test.go
@@ -72,6 +72,7 @@ var checkListForDistros = []checkListForDistro{
 			{cleanup: removeOldLogs},
 			{cleanup: cluster.ForgetPullSecret},
 			{cleanup: removeHostsFileEntry},
+			{check: checkCrcSymlink},
 			{check: checkVirtualizationEnabled},
 			{check: checkKvmEnabled},
 			{check: checkLibvirtInstalled},
@@ -81,6 +82,8 @@ var checkListForDistros = []checkListForDistro{
 			{check: checkLibvirtVersion},
 			{check: checkMachineDriverLibvirtInstalled},
 			{cleanup: removeCrcVM},
+			{check: checkDaemonSystemdService},
+			{check: checkDaemonSystemdSockets},
 			{check: checkSystemdNetworkdIsNotRunning},
 			{check: checkNetworkManagerInstalled},
 			{check: checkNetworkManagerIsRunning},
@@ -107,6 +110,7 @@ var checkListForDistros = []checkListForDistro{
 			{cleanup: removeOldLogs},
 			{cleanup: cluster.ForgetPullSecret},
 			{cleanup: removeHostsFileEntry},
+			{check: checkCrcSymlink},
 			{check: checkVirtualizationEnabled},
 			{check: checkKvmEnabled},
 			{check: checkLibvirtInstalled},
@@ -116,6 +120,8 @@ var checkListForDistros = []checkListForDistro{
 			{check: checkLibvirtVersion},
 			{check: checkMachineDriverLibvirtInstalled},
 			{cleanup: removeCrcVM},
+			{check: checkDaemonSystemdService},
+			{check: checkDaemonSystemdSockets},
 			{check: checkSystemdNetworkdIsNotRunning},
 			{check: checkNetworkManagerInstalled},
 			{check: checkNetworkManagerIsRunning},
@@ -141,6 +147,7 @@ var checkListForDistros = []checkListForDistro{
 			{cleanup: removeOldLogs},
 			{cleanup: cluster.ForgetPullSecret},
 			{cleanup: removeHostsFileEntry},
+			{check: checkCrcSymlink},
 			{check: checkVirtualizationEnabled},
 			{check: checkKvmEnabled},
 			{check: checkLibvirtInstalled},
@@ -150,6 +157,8 @@ var checkListForDistros = []checkListForDistro{
 			{check: checkLibvirtVersion},
 			{check: checkMachineDriverLibvirtInstalled},
 			{cleanup: removeCrcVM},
+			{check: checkDaemonSystemdService},
+			{check: checkDaemonSystemdSockets},
 			{check: checkVsock},
 			{check: checkBundleExtracted},
 		},
@@ -169,6 +178,7 @@ var checkListForDistros = []checkListForDistro{
 			{cleanup: removeOldLogs},
 			{cleanup: cluster.ForgetPullSecret},
 			{cleanup: removeHostsFileEntry},
+			{check: checkCrcSymlink},
 			{check: checkVirtualizationEnabled},
 			{check: checkKvmEnabled},
 			{check: checkLibvirtInstalled},
@@ -178,6 +188,8 @@ var checkListForDistros = []checkListForDistro{
 			{check: checkLibvirtVersion},
 			{check: checkMachineDriverLibvirtInstalled},
 			{cleanup: removeCrcVM},
+			{check: checkDaemonSystemdService},
+			{check: checkDaemonSystemdSockets},
 			{check: checkSystemdNetworkdIsNotRunning},
 			{check: checkNetworkManagerInstalled},
 			{check: checkNetworkManagerIsRunning},
@@ -204,6 +216,7 @@ var checkListForDistros = []checkListForDistro{
 			{cleanup: removeOldLogs},
 			{cleanup: cluster.ForgetPullSecret},
 			{cleanup: removeHostsFileEntry},
+			{check: checkCrcSymlink},
 			{check: checkVirtualizationEnabled},
 			{check: checkKvmEnabled},
 			{check: checkLibvirtInstalled},
@@ -213,6 +226,8 @@ var checkListForDistros = []checkListForDistro{
 			{check: checkLibvirtVersion},
 			{check: checkMachineDriverLibvirtInstalled},
 			{cleanup: removeCrcVM},
+			{check: checkDaemonSystemdService},
+			{check: checkDaemonSystemdSockets},
 			{check: checkSystemdNetworkdIsNotRunning},
 			{check: checkNetworkManagerInstalled},
 			{check: checkNetworkManagerIsRunning},
@@ -238,6 +253,7 @@ var checkListForDistros = []checkListForDistro{
 			{cleanup: removeOldLogs},
 			{cleanup: cluster.ForgetPullSecret},
 			{cleanup: removeHostsFileEntry},
+			{check: checkCrcSymlink},
 			{check: checkVirtualizationEnabled},
 			{check: checkKvmEnabled},
 			{check: checkLibvirtInstalled},
@@ -247,6 +263,8 @@ var checkListForDistros = []checkListForDistro{
 			{check: checkLibvirtVersion},
 			{check: checkMachineDriverLibvirtInstalled},
 			{cleanup: removeCrcVM},
+			{check: checkDaemonSystemdService},
+			{check: checkDaemonSystemdSockets},
 			{check: checkVsock},
 			{check: checkBundleExtracted},
 		},
@@ -266,6 +284,7 @@ var checkListForDistros = []checkListForDistro{
 			{cleanup: removeOldLogs},
 			{cleanup: cluster.ForgetPullSecret},
 			{cleanup: removeHostsFileEntry},
+			{check: checkCrcSymlink},
 			{check: checkVirtualizationEnabled},
 			{check: checkKvmEnabled},
 			{check: checkLibvirtInstalled},
@@ -275,6 +294,8 @@ var checkListForDistros = []checkListForDistro{
 			{check: checkLibvirtVersion},
 			{check: checkMachineDriverLibvirtInstalled},
 			{cleanup: removeCrcVM},
+			{check: checkDaemonSystemdService},
+			{check: checkDaemonSystemdSockets},
 			{check: checkSystemdNetworkdIsNotRunning},
 			{check: checkNetworkManagerInstalled},
 			{check: checkNetworkManagerIsRunning},
@@ -301,6 +322,7 @@ var checkListForDistros = []checkListForDistro{
 			{cleanup: removeOldLogs},
 			{cleanup: cluster.ForgetPullSecret},
 			{cleanup: removeHostsFileEntry},
+			{check: checkCrcSymlink},
 			{check: checkVirtualizationEnabled},
 			{check: checkKvmEnabled},
 			{check: checkLibvirtInstalled},
@@ -310,6 +332,8 @@ var checkListForDistros = []checkListForDistro{
 			{check: checkLibvirtVersion},
 			{check: checkMachineDriverLibvirtInstalled},
 			{cleanup: removeCrcVM},
+			{check: checkDaemonSystemdService},
+			{check: checkDaemonSystemdSockets},
 			{check: checkSystemdNetworkdIsNotRunning},
 			{check: checkNetworkManagerInstalled},
 			{check: checkNetworkManagerIsRunning},
@@ -335,6 +359,7 @@ var checkListForDistros = []checkListForDistro{
 			{cleanup: removeOldLogs},
 			{cleanup: cluster.ForgetPullSecret},
 			{cleanup: removeHostsFileEntry},
+			{check: checkCrcSymlink},
 			{check: checkVirtualizationEnabled},
 			{check: checkKvmEnabled},
 			{check: checkLibvirtInstalled},
@@ -344,6 +369,8 @@ var checkListForDistros = []checkListForDistro{
 			{check: checkLibvirtVersion},
 			{check: checkMachineDriverLibvirtInstalled},
 			{cleanup: removeCrcVM},
+			{check: checkDaemonSystemdService},
+			{check: checkDaemonSystemdSockets},
 			{check: checkVsock},
 			{check: checkBundleExtracted},
 		},
@@ -363,6 +390,7 @@ var checkListForDistros = []checkListForDistro{
 			{cleanup: removeOldLogs},
 			{cleanup: cluster.ForgetPullSecret},
 			{cleanup: removeHostsFileEntry},
+			{check: checkCrcSymlink},
 			{check: checkVirtualizationEnabled},
 			{check: checkKvmEnabled},
 			{check: checkLibvirtInstalled},
@@ -372,6 +400,8 @@ var checkListForDistros = []checkListForDistro{
 			{check: checkLibvirtVersion},
 			{check: checkMachineDriverLibvirtInstalled},
 			{cleanup: removeCrcVM},
+			{check: checkDaemonSystemdService},
+			{check: checkDaemonSystemdSockets},
 			{configKeySuffix: "check-apparmor-profile-setup"},
 			{check: checkSystemdNetworkdIsNotRunning},
 			{check: checkNetworkManagerInstalled},
@@ -399,6 +429,7 @@ var checkListForDistros = []checkListForDistro{
 			{cleanup: removeOldLogs},
 			{cleanup: cluster.ForgetPullSecret},
 			{cleanup: removeHostsFileEntry},
+			{check: checkCrcSymlink},
 			{check: checkVirtualizationEnabled},
 			{check: checkKvmEnabled},
 			{check: checkLibvirtInstalled},
@@ -408,6 +439,8 @@ var checkListForDistros = []checkListForDistro{
 			{check: checkLibvirtVersion},
 			{check: checkMachineDriverLibvirtInstalled},
 			{cleanup: removeCrcVM},
+			{check: checkDaemonSystemdService},
+			{check: checkDaemonSystemdSockets},
 			{configKeySuffix: "check-apparmor-profile-setup"},
 			{check: checkSystemdNetworkdIsNotRunning},
 			{check: checkNetworkManagerInstalled},
@@ -434,6 +467,7 @@ var checkListForDistros = []checkListForDistro{
 			{cleanup: removeOldLogs},
 			{cleanup: cluster.ForgetPullSecret},
 			{cleanup: removeHostsFileEntry},
+			{check: checkCrcSymlink},
 			{check: checkVirtualizationEnabled},
 			{check: checkKvmEnabled},
 			{check: checkLibvirtInstalled},
@@ -443,6 +477,8 @@ var checkListForDistros = []checkListForDistro{
 			{check: checkLibvirtVersion},
 			{check: checkMachineDriverLibvirtInstalled},
 			{cleanup: removeCrcVM},
+			{check: checkDaemonSystemdService},
+			{check: checkDaemonSystemdSockets},
 			{configKeySuffix: "check-apparmor-profile-setup"},
 			{check: checkVsock},
 			{check: checkBundleExtracted},