V2ray-core: 依據 FHS 修改 V2Ray 的安裝路徑

Created on 14 Mar 2020  ·  77Comments  ·  Source: v2ray/v2ray-core

FHS 的全稱為「Filesystem Hierarchy Standard」,直譯為「文件系統層次結構標準」。

以下為官方站點:

目前 V2Ray 官方腳本的安裝路徑完全不符合 FHS,以下為當前的安裝路徑:

  • /usr/bin/v2ray/v2ray
  • /usr/bin/v2ray/v2ctl
  • /usr/bin/v2ray/geoip.dat
  • /usr/bin/v2ray/geosite.dat
  • /etc/v2ray/config.json

嚴格來講,這並不利於服務器系統的管理,因為非包管理系統安裝的軟體應當放置於 /usr/local 下,依據「4.9. /usr/local : Local hierarchy」,則路徑為:

  • /usr/local/bin/v2ray
  • /usr/local/bin/v2ctl
  • /usr/local/lib/v2ray/geoip.dat
  • /usr/local/lib/v2ray/geosite.dat
  • /usr/local/etc/v2ray/config.json

並且,修改路徑也必定要修改啟動服務文件。

這裡有一個參考項目:
https://github.com/v2fly/fhs-install-v2ray

在此,請各位對其加以審查,確定無誤後,將著手對官方腳本的修改。

對官方腳本的修改並不會影響到各類一鍵腳本,卻會影響到一些相關教程,對此,我認為,教程可以修改,但是,使用規範的安裝路徑,比使用不規範的安裝路徑要好很多。

Most helpful comment

虽然这么做很合理,但是也没必要把以前的安装脚本费了吧?毕竟都是bash脚本,替换了不行么?判断下安装版本不就得了?

同时维护两个安装脚本很费精力,这次旧安装脚本被废除就是因为它会按照旧文件名来下载 v2ray-core 的 release 来安装,但上游已经改变了 release assets 的命名方式,导致无法使用。
烦请您注意,这是个开源项目,参与者都是用爱发电,没有什么非得照着你的意思来。所谓你行你上在这里就是如果别人对你的需要不感兴趣,那你想实现它就只能自己来——这个道理实在很简单,不要说得好像有什么似的。
而且你希望旧的脚本继续工作,自己又不出力,那就是求人办事。我不知道你求人办事时习惯用什么态度,但至少我不会开篇就贬低别人,而且还是一句话就贬低微软和 v2ray 两组人。
最后希望你重新学习一下 bug 的定义。

All 77 comments

參考項目已基本可用。

考慮到目前絕大多數的 Linux 發行版已經切換到 systemd,參考項目中已移除對 System V 的支援。

一些特殊的 Linux 發行版及作業系統,如 Arch Linux、Gentoo 和 FreeBSD,都有著自己的解決方案,可直接通過其官方軟體倉庫安裝 V2Ray。

依據 #1011、#2361 和 #2322。

參考項目中,啟動服務文件的內容確定為:

v2ray.service
---
[Unit]
Description=V2Ray Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=nobody
AmbientCapabilities=CAP_NET_BIND_SERVICE
Environment=V2RAY_LOCATION_ASSET=/usr/local/lib/v2ray/
ExecStart=/usr/local/bin/v2ray -confdir /usr/local/etc/v2ray/

[Install]
WantedBy=multi-user.target
[email protected]
---
[Unit]
Description=V2Ray Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=nobody
AmbientCapabilities=CAP_NET_BIND_SERVICE
Environment=V2RAY_LOCATION_ASSET=/usr/local/lib/v2ray/
ExecStart=/usr/local/bin/v2ray -config /usr/local/etc/v2ray/%i.json

[Install]
WantedBy=multi-user.target

對於日誌權限問題的解決方案是:

# Used to store V2Ray log files
if [[ ! -d '/var/log/v2ray/' ]]; then
    if [[ -n "$(id nobody | grep nogroup)" ]]; then
        install -d -o nobody -g nogroup /var/log/v2ray/
    else
        install -do nobody /var/log/v2ray/
    fi
fi

如果分目录的话目前测试可以兼容运行吗

如果分目录的话目前测试可以兼容运行吗

若啟動服務文件已存在,該腳本不會對其進行修改。

在完全使用新的啟動服務文件的情況下:

對於 v4.23.0 及以上版本,v2ray.service[email protected] 皆可使用;

對於 v4.23.0 以下版本,僅可使用 [email protected]

上述情況已完成測試。

其实可以参照 Arch 打包 v2ray 的方法
把所有文件扔进 /usr/local/lib/v2ray,然后把 v2rayv2ctl 软链接到 /usr/local/bin 里,这样可以扔掉 Environment=V2RAY_LOCATION_ASSET=/usr/local/lib/v2ray/

至于 systemd 的 service 文件我会处理的

其实可以参照 Arch 打包 v2ray 的方法
把所有文件扔进 /usr/local/lib/v2ray,然后把 v2rayv2ctl 软链接到 /usr/local/bin 里,这样可以扔掉 Environment=V2RAY_LOCATION_ASSET=/usr/local/lib/v2ray/

至于 systemd 的 service 文件我会处理的

感謝提供建議 :)

這個方法很不錯,我這就去進行修正。

其实可以参照 Arch 打包 v2ray 的方法
把所有文件扔进 /usr/local/lib/v2ray,然后把 v2rayv2ctl 软链接到 /usr/local/bin 里,这样可以扔掉 Environment=V2RAY_LOCATION_ASSET=/usr/local/lib/v2ray/
至于 systemd 的 service 文件我会处理的

感謝提供建議 :)

這個方法很不錯,我這就去進行修正。

大概明天或者后天,我会修 service 文件,根据这个 issue,脚本安装时或许需要配置迁移或者 sed -i 's/orig/new/' 替换一些配置

其实可以参照 Arch 打包 v2ray 的方法
把所有文件扔进 /usr/local/lib/v2ray,然后把 v2rayv2ctl 软链接到 /usr/local/bin 里,这样可以扔掉 Environment=V2RAY_LOCATION_ASSET=/usr/local/lib/v2ray/
至于 systemd 的 service 文件我会处理的

感謝提供建議 :)

這個方法很不錯,我這就去進行修正。

https://github.com/v2fly/fhs-install-v2ray/commit/dccc5039de563f2568300e2b4b60001f72cd5680

其实可以参照 Arch 打包 v2ray 的方法
把所有文件扔进 /usr/local/lib/v2ray,然后把 v2rayv2ctl 软链接到 /usr/local/bin 里,这样可以扔掉 Environment=V2RAY_LOCATION_ASSET=/usr/local/lib/v2ray/
至于 systemd 的 service 文件我会处理的

感謝提供建議 :)
這個方法很不錯,我這就去進行修正。

大概明天或者后天,我会修 service 文件,根据这个 issue,脚本安装时或许需要配置迁移或者 sed -i 's/orig/new/' 替换一些配置

配置的遷移交給使用者手動進行會不會更好一些呢?

其实可以参照 Arch 打包 v2ray 的方法
把所有文件扔进 /usr/local/lib/v2ray,然后把 v2rayv2ctl 软链接到 /usr/local/bin 里,这样可以扔掉 Environment=V2RAY_LOCATION_ASSET=/usr/local/lib/v2ray/
至于 systemd 的 service 文件我会处理的

感謝提供建議 :)
這個方法很不錯,我這就去進行修正。

大概明天或者后天,我会修 service 文件,根据这个 issue,脚本安装时或许需要配置迁移或者 sed -i 's/orig/new/' 替换一些配置

配置的遷移交給使用者手動進行會不會更好一些呢?

或许可以作为可选并默认不启用选项,让用户自己选择

依據 #1011、#2361 和 #2322。

參考項目中,啟動服務文件的內容確定為:

v2ray.service
---
[Unit]
Description=V2Ray Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=nobody
AmbientCapabilities=CAP_NET_BIND_SERVICE
Environment=V2RAY_LOCATION_ASSET=/usr/local/lib/v2ray/
ExecStart=/usr/local/bin/v2ray -confdir /usr/local/etc/v2ray/

[Install]
WantedBy=multi-user.target
[email protected]
---
[Unit]
Description=V2Ray Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=nobody
AmbientCapabilities=CAP_NET_BIND_SERVICE
Environment=V2RAY_LOCATION_ASSET=/usr/local/lib/v2ray/
ExecStart=/usr/local/bin/v2ray -config /usr/local/etc/v2ray/%i.json

[Install]
WantedBy=multi-user.target

對於日誌權限問題的解決方案是:

# Used to store V2Ray log files
if [[ ! -d '/var/log/v2ray/' ]]; then
    if [[ -n "$(id nobody | grep nogroup)" ]]; then
        install -d -o nobody -g nogroup /var/log/v2ray/
    else
        install -do nobody /var/log/v2ray/
    fi
fi

推荐把 AmbientCapabilities=CAP_NET_BIND_SERVICE 换为 CapabilityBoundingSet= CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW
我那个没加 CAP_NET_ADMIN 导致很多人的透明代理出现问题

考慮到目前絕大多數的 Linux 發行版已經切換到 systemd,參考項目中已移除對 System V 的支援。

一些特殊的 Linux 發行版及作業系統,如 Arch Linux、Gentoo 和 FreeBSD,都有著自己的解決方案,可直接通過其官方軟體倉庫安裝 V2Ray。

鉴于部分用户还在用类似 centos6 的老古董,直接去掉可能不是一个好的选择

依據 #1011、#2361 和 #2322。
參考項目中,啟動服務文件的內容確定為:

v2ray.service
---
[Unit]
Description=V2Ray Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=nobody
AmbientCapabilities=CAP_NET_BIND_SERVICE
Environment=V2RAY_LOCATION_ASSET=/usr/local/lib/v2ray/
ExecStart=/usr/local/bin/v2ray -confdir /usr/local/etc/v2ray/

[Install]
WantedBy=multi-user.target
[email protected]
---
[Unit]
Description=V2Ray Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=nobody
AmbientCapabilities=CAP_NET_BIND_SERVICE
Environment=V2RAY_LOCATION_ASSET=/usr/local/lib/v2ray/
ExecStart=/usr/local/bin/v2ray -config /usr/local/etc/v2ray/%i.json

[Install]
WantedBy=multi-user.target

對於日誌權限問題的解決方案是:

# Used to store V2Ray log files
if [[ ! -d '/var/log/v2ray/' ]]; then
    if [[ -n "$(id nobody | grep nogroup)" ]]; then
        install -d -o nobody -g nogroup /var/log/v2ray/
    else
        install -do nobody /var/log/v2ray/
    fi
fi

推荐把 AmbientCapabilities=CAP_NET_BIND_SERVICE 换为 CapabilityBoundingSet= CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW
我那个没加 CAP_NET_ADMIN 导致很多人的透明代理出现问题

我這裡修改為如下內容進行測試:

v2ray.service
---
[Unit]
Description=V2Ray Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=nobody
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW
ExecStart=/usr/local/bin/v2ray -confdir /usr/local/etc/v2ray/

[Install]
WantedBy=multi-user.target

但低位端口卻開啟失敗了呢。

依據 #1011、#2361 和 #2322。
參考項目中,啟動服務文件的內容確定為:

v2ray.service
---
[Unit]
Description=V2Ray Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=nobody
AmbientCapabilities=CAP_NET_BIND_SERVICE
Environment=V2RAY_LOCATION_ASSET=/usr/local/lib/v2ray/
ExecStart=/usr/local/bin/v2ray -confdir /usr/local/etc/v2ray/

[Install]
WantedBy=multi-user.target
[email protected]
---
[Unit]
Description=V2Ray Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=nobody
AmbientCapabilities=CAP_NET_BIND_SERVICE
Environment=V2RAY_LOCATION_ASSET=/usr/local/lib/v2ray/
ExecStart=/usr/local/bin/v2ray -config /usr/local/etc/v2ray/%i.json

[Install]
WantedBy=multi-user.target

對於日誌權限問題的解決方案是:

# Used to store V2Ray log files
if [[ ! -d '/var/log/v2ray/' ]]; then
    if [[ -n "$(id nobody | grep nogroup)" ]]; then
        install -d -o nobody -g nogroup /var/log/v2ray/
    else
        install -do nobody /var/log/v2ray/
    fi
fi

推荐把 AmbientCapabilities=CAP_NET_BIND_SERVICE 换为 CapabilityBoundingSet= CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW
我那个没加 CAP_NET_ADMIN 导致很多人的透明代理出现问题

我這裡修改為如下內容進行測試:

v2ray.service
---
[Unit]
Description=V2Ray Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=nobody
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW
ExecStart=/usr/local/bin/v2ray -confdir /usr/local/etc/v2ray/

[Install]
WantedBy=multi-user.target

但低位端口卻開啟失敗了呢。

我似乎理解错了 CapabilityBoundingSet 的意思

考慮到目前絕大多數的 Linux 發行版已經切換到 systemd,參考項目中已移除對 System V 的支援。
一些特殊的 Linux 發行版及作業系統,如 Arch Linux、Gentoo 和 FreeBSD,都有著自己的解決方案,可直接通過其官方軟體倉庫安裝 V2Ray。

鉴于部分用户还在用类似 centos6 的老古董,直接去掉可能不是一个好的选择

這也正是我感到糾結的地方。

說句可能惹人生氣的話:「老東西,你早該被淘汰啦」。

或許需要有一個過渡期比較好?

考慮到目前絕大多數的 Linux 發行版已經切換到 systemd,參考項目中已移除對 System V 的支援。
一些特殊的 Linux 發行版及作業系統,如 Arch Linux、Gentoo 和 FreeBSD,都有著自己的解決方案,可直接通過其官方軟體倉庫安裝 V2Ray。

鉴于部分用户还在用类似 centos6 的老古董,直接去掉可能不是一个好的选择

這也正是我感到糾結的地方。

說句可能惹人生氣的話:「老東西,你早該被淘汰啦」。

或許需要有一個過渡期比較好?

其实我也认为 centos6 应该扔掉了
它实在旧的过分,早就不适合在生产环境使用了

依據 #1011、#2361 和 #2322。
參考項目中,啟動服務文件的內容確定為:

v2ray.service
---
[Unit]
Description=V2Ray Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=nobody
AmbientCapabilities=CAP_NET_BIND_SERVICE
Environment=V2RAY_LOCATION_ASSET=/usr/local/lib/v2ray/
ExecStart=/usr/local/bin/v2ray -confdir /usr/local/etc/v2ray/

[Install]
WantedBy=multi-user.target
[email protected]
---
[Unit]
Description=V2Ray Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=nobody
AmbientCapabilities=CAP_NET_BIND_SERVICE
Environment=V2RAY_LOCATION_ASSET=/usr/local/lib/v2ray/
ExecStart=/usr/local/bin/v2ray -config /usr/local/etc/v2ray/%i.json

[Install]
WantedBy=multi-user.target

對於日誌權限問題的解決方案是:

# Used to store V2Ray log files
if [[ ! -d '/var/log/v2ray/' ]]; then
    if [[ -n "$(id nobody | grep nogroup)" ]]; then
        install -d -o nobody -g nogroup /var/log/v2ray/
    else
        install -do nobody /var/log/v2ray/
    fi
fi

推荐把 AmbientCapabilities=CAP_NET_BIND_SERVICE 换为 CapabilityBoundingSet= CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW
我那个没加 CAP_NET_ADMIN 导致很多人的透明代理出现问题

我這裡修改為如下內容進行測試:

v2ray.service
---
[Unit]
Description=V2Ray Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=nobody
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW
ExecStart=/usr/local/bin/v2ray -confdir /usr/local/etc/v2ray/

[Install]
WantedBy=multi-user.target

但低位端口卻開啟失敗了呢。

我似乎理解错了 CapabilityBoundingSet 的意思

现在搞懂了,CapabilityBoundingSet 用于限制最多持有的 cap,AmbientCapabilities 用于在进程没有某个 cap 时增加 cap

因为在之前用的是 root,所以不需要使用 AmbientCapabilities,但是 nobody 是没有 CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW 的,因此需要加上 AmbientCapabilities 才正常

@unknowndev233 那應該是這樣麼?

AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW

@unknowndev233 那應該是這樣麼?

AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW

是的

其实我也认为 centos6 应该扔掉了
它实在旧的过分,早就不适合在生产环境使用了

附议

不过在用户变为普通用户时,证书之类的文件可能需要手动设置所有者
所以为了避免出现意外,可能用户还是需要保持为 root

不过在用户变为普通用户时,证书之类的文件可能需要手动设置所有者
所以为了避免出现意外,可能用户还是需要保持为 root

直接通過 V2Ray 使用證書文件的情況不多,一般是通過 Web server 來使用證書文件了,即便的確需要使用,也只需要證書文件及其所在目錄為 nobody:nogroupnobody:nobody,或是證書文件及其所在目錄對其它用戶有可讀權限即可,我認為還是避免使用 root 為好。

不过在用户变为普通用户时,证书之类的文件可能需要手动设置所有者
所以为了避免出现意外,可能用户还是需要保持为 root

直接通過 V2Ray 使用證書文件的情況不多,一般是通過 Web server 來使用證書文件了,即便的確需要使用,也只需要證書文件及其所在目錄為 nobody:nogroupnobody:nobody,或是證書文件及其所在目錄對其它用戶有可讀權限即可,我認為還是避免使用 root 為好。

但是你我都不知道有多少人直接在 v2ray 直接用证书

不过在用户变为普通用户时,证书之类的文件可能需要手动设置所有者
所以为了避免出现意外,可能用户还是需要保持为 root

直接通過 V2Ray 使用證書文件的情況不多,一般是通過 Web server 來使用證書文件了,即便的確需要使用,也只需要證書文件及其所在目錄為 nobody:nogroupnobody:nobody,或是證書文件及其所在目錄對其它用戶有可讀權限即可,我認為還是避免使用 root 為好。

但是你我都不知道有多少人直接在 v2ray 直接用证书

我參考了兩個模板項目的當前狀況。

vTemplate 需要 V2Ray 直接使用證書文件的有:

為 5/16。

v2ray-template 需要 V2Ray 直接使用證書文件的有:

為 4/19。

並且,有許多人是在使用各類第三方腳本進行部署。

我認為修改是值得的,可以先貼出信息,待一定時間後再進行修改。

不过在用户变为普通用户时,证书之类的文件可能需要手动设置所有者
所以为了避免出现意外,可能用户还是需要保持为 root

直接通過 V2Ray 使用證書文件的情況不多,一般是通過 Web server 來使用證書文件了,即便的確需要使用,也只需要證書文件及其所在目錄為 nobody:nogroupnobody:nobody,或是證書文件及其所在目錄對其它用戶有可讀權限即可,我認為還是避免使用 root 為好。

但是你我都不知道有多少人直接在 v2ray 直接用证书

我參考了兩個模板項目的當前狀況。

vTemplate 需要 V2Ray 直接使用證書文件的有:

為 5/16。

v2ray-template 需要 V2Ray 直接使用證書文件的有:

為 4/19。

並且,有許多人是在使用各類第三方腳本進行部署。

我認為修改是值得的,可以先貼出信息,待一定時間後再進行修改。

那就这么做咯

@kslr 我能否在 v2ray/manualv2fly/manual 中寫下相關信息,以保證使用者們有足夠的時間來提前瞭解相關修改呢?

文档中“下载安装”包含了这些信息,更新下就可以了。

已更新:v2fly/manual@9d0d0db

首先,不个人不太赞成 nobody 代替 root
其次,systemctl 的用法与 service 是不一致的,应该是 systemctl start v2ray

已更新:v2fly/manual@9d0d0db

首先,不个人不太赞成 nobody 代替 root
其次,systemctl 的用法与 service 是不一致的,应该是 systemctl start v2ray

多謝指正,稍後將去進行修改。

可以詳細說一下你不贊成使用 nobody 的原因麼?

已更新:v2fly/manual@9d0d0db

首先,不个人不太赞成 nobody 代替 root
其次,systemctl 的用法与 service 是不一致的,应该是 systemctl start v2ray

多謝指正,稍後將去進行修改。

可以詳細說一下你不贊成使用 nobody 的原因麼?

就像之前说的证书问题,还有就是我想不要对 service 文件做的更改太多了(万一有人改了回去呢
顺便 service 不要 After=network-online.target 又 Wants=network-online.target
有些奇葩情况下,因为 NetworkManager-wait-online 等的是 NetworkManager 导致等了没有意义的三十秒

After=network-online.target 就好,其实可以看看现存的 service 是什么

已更新:v2fly/manual@9d0d0db

首先,不个人不太赞成 nobody 代替 root
其次,systemctl 的用法与 service 是不一致的,应该是 systemctl start v2ray

多謝指正,稍後將去進行修改。
可以詳細說一下你不贊成使用 nobody 的原因麼?

就像之前说的证书问题,还有就是我想不要对 service 文件做的更改太多了(万一有人改了回去呢
顺便 service 不要 After=network-online.target 又 Wants=network-online.target
有些奇葩情况下,因为 NetworkManager-wait-online 等的是 NetworkManager 导致等了没有意义的三十秒

After=network-online.target 就好,其实可以看看现存的 service 是什么

證書問題,其實也就是權限問題,通過 root 進行,的確是很方便的,但也為安全問題帶來了隱患。

由 root 降為 nobody,其實就是縮小了 V2Ray 的權限,而犧牲的,則是一定程度上的易用性。

在安全和易用之間,總是要有所選擇,不過單就證書權限而言,其實問題不大,多執行兩三條指令罷了。

至於 .service 文件,目前的參考項目,是和 v2ray-core 中的 .service 文件隔開的。

而就你所說的,互相改來改去的情況,這也正是觀念上的衝突,就像是你我之間,你更贊同使用 root,而我則更贊同使用 nobody 一樣,這也是我之所以要設立一個參考項目,而不是直接動手修改的原因。

我更希望能夠通過討論,得到一個折中的方案。

尤其是,在目前人手緊缺,且精力不夠的情況下,處理歷史遺留問題是相當吃力的。

或許你所考慮的,是更為普遍的使用者們,大多數人或許並不關心權限問題帶來的安全隱患,所需要的,僅僅是能夠跨越長城,走向世界,足矣。

我們的選擇可以有很多,這個參考項目不會成為所謂官方腳本,當人人都在爭作官方的時候,一切就糟糕了。

事實上,原有的腳本也仍然可以拿來修修補補,但嘗試去理解一個,多種風格混合搭配,且缺少註釋的腳本絕非易事。

由於我並不擅長程式工作,這個參考項目,一方面是為了規範安裝路徑,另一方面是為了易於,在後續進行修訂手冊和教程中,有一個較為標誌的參照前提。

終於說到 After 和 Wants 了,如果我的理解沒有問題的話,是指移除 Wants,只保留 After 麼?

我查閱了該站點的內容:
https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/

After=network-online.target
Wants=network-online.target

這將確保在啟動服務之前,所有已配置的網路設備均已啟用並分配了 IP 地址。

但另一個前提是,必須啟用正確的 wait 服務。

After=network-online.target 保證在啟動配置的單元之前已經完全啟動 network-online.target

Wants=network-online.target 則保證啟動配置的單元以符號連結和 network-online.target 建立依賴關係。

我查閱了該站點的內容:
https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/

After=network-online.target
Wants=network-online.target

這將確保在啟動服務之前,所有已配置的網路設備均已啟用並分配了 IP 地址。

但另一個前提是,必須啟用正確的 wait 服務。

注意:这是对不联网就不能用的服务才需要这么设置的

有 Wants= 时,启动之前会尝试把 network-online.target 这个单元启动(我个人认为这会把 属于network-online.target 的服务启动,哪怕它没有被启用
有 After= 时,假设 network-online.target 在启动过程中会等待它启动好之后再启动

已更新:v2fly/manual@9d0d0db

首先,不个人不太赞成 nobody 代替 root
其次,systemctl 的用法与 service 是不一致的,应该是 systemctl start v2ray

多謝指正,稍後將去進行修改。
可以詳細說一下你不贊成使用 nobody 的原因麼?

就像之前说的证书问题,还有就是我想不要对 service 文件做的更改太多了(万一有人改了回去呢
顺便 service 不要 After=network-online.target 又 Wants=network-online.target
有些奇葩情况下,因为 NetworkManager-wait-online 等的是 NetworkManager 导致等了没有意义的三十秒
After=network-online.target 就好,其实可以看看现存的 service 是什么

證書問題,其實也就是權限問題,通過 root 進行,的確是很方便的,但也為安全問題帶來了隱患。

由 root 降為 nobody,其實就是縮小了 V2Ray 的權限,而犧牲的,則是一定程度上的易用性。

在安全和易用之間,總是要有所選擇,不過單就證書權限而言,其實問題不大,多執行兩三條指令罷了。

至於 .service 文件,目前的參考項目,是和 v2ray-core 中的 .service 文件隔開的。

而就你所說的,互相改來改去的情況,這也正是觀念上的衝突,就像是你我之間,你更贊同使用 root,而我則更贊同使用 nobody 一樣,這也是我之所以要設立一個參考項目,而不是直接動手修改的原因。

我更希望能夠通過討論,得到一個折中的方案。

尤其是,在目前人手緊缺,且精力不夠的情況下,處理歷史遺留問題是相當吃力的。

或許你所考慮的,是更為普遍的使用者們,大多數人或許並不關心權限問題帶來的安全隱患,所需要的,僅僅是能夠跨越長城,走向世界,足矣。

我們的選擇可以有很多,這個參考項目不會成為所謂官方腳本,當人人都在爭作官方的時候,一切就糟糕了。

事實上,原有的腳本也仍然可以拿來修修補補,但嘗試去理解一個,多種風格混合搭配,且缺少註釋的腳本絕非易事。

由於我並不擅長程式工作,這個參考項目,一方面是為了規範安裝路徑,另一方面是為了易於,在後續進行修訂手冊和教程中,有一個較為標誌的參照前提。

終於說到 After 和 Wants 了,如果我的理解沒有問題的話,是指移除 Wants,只保留 After 麼?

你说的也很有道理啊……
个人建议 After=network.taget network-online.target nss-lookup.target
保证晚于 network.target 并且域名解析也可以使用,如果有 network-online.target 就等它一会

对于 Wants=,我目前只加了 nss-lookup.target,可能未来考虑扔掉

多謝提供建議,已更正。

v2fly/fhs-install-v2ray@4f6d256

话说为什么去掉了 CAP_NET_RAW

多謝提供建議,已更正。
v2fly/fhs-install-v2ray@4f6d256

话说为什么去掉了 CAP_NET_RAW

這是 CAP_NET_RAW 的權限:

  • Use RAW and PACKET sockets;
  • bind to any address for transparent proxying.

其中第二條可以由 CAP_NET_ADMIN 解決。

參見:http://man7.org/linux/man-pages/man7/capabilities.7.html

多謝提供建議,已更正。

v2fly/fhs-install-v2ray@4f6d256

我 check 這個 commit 的時候發現 Wants 這行整個都不見了,個人認爲還是還是應該把 nss-lookup 加上。
BTW 我很贊同刪去 CAP_NET_RAW 的權限,看起來應該沒問題,不知道你做過透明代理的測試了嗎?

多謝提供建議,已更正。
v2fly/fhs-install-v2ray@4f6d256

我 check 這個 commit 的時候發現 Wants 這行整個都不見了,個人認爲還是還是應該把 nss-lookup 加上。
BTW 我很贊同刪去 CAP_NET_RAW 的權限,看起來應該沒問題,不知道你做過透明代理的測試了嗎?

Wants= 只是建立一個弱依賴關係,該選項中列出的單元,是否啟動成功或失敗,對整個事務的有效性沒有影響,同時也不會影響服務啟動或停止的順序。

已經做過透明代理測試,一切正常。

environment: debian10 on x86-64
issue1: proxy option failure for installation

./install-release.sh -p socks5://127.0.0.1:1080 
./install-release.sh: unknown option -- -

issue2: failed to start v2ray service

● v2ray.service - V2Ray Service
   Loaded: loaded (/etc/systemd/system/v2ray.service; disabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Sat 2020-04-11 00:50:59 HKT; 3s ago
  Process: 9119 ExecStart=/usr/local/bin/v2ray -confdir /usr/local/etc/v2ray/ (code=exited, status=23)
 Main PID: 9119 (code=exited, status=23)

Apr 11 00:50:58 debian systemd[1]: v2ray.service: Main process exited, code=exited, status=23/n/a
Apr 11 00:50:58 debian systemd[1]: v2ray.service: Failed with result 'exit-code'.
Apr 11 00:50:59 debian systemd[1]: v2ray.service: Service RestartSec=100ms expired, scheduling restart.
Apr 11 00:50:59 debian systemd[1]: v2ray.service: Scheduled restart job, restart counter is at 5.
Apr 11 00:50:59 debian systemd[1]: Stopped V2Ray Service.
Apr 11 00:50:59 debian systemd[1]: v2ray.service: Start request repeated too quickly.
Apr 11 00:50:59 debian systemd[1]: v2ray.service: Failed with result 'exit-code'.
Apr 11 00:50:59 debian systemd[1]: Failed to start V2Ray Service.

Solution: Modify /etc/systemd/system/v2ray.service, change User=nobody to User=root

-p socks5://127.0.0.1:1080

issue1 has been resolved: https://github.com/v2fly/fhs-install-v2ray/commit/3a221f7bfd8c0d25dc2f7327aa9035bb71c6b479

I did not meet the situation mentioned in issue2, can you provide the content of your configuration file and related error logs?

https://pastebin.com/

-p socks5://127.0.0.1:1080

issue1 has been resolved: v2fly/fhs-install-v2ray@3a221f7

I did not meet the situation mentioned in issue2, can you provide the content of your configuration file and related error logs?

https://pastebin.com/

这个问题是从老安装脚本go.sh迁移至新安装脚本install-release.sh导致的,属于“兼容性”问题,非全新安装导致
https://www.v2fly.org/chapter_00/install.html#linuxscript 安装指导的Step4

# mv /etc/v2ray/ /usr/local/etc/ 

问题1.原config.json中日志默认目录一般为/etc/v2ray/error.log/etc/v2ray/access.log,这会导致v2ray在新脚本安装后启动失败。
解决方式:修改为/usr/local/etc/v2ray/error.log/usr/local/etc/v2ray/access.log
问题2.原文件access.logerror.log的权限是600,nobody无法修改它,修改为006后解决,nobody不属于原user

Apr 11 09:58:25 debian v2ray[15941]: main: failed to create server > v2ray.com/core/app/log: failed to initialize access logger > open /usr/local/etc/v2ray/access.log: permission denied

以上两个错误不在error.log中,使用journalctl -xe可查看

无日志文件的老用户无此问题

-p socks5://127.0.0.1:1080

issue1 has been resolved: v2fly/fhs-install-v2ray@3a221f7
I did not meet the situation mentioned in issue2, can you provide the content of your configuration file and related error logs?
https://pastebin.com/

这个问题是从老安装脚本go.sh迁移至新安装脚本install-release.sh导致的,属于“兼容性”问题,非全新安装导致
https://www.v2fly.org/chapter_00/install.html#linuxscript 安装指导的Step4

# mv /etc/v2ray/ /usr/local/etc/ 

问题1.原config.json中日志默认目录一般为/etc/v2ray/error.log/etc/v2ray/access.log,这会导致v2ray在新脚本安装后启动失败。
解决方式:修改为/usr/local/etc/v2ray/error.log/usr/local/etc/v2ray/access.log
问题2.原文件access.logerror.log的权限是600,nobody无法修改它,修改为006后解决,nobody不属于原user

Apr 11 09:58:25 debian v2ray[15941]: main: failed to create server > v2ray.com/core/app/log: failed to initialize access logger > open /usr/local/etc/v2ray/access.log: permission denied

以上两个错误不在error.log中,使用journalctl -xe可查看

无日志文件的老用户无此问题

感謝指出問題,稍後將更新手冊說明。

Log 文件可放置於 /var/log/v2ray/ 文件夾當中,即分別為:

  • /var/log/v2ray/access.log
  • /var/log/v2ray/error.log

該文件夾由腳本創建,專為 Log 文件而準備,可執行:

$ ls -al /var/log/v2ray/

進行查看。

Debian 下為 nobody:nogroup,CentOS 下為 nobody:nobody

原有 Log 可直接移除,若要保留原有 Log,修改為一致即可,這裡假定原 Log 的路徑在 /usr/local/etc/v2ray/ 下,以 Debian 為例,即:

# mv /usr/local/etc/v2ray/access.log /var/log/v2ray/
# mv /usr/local/etc/v2ray/error.log /var/log/v2ray/
# chown nobody:nogroup /var/log/v2ray/access.log
# chown nobody:nogroup /var/log/v2ray/error.log

您好,请问一下用新的脚本安装以后,/usr/local/etc/v2ray/目录下会有一系列的.json文件,新的配置是用这些文件吗?因为我按照文件名称把各项配置放进去以后v2ray无法工作,而重新用回旧的config.json就没有问题。还是需要再配置些什么

您好,请问一下用新的脚本安装以后,/usr/local/etc/v2ray/目录下会有一系列的.json文件,新的配置是用这些文件吗?因为我按照文件名称把各项配置放进去以后v2ray无法工作,而重新用回旧的config.json就没有问题。还是需要再配置些什么

这个问题太笼统了,你应该提供错误信息

這是為多文件配置而準備的簡易結構。

每個文件的默認內容都是 {},這不會對 V2Ray 的運行造成影響,具體的配置方式,請參見:
https://www.v2fly.org/chapter_02/multiple_config.html

.
├── 00_log.json
├── 01_api.json
├── 02_dns.json
├── 03_routing.json
├── 04_policy.json
├── 05_inbounds.json
├── 06_outbounds.json
├── 07_transport.json
├── 08_stats.json
└── 09_reverse.json

0 directories, 10 files

這種結構,正好對應不同的對象,可以較為簡單的,對原有的單文件配置進行拆分。

如果你的多文件配置出現問題,請檢查 Log,如果需要幫助,請把 Log 貼到 Pastebin

如果你不需要多文件配置,直接使用單文件 config.json 也是完全沒有問題的。

@dctxmei @kslr 感谢两位的回复,之前在配置的时候没看到多文件配置这一篇,错误的原因在于没有填上log inbonds这些对象名,刚刚按照回复中的文档修改以后已经正常。

多文件配置确实要更易于维护,避免了我单文件配置中由于clients比较多,而需要上下翻几页去找其他项的问题。

多謝提供建議,已更正。

v2fly/fhs-install-v2ray@4f6d256

我现在对 ssl/tls 证书有一个新的想法,开一个组并假设它的名字为 readcert
然后把所有者和所有组设置为 root:readcert
假设某个服务需要读证书,在它的 groups 加 readcert 就有权限读取证书了

我现在对 ssl/tls 证书有一个新的想法,开一个组并假设它的名字为 readcert
然后把所有者和所有组设置为 root:readcert
假设某个服务需要读证书,在它的 groups 加 readcert 就有权限读取证书了

我觉得这个问题不应该交给systemd处理,而是由v2ray处理。参考nginx等web服务器的实现:主进程以root权限运行,子进程降权后在需要的情况下跟主进程通信。

我现在对 ssl/tls 证书有一个新的想法,开一个组并假设它的名字为 readcert
然后把所有者和所有组设置为 root:readcert
假设某个服务需要读证书,在它的 groups 加 readcert 就有权限读取证书了

我觉得这个问题不应该交给systemd处理,而是由v2ray处理。参考nginx等web服务器的实现:主进程以root权限运行,子进程降权后在需要的情况下跟主进程通信。

不见得它好

请教一下各位,这两行,为什么要把.service文件以755的权限安装?
目前我系统的该目录下的大部分相类似的.service文件都是644权限的,所以我也已手动chmod 644 v2ray.service,可以正常启动服务。

请教一下各位,这两行,为什么要把.service文件以755的权限安装?
目前我系统的该目录下的大部分相类似的.service文件都是644权限的,所以我也已手动chmod 644 v2ray.service,可以正常启动服务。

755 对于配置文件没有意义
给他们开 issue/pr 吧

FHS 的全稱為「Filesystem Hierarchy Standard」,直譯為「文件系統層次結構標準」。

以下為官方站點:

目前 V2Ray 官方腳本的安裝路徑完全不符合 FHS,以下為當前的安裝路徑:

  • /usr/bin/v2ray/v2ray
  • /usr/bin/v2ray/v2ctl
  • /usr/bin/v2ray/geoip.dat
  • /usr/bin/v2ray/geosite.dat
  • /etc/v2ray/config.json

嚴格來講,這並不利於服務器系統的管理,因為非包管理系統安裝的軟體應當放置於 /usr/local 下,依據「4.9. /usr/local : Local hierarchy」,則路徑為:

  • /usr/local/bin/v2ray
  • /usr/local/bin/v2ctl
  • /usr/local/lib/v2ray/geoip.dat
  • /usr/local/lib/v2ray/geosite.dat
  • /usr/local/etc/v2ray/config.json

並且,修改路徑也必定要修改啟動服務文件。

這裡有一個參考項目:
https://github.com/v2fly/fhs-install-v2ray

在此,請各位對其加以審查,確定無誤後,將著手對官方腳本的修改。

對官方腳本的修改並不會影響到各類一鍵腳本,卻會影響到一些相關教程,對此,我認為,教程可以修改,但是,使用規範的安裝路徑,比使用不規範的安裝路徑要好很多。

我之前就一直觉得为什么会往/usr/bin/下创建文件夹,毕竟不管哪个bin目录,都是用来直接放二进制可执行的文件的。

FHS 的全稱為「Filesystem Hierarchy Standard」,直譯為「文件系統層次結構標準」。
以下為官方站點:

目前 V2Ray 官方腳本的安裝路徑完全不符合 FHS,以下為當前的安裝路徑:

  • /usr/bin/v2ray/v2ray
  • /usr/bin/v2ray/v2ctl
  • /usr/bin/v2ray/geoip.dat
  • /usr/bin/v2ray/geosite.dat
  • /etc/v2ray/config.json

嚴格來講,這並不利於服務器系統的管理,因為非包管理系統安裝的軟體應當放置於 /usr/local 下,依據「4.9. /usr/local : Local hierarchy」,則路徑為:

  • /usr/local/bin/v2ray
  • /usr/local/bin/v2ctl
  • /usr/local/lib/v2ray/geoip.dat
  • /usr/local/lib/v2ray/geosite.dat
  • /usr/local/etc/v2ray/config.json

並且,修改路徑也必定要修改啟動服務文件。
這裡有一個參考項目:
https://github.com/v2fly/fhs-install-v2ray
在此,請各位對其加以審查,確定無誤後,將著手對官方腳本的修改。
對官方腳本的修改並不會影響到各類一鍵腳本,卻會影響到一些相關教程,對此,我認為,教程可以修改,但是,使用規範的安裝路徑,比使用不規範的安裝路徑要好很多。

我之前就一直觉得为什么会往/usr/bin/下创建文件夹,毕竟不管哪个bin目录,都是用来直接放二进制可执行的文件的。

那是包管理器放置包的位置

@unknowndev233 是的,第三方安装的可执行文件一般是放/usr/local/bin/比较多,但我的意思是,就算是往/usr/bin/放,那也不应该放文件夹,而应该只放可执行文件。

@unknowndev233 是的,第三方安装的可执行文件一般是放/usr/local/bin/比较多,但我的意思是,就算是往/usr/bin/放,那也不应该放文件夹,而应该只放可执行文件。

是的,但是这是很久以前的历史问题了,不是很快就可以解决的

@unknowndev233 是的,第三方安装的可执行文件一般是放/usr/local/bin/比较多,但我的意思是,就算是往/usr/bin/放,那也不应该放文件夹,而应该只放可执行文件。

是的,但是这是很久以前的历史问题了,不是很快就可以解决的

嗯嗯,就是说说哈哈,这个issue不就是解决这个问题的嘛,新的安装方法都有了。

@unknowndev233 是的,第三方安装的可执行文件一般是放/usr/local/bin/比较多,但我的意思是,就算是往/usr/bin/放,那也不应该放文件夹,而应该只放可执行文件。

是的,但是这是很久以前的历史问题了,不是很快就可以解决的

嗯嗯,就是说说哈哈,这个issue不就是解决这个问题的嘛,新的安装方法都有了。

不过目前它不是主流,并且 .dat 的位置有些不准确

@unknowndev233 是的,第三方安装的可执行文件一般是放/usr/local/bin/比较多,但我的意思是,就算是往/usr/bin/放,那也不应该放文件夹,而应该只放可执行文件。

是的,但是这是很久以前的历史问题了,不是很快就可以解决的

嗯嗯,就是说说哈哈,这个issue不就是解决这个问题的嘛,新的安装方法都有了。

不过目前它不是主流,并且 .dat 的位置有些不准确

哦?.dat 文件是不是要跟v2ray可执行文件放一起?因为我看配置文件里也没有引用这个文件,所以只能怀疑是v2ray可执行文件直接读取当前目录下的dat了,不知道是不是这样?我是没去了解原理。

@unknowndev233 是的,第三方安装的可执行文件一般是放/usr/local/bin/比较多,但我的意思是,就算是往/usr/bin/放,那也不应该放文件夹,而应该只放可执行文件。

是的,但是这是很久以前的历史问题了,不是很快就可以解决的

嗯嗯,就是说说哈哈,这个issue不就是解决这个问题的嘛,新的安装方法都有了。

不过目前它不是主流,并且 .dat 的位置有些不准确

哦?.dat 文件是不是要跟v2ray可执行文件放一起?因为我看配置文件里也没有引用这个文件,所以只能怀疑是v2ray可执行文件直接读取当前目录下的dat了,不知道是不是这样?我是没去了解原理。

不是,.dat 其实更适合放在 /usr/share
因为它与主机无关

@unknowndev233 是的,第三方安装的可执行文件一般是放/usr/local/bin/比较多,但我的意思是,就算是往/usr/bin/放,那也不应该放文件夹,而应该只放可执行文件。

是的,但是这是很久以前的历史问题了,不是很快就可以解决的

嗯嗯,就是说说哈哈,这个issue不就是解决这个问题的嘛,新的安装方法都有了。

不过目前它不是主流,并且 .dat 的位置有些不准确

哦?.dat 文件是不是要跟v2ray可执行文件放一起?因为我看配置文件里也没有引用这个文件,所以只能怀疑是v2ray可执行文件直接读取当前目录下的dat了,不知道是不是这样?我是没去了解原理。

不是,.dat 其实更适合放在 /usr/share
因为它与主机无关

哦哦

建议在install.direct 中附上文件结构的修改通知

geoip.dat 和 geosite.dat 原被放置在 /usr/local/lib/v2ray/ 當中。

這實際上不符合 FHS,現已被修正為 /usr/local/share/v2ray/

08-16 前受此錯誤影響的用者,請按照以下示例進行修正:

# mv /usr/local/lib/v2ray/ /usr/local/share/
# systemctl edit --full v2ray.service

Environment=V2RAY_LOCATION_ASSET=/usr/local/share/v2ray/
# systemctl edit --full [email protected]

Environment=V2RAY_LOCATION_ASSET=/usr/local/share/v2ray/

issue v2fly/fhs-install-v2ray#43

虽然这么做很合理,但是也没必要把以前的安装脚本费了吧?毕竟都是bash脚本,替换了不行么?判断下安装版本不就得了?

這裡』有你需要的,你可以建立一個 Fork。

感觉你们被微软程序员洗脑了:
你行你上
我们是为了符合规则
没有bug的项目称不上伟大
先上再说,啥事都是重装系统再来一遍就能解决的.

感觉你们被微软程序员洗脑了:
你行你上
我们是为了符合规则
没有bug的项目称不上伟大
先上再说,啥事都是重装系统再来一遍就能解决的.

只是不想守着有历史问题的老古董

虽然这么做很合理,但是也没必要把以前的安装脚本费了吧?毕竟都是bash脚本,替换了不行么?判断下安装版本不就得了?

同时维护两个安装脚本很费精力,这次旧安装脚本被废除就是因为它会按照旧文件名来下载 v2ray-core 的 release 来安装,但上游已经改变了 release assets 的命名方式,导致无法使用。
烦请您注意,这是个开源项目,参与者都是用爱发电,没有什么非得照着你的意思来。所谓你行你上在这里就是如果别人对你的需要不感兴趣,那你想实现它就只能自己来——这个道理实在很简单,不要说得好像有什么似的。
而且你希望旧的脚本继续工作,自己又不出力,那就是求人办事。我不知道你求人办事时习惯用什么态度,但至少我不会开篇就贬低别人,而且还是一句话就贬低微软和 v2ray 两组人。
最后希望你重新学习一下 bug 的定义。

新版本怎么用啊,能给个方法吗?不会安装了
以前的用不了了
bash <(curl -L -s https://install.direct/go.sh)

新版本怎么用啊,能给个方法吗?不会安装了
以前的用不了了
bash <(curl -L -s https://install.direct/go.sh)

我找到这个可以
https://blog.google404.org/72/

新版本怎么用啊,能给个方法吗?不会安装了
以前的用不了了
bash <(curl -L -s https://install.direct/go.sh)

总结了一个「升级」步骤,从「 bash <(curl -L -s https://install.direct/go.sh)」 升级到 「bash <(curl https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)」 :

  1. 停止 V2Ray 服務
    systemctl disable v2ray.service --now

  2. 移除原有文檔
    rm -r /usr/bin/v2ray/
    rm /etc/systemd/system/v2ray.service
    rm /lib/systemd/system/v2ray.service
    rm /etc/init.d/v2ray

  3. 迁配置文檔
    mv /etc/v2ray/ /usr/local/etc/

  4. 使用新的安装脚本
    bash <(curl https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)

  5. 设置为开机自动启动
    systemctl enable v2ray

  6. 启动v2ray服务,完工
    systemctl start v2ray

Ubuntu 18.04 安装后只能用命令行运行,不能用service运行。service v2ray restart 后 htop 搜索不到 v2ray,进程没启动成功.
我现在是以screen的方式运行的

@Ardentwheel 我是Ubuntu20.04,你试试用我这个:

[Unit]
Description=V2Ray Service
After=network.target nss-lookup.target

[Service]
User=root
Type=simple
#CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
#AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
#NoNewPrivileges=true
Environment=V2RAY_LOCATION_ASSET=/usr/local/lib/v2ray/
ExecStart=/usr/local/bin/v2ray -confdir /usr/local/etc/v2ray/
Restart=on-failure

[Install]
WantedBy=multi-user.target

不过要注意一下这句:

ExecStart=/usr/local/bin/v2ray -confdir /usr/local/etc/v2ray/

我用的是分文件配置,你如果是单配置文件应该换成:

ExecStart=/usr/local/bin/v2ray -config /usr/local/etc/v2ray/config.json

是证书权限的问题,已经修复了,谢谢

Was this page helpful?
0 / 5 - 0 ratings