前几天我更新到了 Ubuntu Vivid,现在遇到了问题。我无法启动 dnscrypt-proxy(以及其他程序)。我猜这与 systemd 开关有关。当我尝试启动 dnscrypt-proxy 时,发生了以下情况:
$ sudo service dnscrypt-proxy start
[sudo] password for anon:
Failed to start dnscrypt-proxy.service: Unit
dnscrypt-proxy.service failed to load: No such file or directory.
我的初始化脚本或安装没有任何问题,我尝试重新安装然后重新启动...没有成功。
我确信我忽略了这个问题的一个简单答案。如果有人能帮助我理解与 systemd 的主要区别以及我需要做什么才能启动服务,我将不胜感激。
答案1
首先,我要感谢以上所有评论的人。
已更新 - 这是在 Ubuntu Mate 15.10 上运行的。
下载下面链接的西蒙·克劳森的剧本。
https://github.com/simonclausen/dnscrypt-autoinstall。
Ubuntu 15:10 破坏了 Simon Clausen 的脚本,因此它只能在重新启动之前工作。这是因为 Ubuntu 15.10 有一个从 /run/resolvconf/resolv.conf 到 /etc/resolv.conf 的符号链接。Simon 尝试使用 chattr +i /etc/resolv.conf 锁定 /etc/resolv.conf,但失败了。要解决此问题,请在运行他的脚本之前执行以下操作。
sudo rm /etc/resolv.conf
sudo cp /run/resolvconfig/resolv.conf /etc/resolv.conf
注意:Simons 脚本下载的 dnscrypt 新版本考虑了 systemd,无需修改。
脚本运行并测试后,我执行以下操作。
我使用了上面的 systemd 文件,但毕竟需要将解析器添加到最后一行。
[Unit]
Description=DNSCrypt client proxy
Requires=dnscrypt-proxy.socket
[Install]
Also=dnscrypt-proxy.socket
WantedBy=multi-user.target
[Service]
Type=simple
NonBlocking=true
ExecStart=/usr/local/sbin/dnscrypt-proxy -R dnscrypt.eu-nl
根据以上文本创建一个文本文件并命名
dnscrypt-proxy.service
然后将新的 dnscrypt-proxy.service 文件放入
/etc/systemd/系统/
我们不会覆盖 /lib/systemd 默认服务定义,否则在更新软件包时会遇到麻烦。Systemd 会先检查 /etc/systemd/system,然后再检查 /lib,因此您可以放心地将自定义服务定义放在 /etc/systemd 中。
完成后,完整路径为
/etc/systemd/system/dnscrypt-proxy.service
同样的事情 - 使用 /etc/
接下来根据下面的示例创建 dnscrypt-proxy.socket 文件。
[Unit]
Description=dnscrypt-proxy listening socket
After=network.target
[Socket]
ListenStream=127.0.0.2:53
ListenDatagram=127.0.0.2:53
[Install]
WantedBy=sockets.target
它也进入
/etc/systemd/系统/
完整路径是
/etc/systemd/system/dnscrypt-proxy.socket
激活脚本(在正确的文件夹中创建符号链接)
sudo systemctl enable /etc/systemd/system/dnscrypt-proxy.socket
sudo systemctl enable /etc/systemd/system/dnscrypt-proxy.service
停止服务以便 systemd 可以正确启动它。
sudo /etc/init.d/dnscrypt-proxy stop
您应该将 /init.d/dnscrypt 中的所有设置移至 /etc/systemd/system/dnscrypt-proxy.service — 否则 systemd 将采用 etc/init.d 中的脚本并创建临时服务定义,您可以在 /run/systemd/generator/XYZ.service 中找到该定义。如果 /etc/ 中的服务与 init.d 中的脚本同名,则该脚本将被忽略,而使用服务定义
启动服务时你不应该看到任何错误。
sudo systemctl start dnscrypt-proxy.service
sudo service dnscrypt-proxy start
对于我来说,在 Ubuntu 15.10 上重启后,此方法仍然有效。
我根本不是 Linux 的高级用户。我才刚刚开始。感谢 Chev_603 和所有他提到的人,不是我。希望您觉得这篇文章对您有帮助。任何关于改进脚本的评论都将不胜感激。如果有辅助 DNS 服务器就好了。有人知道怎么做吗?
答案2
好吧,我终于想出了如何让它工作。我清除了当前安装并删除了 ppa,因为正如 solsTiCe 提到的,该包已损坏。然后我抓住了这个自动安装脚本来自 github。我编译了该软件包,但是 configure 脚本有一个错误,它无法正确检测 systemd 是否存在(即使您使用 --with-systemd 标志)。为了解决这个问题,我打开脚本configure
并将变量设置HAVE_SYSTEMD
为TRUE
手动。然后我重新运行 configure,然后 make,最后 sudo make install。
接下来,我创建了一个目录,/etc/systemd/system/dnscrypt-proxy.service
并将这两个脚本放在该目录中:
更新:这个解决方案在我重启之前一直有效,但之后服务没有启动。我最终使用了这个脚本现在运行完美。Simclausen 是我心目中的英雄,因为他写了这篇文章。感谢 zenester 告诉我正确的语法:
/etc/systemd/system/dnscrypt-proxy.service/dnscrypt-proxy.service
:
[Unit]
Description=DNSCrypt client proxy
Requires=dnscrypt-proxy.socket
[Install]
Also=dnscrypt-proxy.socket
WantedBy=multi-user.target
[Service]
Type=simple
NonBlocking=true
ExecStart=/usr/local/sbin/dnscrypt-proxy \
-R dnscrypt.eu-nl
显然这是没有必要的:
并且
/etc/systemd/dnscrypt-proxy.service/dnscrypt-proxy.socket
:
[Unit]
Description=dnscrypt-proxy listening socket
After=network.target
[Socket]
ListenStream=127.0.0.2:53
ListenDatagram=127.0.0.2:53
[Install]
WantedBy=sockets.target
最后,我运行 /usr/local/sbin/dnscrypt-proxy start -R dnscrypt.eu-nl --local-address 127.0.0.2:53
程序成功启动。为了确认这一点,我运行了以下命令:
dig @127.0.0.2 debug.opendns.com txt
一切看上去都很好!
; <<>> DiG 9.9.5-9-Ubuntu <<>> @127.0.0.2 debug.opendns.com txt
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45692
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;debug.opendns.com. IN TXT
;; ANSWER SECTION:
debug.opendns.com. 0 IN TXT "server 3.otp"
debug.opendns.com. 0 IN TXT "flags 20 0 70 5950800000000000000"
debug.opendns.com. 0 IN TXT "originid 0"
debug.opendns.com. 0 IN TXT "actype 0"
debug.opendns.com. 0 IN TXT "source xxxxxxxxxx:35164"
debug.opendns.com. 0 IN TXT "dnscrypt enabled (xxxxxxxxxxxxxx)"
;; Query time: 154 msec
;; SERVER: 127.0.0.2#53(127.0.0.2)
;; WHEN: Fri May 22 17:24:32 EDT 2015
;; MSG SIZE rcvd: 248
或者正确地将其注册为服务:
sudo systemctl enable dnscrypt-proxy.service
然后称呼它,sudo service dnscrypt-proxy start
我希望这对某些人有帮助。
答案3
你是如何安装的dnscrypt-代理?vivid中没有此包。
您的包裹已损坏,因为其中应该包含systemd 。服务文件来运行它。
尝试此文件并命名它/etc/systemd/system/multi-user.target.wants/dnscrypt-proxy.service
[Unit]
Description=DNSCrypt client proxy
Requires=dnscrypt-proxy.socket
[Install]
Also=dnscrypt-proxy.socket
WantedBy=multi-user.target
[Service]
Type=simple
NonBlocking=true
ExecStart=/usr/sbin/dnscrypt-proxy -R dnscrypt.eu-nl
和这个/etc/systemd/system/sockets.target.wants/dnscrypt-proxy.socket
[Unit]
Description=dnscrypt-proxy listening socket
After=network.target
[Socket]
ListenStream=127.0.0.1:53
ListenDatagram=127.0.0.1:53
[Install]
WantedBy=sockets.target
答案4
我是 dnscrypt-proxy 的 PPA Anton+ 的所有者。我在度假期间了解到,在之前的版本中,仅使用 systemd 或 upstart(或两者)的 Ubuntu 系统存在问题。
我今天刚刚为 Vivid 15.04 构建了 dnscrypt-proxy。它使用了 systemd。
但是我的系统中没有安装 Vivid 15.04。目前我仍然使用 Trusty 14.04。
你能在你的系统上测试这个新版本吗?它仍然是 1.5.0 版本。如果测试成功,我将提供更新的版本 1.6.0。
https://launchpad.net/~anton+/+archive/ubuntu/dnscrypt
新的测试版本是:dnscrypt-proxy 1.5.0-1pmo1.8~vivid
它应该提供来自 dnscrypt.eu 的 2 个 DNS
通过 Launchpad 联系我。
谢谢。