最近闲下来上线了下很早之前装了Gentoo的vps，想着维护更新下系统，遇到了一些常见更新问题记录分享下由于系统有段时间没更新了，系统里的portage只支持EAPI 7，python还是3.7版本。最新的portage的EAPI已经到8了且最低要求3.8版本的python，直接更新emerge -auvDN @world是行不通的直接运行emerge --oneshot sys-apps/portage会遇到EAPI的版本问题。比较稳妥的办法是先在make.conf里改好想用的满足portage最低版本要求的新的python版本（PYTHON_TARGETS，记得删掉3.7的target）并单独更新python：PYTHON_TARGETS="python3_9" emerge -av dev-lang/python:3.9成功更新完python后就可以再单独更新portage了(注意这里用了--nodeps参数是用来跳过一些死依赖的)：PYTHON_TARGETS="python3_9" emerge -av1O portage更新完portage后又遇到了perl的更新问题，这个和portage一样跳过死循环单独更新即可：emerge -av1O perl更新完后补上perl的依赖：perl-cleaner --all最后更新@world应该就没有什么大问题了，无非就是处理下USE。由于是跑服务的系统，这次的USE改动主要为加了条-gui最后就可以跑起emerge -auvDN @world了记得最后emerge --depclean
之前尝试过lvm-cache与bcache，发现性能都挺。。。这篇文章就想记录下我目前使用的新方案硬盘组合是：一块256G的nvme固态硬盘俩块2T的机械硬盘这里简单说下我之前使用的方案吧：俩块HDD使用mdadm组raid1，使用luks加密，并格式化为bcache后端设备，使用btrfs文件系统SSD分512M为EFI分区，余下空间格式化为bcache的缓存设备。看起来没什么毛病，但是实际使用时，如果有大量/大型文件的读写就会造成系统卡顿，且一些命令都会卡住忍到了最近，入了块能容下之前系统数据的移动硬盘备份包了数据本来想换回lvm-cache的，但觉得这货应该也不会比bcache好到哪里于是想到了工作时做chroot环境用到的mount --bind xxx xxx经过实验和重装是可行的：... /dev/mapper/data /mnt/data btrfs defaults 0 0 /mnt/data/home /home none bind 0 0 /mnt/data/var /var none bind 0 0 ...这里的/dev/mapper/data是mdadm组raid1使用luks加密后的块设备，在/etc/crypttab里写入解密的配置让系统启动时自动解密为/dev/mapper/data把它当作数据盘挂载在/mnt/data后在里面创建home和var目录，之所以选择这俩目录挂载到机械硬盘是因为这俩个目录的读写最频繁且数据量最大（home不用说，var是各类软件丢数据和日志的地方）如果你固态硬盘足够大或者对var目录里的读写有性能要求可以改成如下：... /dev/mapper/data /mnt/data btrfs defaults 0 0 /mnt/data /home none bind 0 0 ...要注意的是/dev/mapper/data一定要写在它们前面，因为系统是按顺序挂载的
由于pixelbook的半残不废加上出差在外，想换个续航叼且Linux友好的无独显笔记本。同事之前推荐过2018款的LG Gram就一直关注着这个系列，之后出了2019款便想着入手了。淘宝上有加装内存且有保修的店家，但价格还是不太理想，所以终于等到618京东稍微降了点价就入了（白条分期+信用卡，留下了没钱的眼泪），上手用了一段时间后自己加装了8G内存（编译 Gentoo 终于不用怕经常爆内存了，还能丢tmpfs编译）因为有了雷电接口，部分 Linux 发行版会开机时刷 acpi error 错误造成很大概率不能正常启动，对于 5.x.x 的内核可以直接通过加入 pci=nommconf 内核参数解决。LG gram目前未解决的问题有：设置功能键未正常驱动，可以设置快捷键启动设置禁用/启用触摸板的功能键未正常驱动，可以设置快捷键但状态灯不会变化阅读模式的功能键未正常驱动，可以安装 redshift 并配合 plasma 插件+快捷键获得较完美的体验充电到 80% 自动断电的功能未正常驱动，目前无解决方案，不过不要紧以下列出下它目前Gentoo的主要配置：/etc/portage/make.conf:COMMON_FLAGS="-march=native -O2 -pipe" CFLAGS="${COMMON_FLAGS}" CXXFLAGS="${COMMON_FLAGS}" FCFLAGS="${COMMON_FLAGS}" FFLAGS="${COMMON_FLAGS}" MAKEOPTS="-j6" # NOTE: This stage was built with the bindist Use flag enabled PORTDIR="/usr/portage" DISTDIR="/usr/portage/distfiles" PKGDIR="/usr/portage/packages" # This sets the language of build output to English. # Please keep this setting intact when reporting bugs. LC_MESSAGES=C #GENTOO_MIRRORS="https://mirrors.ustc.edu.cn/gentoo/" GENTOO_MIRRORS="https://mirrors.tuna.tsinghua.edu.cn/gentoo/" EMERGE_DEFAULT_OPTS="--keep-going --with-bdeps=y" #EMERGE_DEFAULT_OPTS="--keep-going --with-bdeps=y --load-average --jobs=5" FEATURES="ccache userfetch" CCACHE_SIZE="15G" ACCEPT_KEYWORDS="~amd64" ACCEPT_LICENSE="*" L10N="en-US zh-CN en zh" LINGUAS="en_US zh_CN en zh" VIDEO_CARDS="intel i965" CPU_FLAGS="aes avx avx2 f16c fma3 mmx mmxext pclmul popcnt sse sse2 sse3 sse4_1 sse4_2 ssse3" CPU_FLAGS_X86="${CPU_FLAGS}" # USE BASE_SYSTEM="-plymouth btrfs device-mapper libkms -grub systemd pulseaudio networkmanager bluetooth touchpad mtp cryptsetup iptables initramfs gnuefi lvm" APP="konsole dolphin cups fcitx chromium telegram -nautilus 7zip rar vim samba cups" DESKTOP="kvantum user-session infinality emoji cjk gtk gtk3 legacy-systray -gnome gnome-keyring -gnome-shell browser-integration crypt display-manager sddm" ELSE="-bindist vim-syntax git bash-completion client icu python brightness-control vaapi" USE="${BASE_SYSTEM} ${APP} ${DESKTOP} ${ELSE}" FUCK_FONTS="/usr/share/fonts/arphicfonts" INSTALL_MASK="${FUCK_FONTS}" RUBY_TARGETS="ruby26 ruby25" LLVM_TARGETS="X86"/etc/portage/package.use/default:dev-lang/python sqlite sys-apps/dbus user-session sys-kernel/gentoo-sources experimental symlink app-portage/layman sync-plugin-portage net-wireless/wpa_supplicant -qt5 app-i18n/fcitx gtk3 opencc app-admin/keepassxc yubikey autotype network browser net-misc/remmina ssh rdp vnc app-editors/vim lua luajit perl ruby terminal app-office/libreoffice java app-crypt/pinentry gnome-keyring # pulseaudio-modules-bt media-sound/pulseaudio -bluetooth # Qtox media-video/ffmpeg webp v4l # Neofetch www-client/w3m imlib # Fish dev-libs/libpcre2 pcre32 # Chromium www-client/chromium widevine jumbo-build net-libs/nodejs inspectorkernel cmdline:dolvm crypt_root=UUID=1758cbec-afa7-434f-84a7-5afb7270bccf resume=/dev/mapper/system-swap root=/dev/mapper/system-root root_trim=yes quite loglevel=0 pci=nommconfkernel-config 又又又水了一篇文章，嘿嘿嘿
富强、民主、文明、和谐自由、平等、公正、法治爱国、敬业、诚信、友善更新19.4.8更新权限配置ServerTrojan这里还是说在Debian上的搭建方式首先建议你升级到Debian 10（buster）：apt update apt dist-upgrade cp /etc/apt/sources.list /etc/apt/sources.list.bak sed -i 's/stretch/buster/g' /etc/apt/sources.list #将stretch更换为你的codename apt update apt dist-upgrade apt --purge autoremove然后安装Trojan：apt install trojanTrojan的配置位于/etc/trojan.json编辑它将"password":内的值改为你自己的密码"cert":和"key":改为你网站的ssl证书和私钥通过acme申请证书：# 安装acme curl https://get.acme.sh | sh echo 'alias acme.sh=~/.acme.sh/acme.sh' >> ~/.bashrc source ~/.bashrc # 声明Cloudflare帐号与API KEY并申请证书(在这个[页面](https://www.cloudflare.com/a/profile)点击Global API Key--->View API Key即可看到): export CF_Key="你的API KEY" export CF_Email="你的邮箱" acme.sh --issue --dns dns_cf -d google.com -d *.google.com #这里的google.com换成你的域名 # 安装证书： mkdir -p /etc/letsencrypt/live/google.com/ acme.sh --installcert -d google.com \ # 记得更改域名 --key-file /etc/letsencrypt/live/google.com/privkey.pem \ # 记得更改域名 --fullchain-file /etc/letsencrypt/live/google.com/fullchain.pem \ # 记得更改域名 --reloadcmd "chown -R nginx:nginx /etc/letsencrypt/ && systemctl restart trojan" # 这里的nginx注意修改为nginx使用的用户名（完整内容可以阅读这篇文章）其他可保持默认如果你使用Nginx，则建议将trojan服务(/lib/systemd/system/trojan.service)的运行用户修改为nginx或www-data（其它web server用对应的用户也可以）：... User=nginx # 或www-data ...否则将证书的权限开放出来（不建议）:chmod 755 -R /etc/letsencrypt/ # 记得修改acme.sh的--reloadcmd参数启用服务：systemctl enable trojan systemctl start trojanNginxTrojan对于非Trojan客户端的请求都会转向服务端本地80端口（仍是443端口），这里选用nginx作为web服务器apt install nginx nano /etc/nginx/sites-enabled/default所以nginx的配置不能写有监听443，监听在本地的80端口即可至于其它配置照常写就行了（关于ssl证书等配置将无效）如果你还希望运行v2ray则加上（因为trojan还没有像样的手机客户端，所以只能先跑个v2ray）：... location /download { proxy_redirect off; proxy_pass http://localhost:1234; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $http_host; } ...启动Nginx：systemctl enable nginx systemctl start nginxV2rayV2ray的TLS+websocket+Nginx应该是最稳的方案之一了但是延迟却比较感人，且因为GO未支持tls1.3还只能用tls1.2wget https://install.direct/go.sh -O v2ray.sh bash v2ray.sh更改配置:rm /etc/v2ray/config.json nano /etc/v2ray/config.json写入(请注意并删除中文注释）：{ "outbound": { "streamSettings": null, "tag": null, "protocol": "freedom", "mux": null, "settings": null }, "log": { "access": "/var/log/v2ray/access.log", "loglevel": "info", "error": "/var/log/v2ray/error.log" }, "outboundDetour": [{ "tag": "direct", "protocol": "freedom", "settings": null }, { "tag": "blocked", "protocol": "blackhole", "settings": null } ], "inbound": { "streamSettings": { "network": "ws", "kcpSettings": null, "wsSettings": { "path": "/download" #这里必须和Nginx配置中"/download"的路径一样 }, "tcpSettings": null, "tlsSettings": {}, "security": "" }, "settings": { "ip": null, "udp": true, "clients": [{ "alterId": 100, "security": "none", "id": "xxxx-xxxx-xxxx-xxxx" #请访问 https://www.uuidgenerator.net/ 获取UUID并改入 }], "auth": null }, "protocol": "vmess", "port": 1234, #这里的端口也必须和Nginx配置中"/download"的端口一样 "listen": null }, "inboundDetour": null, "routing": { "settings": { "rules": [{ "ip": [ "0.0.0.0/8", "10.0.0.0/8", "100.64.0.0/10", "127.0.0.0/8", "169.254.0.0/16", "172.16.0.0/12", "192.0.0.0/24", "192.0.2.0/24", "192.168.0.0/16", "198.18.0.0/15", "198.51.100.0/24", "203.0.113.0/24", "::1/128", "fc00::/7", "fe80::/10" ], "domain": null, "type": "field", "port": null, "outboundTag": "blocked" }], "domainStrategy": null }, "strategy": "rules" }, "dns": null } # 你可真鸡儿长启动V2ray服务：systemctl enable v2ray systemctl start v2rayClientTrojanCient配置文件示例(注意并删除中文注释)：{ "run_type": "client", "local_addr": "127.0.0.1", "local_port": 这里为你本地的socks5代理端口，例如1080, "remote_addr": "这里改为你网站的地址，例如google.com", "remote_port": 这里改为你的端口，例如443, "password": ["这里改为你的密码"], "append_payload": true, "log_level": 1, "ssl": { "verify": true, "verify_hostname": true, "cert": "", "cipher": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA", "sni": "这里改为你网站的地址，例如google.com", "alpn": [ "h2", "http/1.1" ], "reuse_session": true, "curves": "", "sigalgs": "" }, "tcp": { "keep_alive": true, "no_delay": true, "fast_open": true, "fast_open_qlen": 5 } }当然，你可以使用这个生成配置：https://trojan-gfw.github.io/trojan-config-gen/记得启用服务：Gentoo:rc-update add trojan default rc-service trojan startsystemd:systemctl enable trojan systemctl start trojanKnown issues如果你的Server有ipv6 IP修改/etc/gai.conf加入或去掉注释以下内容然后重启网络（简单重启也行）：precedence ::ffff:0:0/96 100CommunityTelegram GroupTelegram ChannelV2ray这货配置文件太鸡儿长了对于json配置我还是直接丢链接吧：https://github.com/KiriKira/vTemplate这里说下V2ray手动配置(Android客户端为例，不建议直接导入使用json配置）：###服务器### 主机：域名（无路径） 端口： 443 用户ID：填server的UUID Alterid： 100 加密方式：none 用户等级： 0 网络： WebSocket 或 ws 加密方式： tls 服务器证书域名： 不填 允许不安全连接： 关闭 WebSocket或ws路径： /download HTTP头： 不填
更新：2019-01-23，增加“单独编译某个模块并加载使用”。单独编译某个模块并加载使用比如我想编译r8822be模块（网卡驱动）,你需要先找到它的位置：cd /usr/src/linux grep -rin "r8822be*" | grep Makefile进入目录并编译模块：cd /usr/src/linux/drivers/staging/rtlwifi make CONFIG_R8822BE=m -C /lib/modules/`uname -r`/build/ M=$PWD modules在当前系统中加载模块：mkdir /lib/modules/`uname -r`/kernel/net/r8822be -p cp r8822be.{mod.o,ko} /lib/modules/`uname -r`/kernel/net/r8822be -v depmod modprobe r8822be不使用initramfs启动系统进入目录并打开配置界面:cd /usr/src/linux make menuconfig 进入 General Setup关掉Initial RAM filesystem and RAM disk (initramfs/initrd) support如果你的fstab用的是UUID,则建议先改成/dev/sdX的格式把你所有的modules编译进内核即built-in状态然后开始编译吧这里我就不说GRUB相关的配置了,因为我没有尝试过,具体请看这里用的是接下来要说的efibootmgr启动系统使用efibootmgr启动系统进入目录并打开配置界面:cd /usr/src/linux make menuconfig 你要确保已启用所有必须的efi相关选项进入 Processor type and features 搜索 Built-in kernel command line 并启用然后会出现 Built-in kernel command string填入 root=/dev/sda2或者root=PARTUUID=xxxxsda2换成你实际的根目录所在分区或通过blkid查看根分区的PARTUUID然后开始编译吧首先确保efibootmgr已安装:emerge -av efibootmgr 创建目录(可选):mkdir -p /boot/efi/boot 将你的内核复制到对应目录(或者直接复制到boot):cp /boot/vmlinuz-* /boot/efi/boot/bootx64.efi 查看是否已挂载efivars:mount | grep efivars 重新挂载efivars为可读写:mount -o remount,rw -t efivarfs efivarfs /sys/firmware/efi/efivars 这里说下efibootmgr的参数:--create (-c) 创建新的启动项 --part (-p) efi分区的的序号,假设是/dev/sda2 则值为2 --disk (-d) efi分区所在的磁盘,例如/dev/sda --label (-L) 启动项的名称 --loader (-l) 可启动的efi文件所在处(efibootmgr路径用的是\不是/) 示例添加启动项:efibootmgr --create --disk /dev/sda --part 2 --label "Gentoo" --loader "\efi\boot\bootx64.efi" 这里也简单说下删除启动项的参数:--bootnum (-b) 启动项的识别号(通过efibootmgr -v查看,例如Boot0001则值为1) --delete-bootnum (-B) 进行删除 删除示例:efibootmgr -b 2 -B 将Intel-ucode编译进内核进入目录并打开配置:cd /usr/src/linux make menuconfig 确保在Processor type and features里已选上CPU microcode loading support和你对应的CPU microcode loading support例如Intel CPU选中Intel microcode loading support然后进入Device Drivers ---> Generic Driver Options启用Include in-kernel firmware blobs in kernel binaryFirmware blobs root directory填入: /lib/firmware/另开终端安装源文件(注意查看这里的输出):emerge -av sys-firmware/intel-microcode 查看你的microcode:dmesg | grep microcode 查看sig值,例如sig=0x306c3然后查看intel-ucode文件:ls /lib/firmware/intel-ucode 你就会找到与sig值对应的06-3c-03(前面安装时会输出对应的microcode)最后按/搜索EXTRA_FIRMWARE并在此选项中填入:intel-ucode/06-3c-03 如果在编译时无报错就OK了更新内核重启之后运行dmesg | grep microcode应该看到类似如下的输出:[ 0.000000] microcode: microcode updated early to revision 0x22, date = 2017-01-27 [ 0.579838] microcode: sig=0x306c3, pf=0x20, revision=0x22 [ 0.579948] microcode: Microcode Update Driver: v2.2. 等我想到,暂时就写这么多
部分参考：Building your First Package需要安装的软件：dh-makedpkg-dev创建工作目录：mkdir hello-1.0要求为“包名+版本号”初始化目录（创建必要的文件）：cd hello-1.0/ dh_make --native #本地的这里的包类型我们选择single（其它类型会在之后的文章说，可能）Type of package: (single, indep, library, python) [s/i/l/p]?之后输入y确认生成这时候你当前的目录应该就多了个debian目录编辑debian/control看到如下:Source: hello Section: unknown Priority: optional Maintainer: user <user@unknown> Build-Depends: debhelper (>= 9) Standards-Version: 3.9.8 Homepage: <insert the upstream URL, if relevant> #Vcs-Git: https://anonscm.debian.org/collab-maint/hello.git #Vcs-Browser: https://anonscm.debian.org/cgit/collab-maint/hello.git Package: hello Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: <insert up to 60 chars description> <insert long description, indented with spaces>Section是分类，这里改成miscMaintainer是维护者，这里随意（必须为“名字+空格+<邮箱>”的格式）Homepage是软件的主页，这里作为示例故保留原样Package决定了你的包名Architecture是构架支持，如果是元数据（脚本，媒体文件，文本）可以不管Depends是依赖，这里作为示例是没有依赖的故保留原样Description是软件介绍，不可写太长（最长60个字符，多的另外起行，用空格缩进）这里还有个debian/changelog文件用于记录修改，这里不做修改。（之后建议使用dch处理这个文件）最后还有个关于版权的文件debian/copyright，同样这里作为示例不做修改创建一个脚本：mkdir -p usr/bin/ cat << EOF > usr/bin/hello.sh #!/bin/bash echo hello EOF chmod +x usr/bin/hello.sh你可以再丢个文本：mkdir -p usr/share/doc/hello cat << EOF > usr/share/doc/hello/README Hello EOF新建.install文件：cat << EOF > debian/hello.install usr/* usr你或许发现了，这里的usr/xxx/xxx都是相对于系统的目录的路径创建的，而.install文件则是告诉包管理如何处理这些文件（将包根目录内的usr目录复制到系统的usr目录）生成.dsc与源码包，这些东西就是你在Debian 软件源pool目录看到的那堆东西了：dpkg-source -b .构建deb包，这里因为是meta包，可以直接构建，一般情况下建议使用pbuilder构建，之后的文章会写：dpkg-buildpackage -us -uc生成的文件都在上一级目录最后你就可以试试安装你创建的deb包了：dpkg -i ../hello_1.0_amd64.deb #构架名称可能不同试试运行下吧：user@hostname:~/hello-1.0$ hello.sh hello
本文章随时可能停止更新或未及时更新，仅作参考参考文章：Raspberry Pi 3 64 bit InstallEmbedded Handbook/General/Compiling with qemu user chroot准备：树莓派3Bsd卡 >=8G读卡器正常运行的Gentoo系统（其它系统请自行决策）开始：环境Crossdev先安装好交叉编译环境：emerge --ask sys-devel/crossdev crossdev -t aarch64-unknown-linux-gnu如果提示：error: please convert /etc/portage/package.env to a directory则运行如下命令并重新运行crossdev -t aarch64-unknown-linux-gnu：mv /etc/portage/package.env /etc/portage/package.env_file mkdir /etc/portage/package.env mv /etc/portage/package.env_file /etc/portage/package.env运行gcc-config -l显示aarch64-unknown-linux-gun-x.x.x确认安装成功Qemu更改配置：echo app-emulation/qemu static-user >> /etc/portage/package.use echo 'QEMU_SOFTMMU_TARGETS="alpha aarch64 arm i386 mips mips64 mips64el mipsel ppc ppc64 s390x sh4 sh4eb sparc sparc64 x86_64"' >> /etc/portage/make.conf echo 'QEMU_USER_TARGETS="alpha aarch64 arm armeb i386 mips mipsel ppc ppc64 ppc64abi32 s390x sh4 sh4eb sparc sparc32plus sparc64"' >> /etc/portage/make.conf安装：emerge --ask app-emulation/qemu创建二进制包（重要）：quickpkg app-emulation/qemu假设你已正确配置好qemu相关的内核选项且已启用CONFIG_BINFMT_MISC：[ -d /proc/sys/fs/binfmt_misc ] || modprobe binfmt_misc [ -f /proc/sys/fs/binfmt_misc/register ] || mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc注册：echo ':aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-aarch64:' > /proc/sys/fs/binfmt_misc/register启用并启动binfmt服务(如果不常用可以只启动）：# openRC: rc-update add qemu-binfmt rc-service qemu-binfmt start # systemd: systemctl enable systemd-binfmt systemctl restart systemd-binfmt编译内核&驱动安装git（如果你没安装的话）：emerge --ask dev-vcs/git创建工作目录：mkdir raspberrypi克隆rpi的firmware：cd raspberrypi git clone https://github.com/raspberrypi/firmwarePS：如果你的clone速度捉急。。。可以加上--depth=1参数克隆rpi的内核源码：git clone https://github.com/raspberrypi/linux进入内核源码目录选择版本：cd linux git branch -a #查看最新的版本 git checkout XXX # 这里的XXX换成最新版本的内核，比如：rpi-4.14.y生成rpi3内核的默认配置并打开配置界面：ARCH=arm64 CROSS_COMPILE=aarch64-unknown-linux-gnu- make bcmrpi3_defconfig ARCH=arm64 CROSS_COMPILE=aarch64-unknown-linux-gnu- make menuconfig在内核选项中：CPU Power Management ---> CPU Frequency scaling ---> Default CPUFreq governor (powersave) --->选择为performance这里你也可以自己更改内核配置（如果你了解的话）开始编译内核：ARCH=arm64 CROSS_COMPILE=aarch64-unknown-linux-gnu- make -jX #X换成你的核心数分区&安装stage3sd卡插读卡器插电脑使用你喜欢的分区工具调整为如下：/dev/sdX1 boot vfat 128M /dev/sdX2 swap >=2G /dev/sdX3 ext4 free space格式化：mkfs -t vfat -F 32 /dev/sdX1 mkswap /dev/sdX2 mkfs -i 8192 -t ext4 /dev/sdX3 # wiki说这个-i 8192挺重要的挂载分区：mkdir /mnt/gentoo mount /dev/sdX3 /mnt/gentoo cd /mnt/gentoo从这里下载最新的stage3并解压:wget http://distfiles.gentoo.org/experimental/arm64/`wget -q http://distfiles.gentoo.org/experimental/arm64/ && grep -o stage3-arm64-.........tar.bz2 index.html | head -1` tar vxpf stage3-*.tar.bz2 --xattrs-include='*.*' --numeric-owner .安装内核挂载boot分区：mount /dev/sdX1 /mnt/gentoo/boot将raspberrypi目录中的/firmware/boot/*复制到/mnt/gentoo/boot：cp -r path/to/raspberrypi/firmware/boot/* /mnt/gentoo/boot安装内核：cp /path/to/raspberrypi/linux/arch/arm64/boot/Image /mnt/gentoo/boot/kernel8.img更换原32bit的设备树为64bit：mv /mnt/gentoo/boot/bcm2710-rpi-3-b.dtb /mnt/gentoo/boot/bcm2710-rpi-3-b.dtb_32 cp /path/to/raspberrypi/linux/arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dtb /mnt/gentoo/boot安装内核模块：cd /path/to/raspberrypi/linux ARCH=arm64 CROSS_COMPILE=aarch64-unknown-linux-gnu- make modules_install INSTALL_MOD_PATH=/mnt/gentoo这时候应该确认下boot目录是否正确复制了文件Chroot进入系统为树莓派安装qemu：ROOT="/mnt/gentoo" emerge --usepkgonly --oneshot --nodeps qemu创建并挂载必要目录：mkdir -p /mnt/gentoo/usr/portage mkdir -p /mnt/gentoo/var/tmp/portage mount --bind /usr/portage /mnt/gentoo/usr/portage mount --bind /var/tmp/portage /mnt/gentoo/var/tmp/portage mount --bind /proc /mnt/gentoo/proc mount --bind /sys /mnt/gentoo/sys mount --bind /dev /mnt/gentoo/dev mount --bind /dev/pts /mnt/gentoo/ptsChroot进入系统：chroot /mnt/gentoo/ /bin/bash --login配置系统串口配置：nano -w /etc/inittab注释掉f0:12345:respawn:/sbin/agetty 9600 ttyAMA0 vt100并保存添加udev规则：nano -w /etc/udev/rules.d/99-com.rules写入：SUBSYSTEM=="input", GROUP="input", MODE="0660" SUBSYSTEM=="i2c-dev", GROUP="i2c", MODE="0660" SUBSYSTEM=="spidev", GROUP="spi", MODE="0660" SUBSYSTEM=="bcm2835-gpiomem", GROUP="gpio", MODE="0660" SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c '\ chown -R root:gpio /sys/class/gpio && chmod -R 770 /sys/class/gpio;\ chown -R root:gpio /sys/devices/virtual/gpio && chmod -R 770 /sys/devices/virtual/gpio;\ chown -R root:gpio /sys$devpath && chmod -R 770 /sys$devpath\ '" KERNEL=="ttyAMA[01]", GROUP="dialout", PROGRAM="/bin/sh -c '\ ALIASES=/proc/device-tree/aliases; \ if cmp -s $ALIASES/uart0 $ALIASES/serial0; then \ echo 0;\ elif cmp -s $ALIASES/uart0 $ALIASES/serial1; then \ echo 1; \ else \ exit 1; \ fi\ '", SYMLINK+="serial%c" KERNEL=="ttyS0", GROUP="dialout", PROGRAM="/bin/sh -c '\ ALIASES=/proc/device-tree/aliases; \ if cmp -s $ALIASES/uart1 $ALIASES/serial0; then \ echo 0; \ elif cmp -s $ALIASES/uart1 $ALIASES/serial1; then \ echo 1; \ else \ exit 1; \ fi \ '", SYMLINK+="serial%c"其它蓝牙什么的因为我暂时不需要就懒得写了（不坑人了）更改root密码：passwd更改fstab：/dev/mmcblk0p1 /boot vfat noauto,noatime 1 2 /dev/mmcblk0p2 none swap sw 0 0 /dev/mmcblk0p3 / ext4 noatime 0 1创建/boot/config.txt写入：# have a properly sized image disable_overscan=1 # lets have the VC4 hardware accelerated video dtoverlay=vc4-fkms-v3d # for sound over HDMI hdmi_drive=2 # Enable audio (loads snd_bcm2835) dtparam=audioon # gpu_mem is for closed-source driver only; since we are only using the # open-source driver here, set low gpu_mem=16创建/boot/cmdline.txt并写入：root=/dev/mmcblk0p3 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait编辑/etc/portage/make.conf修改或添加：... CFLAGS="-march=armv8-a+crc -mtune=cortex-a53 -ftree-vectorize -O2 -pipe -fomit-frame-pointer" ... ACCEPT_KEYWORDS="~arm64"更新系统并安装必要软件更新系统：emerge -auvDN @world编辑/etc/ssh/sshd_config确保PermitRootLogin没有被注释且后面为yes安装网络管理器：echo net-misc/connman iptables >> /etc/portage/package.use emerge -av connman安装校时软件：emerge -av chrony配置时区：echo "Asia/Shanghai" > /etc/timezone emerge --ask sys-libs/timezone-data配置locale：echo "en_US.UTF-8 UTF-8" > /etc/locale.gen locale-gen启用开机服务：rc-update add sshd default rc-update add connman default rc-update add chronyd default插卡上电，查IP ssh连接
这可能是除了官方wiki写的最全的教程了(可能还存在错误之处,欢迎指出)2018.7.3更新，完善make.conf的说明准备:至少一个人一双能打字的手一个能思考的脑袋俩部电影至少一台正常的电脑一个正常的U盘一个稳定的网络环境一个稳定的电源一个已能完美运行的系统.(如果你是Linux系统则不需要下一个)一个Ubuntu ISO镜像文件如果你是Windows系统:下载Rufus刻录Ubuntu镜像至于UEFI Legacy GPT和MBR等我就不说了,如果不熟悉这些玩Gentoo恐怕困难重重如果你已有一个正常运行的Linux,恭喜,安装Gentoo会简单很多.安装完并确定可用之后之后你可以tar打包已安装的系统使用live CD解压过去并修改相关配置需要知道的一些东西Gentoo有很多好用的工具这里说下安装过程会遇到的eselect可以用来配置系统比如eselect python set X可以设置默认的python（eselect python list查看可用选项）eselect fontconfig enable X可以启用xxx字体配置（eselct fontconfig list查看可用选项）etc-update可以用来更新or生成配置文件假如系统更新了软件 有新的配置文件 Gentoo会生成一个临时的配置文件，需要自己手动删除 合并或覆盖 可以通过运行etc-update进行记住，要尽量保证emerge提示无可用更新的配置文件（特别是更新portage的配置文件的时候）准备磁盘启动到live CD(已有Linux系统忽略这句)使用你喜欢的工具进行分区(或者直接用gparted)这里会声明下分区,之后的过程将使用这些变量UEFI(GPT):sda1 ---/boot--->vfat >=200M #注意分区设置flags为esp sda2 ---/--->ext4,btrfs,xfs,jfs.etc >=20G #建议至少20G大小 sda3 ---swap---> >=2G #除非你16G内存,即使你8G内存也建议设置2G的swap Legacy(MBR):sda1 ---/boot--->ext2 >=200M #可以不设置此分区 sda2 ---/--->ext4,btrfs,xfs,jfs.etc >=20G #建议至少20G大小 sda3 ---swap---> >=2G #除非你16G内存,即使你8G内存也建议设置2G的swap 创建目录:mkdir -v /mnt/gentoo 挂载目录:mount -v /dev/sda2 /mnt/gentoo 安装基本文件在这里你需要选择一个镜像站,在这里列出几个速度比较快的镜像站,请亲自测试选择镜像站:USTCTUNA163进入镜像站的/gentoo/releases/amd64/autobuilds/目录如果你对systemd没有刚需则进入current-stage3-amd64/目录选择最新的stage3下载到本地的/mnt/gentoo目录,例如:stage3-amd64-20171019.tar.bz2如果你需要systemd,则进入current-stage3-amd64-systemd/目录选择最新的stage3下载到本地的/mnt/gentoo目录,例如:stage3-amd64-systemd-20171018.tar.bz2下载完成之后进入gentoo的根目录并解压文件:cd /mnt/gentoo tar vxpf stage3-*.tar.bz2或xz --xattrs-include='*.*' --numeric-owner 配置make.conf和Portage Mirror以下参数在经过自己调整或选择之后加入到 /mnt/gentoo/etc/portage/make.confUSE: 首先,你可以删掉默认的USE标记，加上-bindist (不了解USE的情况下建议如此)CFLAGS: 将CFLAGS修改为CFLAGS="-march=native -O2 -pipe" 或者你也可以指定.例如我的Intel CPU是haswell,将native换成haswell就行(不确定就不要指定).你也可以在这里看到所有可以设置的值MAKEOPTS: 根据你的CPU核心数设置MAKEOPTS例如双四线程设置为MAKEOPTS="-j5"GENTOO_MIRRORS: 设置为GENTOO_MIRRORS="https://mirrors.ustc.edu.cn/gentoo/" 请自行选择速度最快的MirrorEMERGE_DEFAULT_OPTS: 设置为EMERGE_DEFAULT_OPTS="--keep-going --with-bdeps=y"是个不错的选择,keep going意为安装一堆软件时遇到编译错误自动跳过这个软件继续编译安装FEATURES: 在这里最好写成# FEATURES="${FEATURES} -userpriv -usersandbox -sandbox",最好在前面加上#注释掉,在你编译软件遇到权限不足时去掉注释即可解决问题（但请务必注意是不是因为rm -rf /*等命令权限不足，因为说不定你的ebuild文件被篡改了）ACCEPT_KEYWORDS: 如果你想用作桌面/学习/开发系统那就务必加上ACCEPT_KEYWORDS="~amd64"，服务器/工作/家/娱乐用可以忽略ACCEPT_LICENSE: 加上ACCEPT_LICENSE="*"表示此系统接受所有软件许可证,即不论非自由还是自由软件都接受,非商业用户基本不需要考虑L10N: 设置为L10N="en-US zh-CN en zh"LINGUAS: 设置为LINGUAS="en_US zh_CN en zh"VIDEO_CARDS: 根据你的显卡类型设置假如你是NVIDIA单显卡则设置为VIDEO_CARDS="nvidia"(闭源驱动)VIDEO_CARDS="nouveau"(开源驱动).还有radeon和intel,但如果你是双显卡例如Intel+NVIDIA则设置为VIDEO_CARDS="intel i965 nvidia"(只要不是远古的集成显卡都是用i965)GRUB_PLATFORMS: 如果你使用GRUB且使用UEFI启动则添加GRUB_PLATFORMS="efi-64"Portage Mirror: 这个不是make.conf的选项.mkdir /mnt/gentoo/etc/portage/repos.conf创建repos.conf目录并添加如下到/mnt/gentoo/etc/portage/repos.conf/gentoo.conf文件里面(自行选择速度最快的镜像站):[gentoo] location = /usr/portage sync-type = rsync #sync-uri = rsync://mirrors.tuna.tsinghua.edu.cn/gentoo-portage/ sync-uri = rsync://rsync.mirrors.ustc.edu.cn/gentoo-portage/ auto-sync = yes 这里还有个CPU_FLAGS_X86,在后面的步骤emerge --sync之后安装app-portage/cpuid2cpuflags并配置:emerge --ask app-portage/cpuid2cpuflags cpuid2cpuflags #将输出值改入CPU_FLAGS_X86 示例配置（请以实际为标准）：# /usr/share/portage/config/make.conf.example # GCC CFLAGS="-march=haswell -O2 -pipe" CXXFLAGS="${CFLAGS}" CHOST="x86_64-pc-linux-gnu" CPU_FLAGS_X86="aes avx avx2 fma3 mmx mmxext pclmul popcnt sse sse2 sse3 sse4_1 sse4_2 ssse3" MAKEOPTS="-j5" # USE SUPPORT="pulseaudio btrfs mtp git chromium" DESKTOP="infinality emoji cjk" FUCK="-bindist -grub -plymouth -systemd consolekit -modemmanager -gnome-shell -gnome -gnome-keyring -nautilus -modules" ELSE="client icu sudo python" USE="${SUPPORT} ${DESKTOP} ${FUCK} ${ELSE}" # Portage PORTDIR="/usr/portage" DISTDIR="${PORTDIR}/distfiles" PKGDIR="${PORTDIR}/packages" # GENTOO_MIRRORS="https://mirrors.tuna.tsinghua.edu.cn/gentoo/" GENTOO_MIRRORS="https://mirrors.ustc.edu.cn/gentoo/" EMERGE_DEFAULT_OPTS="--ask --verbose=y --keep-going --with-bdeps=y --load-average" # FEATURES="${FEATURES} -userpriv -usersandbox -sandbox" PORTAGE_REPO_DUPLICATE_WARN="0" # PORTAGE_TMPDIR="/var/tmp/notmpfs" ACCEPT_KEYWORDS="~amd64" ACCEPT_LICENSE="*" # Language L10N="en-US zh-CN en zh" LINGUAS="en_US zh_CN en zh" # Else VIDEO_CARDS="intel i965 nvidia" RUBY_TARGETS="ruby24 ruby25" LLVM_TARGETS="X86" QEMU_SOFTMMU_TARGETS="alpha aarch64 arm i386 mips mips64 mips64el mipsel ppc ppc64 s390x sh4 sh4eb sparc sparc64 x86_64" QEMU_USER_TARGETS="alpha aarch64 arm armeb i386 mips mipsel ppc ppc64 ppc64abi32 s390x sh4 sh4eb sparc sparc32plus sparc64" # ABI_X86="64 32"进入Chroot环境复制DNS:cp --dereference /etc/resolv.conf /mnt/gentoo/etc/ 挂载必要文件系统:mount -t proc /proc /mnt/gentoo/proc mount --rbind /sys /mnt/gentoo/sys mount --make-rslave /mnt/gentoo/sys mount --rbind /dev /mnt/gentoo/dev mount --make-rslave /mnt/gentoo/dev Debian等发行版可能需要：test -L /dev/shm && rm /dev/shm && mkdir /dev/shm mount --types tmpfs --options nosuid,nodev,noexec shm /dev/shm chmod 1777 /dev/shm 进入Chroot:chroot /mnt/gentoo /bin/bash source /etc/profile 如果你有boot分区则在这里挂载上去:mount /dev/sda1 /boot 选择Profile并更新系统使用快照更新Portage:emerge-webrsync 使用rsync同步:emerge --sync 使用eselect news read命令阅读新闻列出profile:eselect profile list 如果你使用systemd则需要选上带有systemd字样的选项如果你不使用systemd则不建议使用GNOME桌面,因为GNOME桌面依赖systemd(辣鸡)例如不使用systemd且使用KDE桌面则选择19 default/linux/amd64/17.0/desktop/plasma:eselect profile set 19 然后就是漫长的更新了(有钱人当我没说):emerge -auvDN --with-bdeps=y @world 如果碰到未满足的xxx或者其它提示:emerge -auvDN --with-bdeps=y --autounmask-write @world etc-update # 然后输入-3就能更新配置,确保再次运行时没有可更新的文件 emerge -auvDN --with-bdeps=y @world 如果以上还是不能解决问题,则进入/etc/portage目录删掉package.use,package.mask和package.unmask文件或目录再次尝试到了这里,你可以去看电影了...等它跑完了,先别急运行下这几个命令:emerge @preserved-rebuild perl-cleaner --all emerge -auvDN --with-bdeps=y @world 确定没有更新之后再继续，否则查看输出尝试重复运行如果你在emerge -auvDN --with-bdeps=y @world时提示带有bindist字样且你已启用ACCEPT_KEYWORDS="~amd64"的话运行如下命令之后再次重试：cd /usr/portage/dev-libs/openssl/ ebuild openssl-1.0.2o-r6.ebuild merge # 这里openssl的版本可能和你的不一样，运行ls命令查看可用版本，替换为版本号带o字母的即可配置时区和地区echo "Asia/Shanghai" > /etc/timezone emerge --config sys-libs/timezone-data echo "en_US.UTF-8 UTF-8 zh_CN.UTF-8 UTF-8" >> /etc/locale.gen locale-gen eselect locale list 这里建议使用英语易于排错,之后你可以自行换成中文:eselect locale set X # X换成上面命令显示的序号 配置fstab,安装文件系统工具如果你和我一样懒可以下载此脚本自动配置fstab(引自Arch的genfstab):wget https://raw.githubusercontent.com/YangMame/Gentoo-Installer/master/genfstab chmod +x genfstab #可选 cp genfstab /usr/bin/ ./genfstab / > /etc/fstab nano /etc/fstab #最好检查下此文件,删掉无用挂载点 上面的脚本在chroot环境下不能正常使用-U参数在fstab写入分区的UUID挂载点主要有俩种格式:/dev/sda1 /boot vfat或ext2 defaults 0 0 /dev/sda2 / ext4或btrfs,jfs,xfs.etc defaults 0 0 /dev/sda3 none swap defaults 0 0 这里的UUID通过blkid查看UUID=xxxxxxxxxxx /boot vfat或ext2 defaults 0 0 UUID=xxxxxxxxxxx / ext4或btrfs,jfs,xfs.etc defaults 0 0 UUID=xxxxxxxxxxx none swap defaults 0 0 如果你使用非ext4文件系统则在编译内核前需要另外安装相应的工具:btrfs: emerge sys-fs/btrfs-progs xfs: emerge sys-fs/xfsprogs jfs: emerge sys-fs/jfsutils 安装NetworkManager没错,我很懒,又加上我是KDE桌面用户,所以我选择使用NetworkManager连接网络:emerge -av networkmanager 如果它说有未满足的xxxx或者其它提示:emerge --autounmask-write networkmanager etc-update --automode -3 emerge networkmanager openRC(即非systemd)添加开机服务:rc-update add NetworkManager default systemd添加开机服务:systemctl enable NetworkManager 在/etc/conf.d/hostname内修改主机名,例如:echo hostname=\"Test\" > /etc/conf.d/hostname 安装一些必要工具并配置emerge app-admin/sysklogd sys-process/cronie sudo layman grub sed -i 's/\# \%wheel ALL=(ALL) ALL/\%wheel ALL=(ALL) ALL/g' /etc/sudoers passwd #是时候设置root密码了 如果你是systemd:sed -i 's/\# GRUB_CMDLINE_LINUX=\"init=\/usr\/lib\/systemd\/systemd\"/GRUB_CMDLINE_LINUX=\"init=\/usr\/lib\/systemd\/systemd\"/g' /etc/default/grub ln -sf /proc/self/mounts /etc/mtab systemd-machine-id-setup 非systemd系统:rc-update add sysklogd default rc-update add cronie default 配置编译安装内核有以下推荐内核可供选择:gentoo-sources ck-sources git-sources 这里示例使用gentoo-sources:emerge -av gentoo-sources 如果你不会配置内核或者时间不允许可以先用genkernel:emerge -av genkernel genkernel --menuconfig all genkernel --install initramfs 或者你当前运行着一个正常使用的Linux的话也可以：cd /usr/src/linux make localyesconfig # 如果询问新选项，一路回车吧，23333 make -jX #将X替换为你想编译时的线程数 make modules_install make install genkernel --install initramfs手动配置内核:cd /usr/src/linux make menuconfig 关于配置内核本站有写内核配置的文章你也可以选择去看金步国的文章配置完之后:make -jX #将X替换为你想编译时的线程数 make modules_install make install genkernel --install initramfs 安装GRUB并创建用户如果你是UEFI:grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=Gentoo grub-mkconfig -o /boot/grub/grub.cfg 如果出现No space left on device请运行：mount -t efivarfs efivarfs /sys/firmware/efi/efivars rm /sys/firmware/efi/efivars/dump-*然后重试（由 @Chara 提议加上）如果你是Legacy:grub-install --target=i386-pc /dev/sda grub-mkconfig -o /boot/grub/grub.cfg 创建一个管理员并设置密码:useradd -m -G users,wheel,portage,usb,video 这里换成你的用户名(小写) passwd 用户名 显卡驱动NVIDIA单显卡:emerge -av x11-drivers/nvidia-drivers Intel单显卡:emerge -av x11-drivers/xf86-video-intel Intel+NVIDIA双显卡请看这篇文章其它显卡硬件待补坑 欢迎提出检查系统可用性到了这里你应该可以重启查看系统是否能正常启动,然后在安装桌面重启前最好检查下的东西:boot目录是否有相应文件GRUB是否正确生成配置并显示内核等文件fstab是否正确无误安装桌面首先需要确保已安装xorg-server和显卡驱动:emerge -av xorg-server emerge xf86-video-intel #Intel显卡驱动 emerge nvidia-drivers #nvidia显卡驱动 如遇需要更新配置则运行etc-update --automode -3并再次运行命令KDE:emerge -av plasma-desktop plasma-nm plasma-pa sddm konsole 如遇需要更新配置则运行etc-update --automode -3并再次运行命令如果你是systemd:systemctl enable sddm openrc则编辑/etc/conf.d/xdm将DISPLAYMANAGER的值改为sddm并:rc-update add xdm default GNOME:emerge -av gnome-shell gdm gnome-terminal systemctl enable gdm 如遇需要更新配置则运行etc-update --automode -3并再次运行命令这里只说明systemd,因为openrc并不能满足GNOME的依赖
前言有很多人可能还用着一键脚本/面版安装的网站优点是轻松傻瓜式，缺点是浪费时间/空间 学习成本可能比我的文章还大（前提是愿意琢磨如果你的VPS只有/剩余5G Disk，显然用这些脚本是不太现实的但是如果自己安装配置 你大概只需要不到1G的空间就能搭建个和我一样的网站更新2018.8.17(七夕)：增加Nginx配置，增加Nextcloud2018.9.30(快国庆了)：更新至Debian 10（buster），增加cloudflare相关配置2018.10.24(双十一要来了，要剁手了）：更正部分旧内容，增加Iptables配置2019.08.06(快七夕了？？？)：更新关于v2ray tls版本的配置2019.12.15(终于能休息了)：更新nginx配置echo的问题预览Web: Caddy or Nginx #请二选一Sql: MariadbBlog: Typecho (blog.yangmame.org)CDN: CloudflareEmail: YandexProxy: V2rayGit: Gitea (git.yangmame.org)File Browser: Caddy with http.filemanager plugin or NextcloudBT: qBittorrent-nox (bt.yangmame.org)购买VPSVPS推荐最低配置：Mem: >=512MCPU: >=1CoreDisk: >=5G我的网站运行在搬瓦工年付19刀的KVM VPS上（流下了没钱的泪）目前运行在Cloudcone上,第一次购买可能会遇到被墙的IP，需要发工单更换IP但是推荐新手买Vultr或DigitalOcean（请使用我的链接注册，这样我也能受益 注册后需要充值五美元才能使用，但请放心 这俩家都是大牌）至于买什么地区，什么配置 自己定夺系统请选择Debian 9 x86_64,如果有Debian10就更好了。 (若出现其他问题需要自行解决，例如systemd版本太低造成参数无效导致权限不足）记得检查VPS的IP是否能访问，否则请更换IP（给VPS商发工单or新开VPS）购买域名域名推荐去Godaddy购买（无需实名制or备案）推荐去Namesilo购买（便宜，免费的隐私保护，不流氓）你要是有更好的选择也行这里说下我知道的主要域名类型.com: 一般网站 .net: 与com类似 .org: 公益 无盈利网站 .me: 个人个性网站 .info: 信息类网站 .blog: 博客网站 .moe: 二次元类网站 .cn: 中国网站（需要备案） 如果仅仅写博客推荐.me 有钱人上.blog如果和我一样推荐.org或.infoACG爱好者推荐.moe如果自己也不确定推荐.com 有钱人上.net配置Cloudflare首先去注册Cloudflare然后添加你的网站，在域名商（Godaddy）中更换域名的DNS为CLoudflare提供给你的DNS地址等待生效后在Cloudflare中转到DNS设置添加A记录：Name填@ IPv4 address填你VPS的IP地址 点击Add Record完成添加添加子域名：（例如blog.yangmame.org），添加CNAME记录：Name填你想添加的子域名（例如blog） Domain name填你的根域名（例如yangmame.org） 点击Add Record完成添加（如果想网站和我一样，则请添加blog,www,file.admin,git,bt子域名，之后的配置按此配置）转到Crypto页面将SSL设置为Full(strict)启用下面的Always use HTTPSTLS版本请选择1.2，除非你不打算用任何GO语言写的东西(v2ray)，因为GO还不支持TLSv1.3。。。 现在最新的go终于支持了，旧版本可能需要升级一下，不过如果你客户端有系统比较旧的建议仍建议选1.2还有些选项如果你了解也可以开启（比如HSTS）转到Page Rules页面添加如下规则以启用http跳转https（减少配置量与Nginx压力）配置VPSssh连接VPS运行如下命令更新系统：apt update apt dist-upgrade apt --purge autoremove reboot 如果你不是Debian10，请先查看当前的Debian版本的codename：cat /etc/apt/sources.list 你会看到类似于如下的一些内容：... deb http://mirrors.xxxx.xxxx.xxx/debian/ stretch main ... 其中stretch为codename，即Debian9的codenameDebian8的codename为jessie，Debian7为wheezy运行如下命令进行升级（有一定风险挂掉，请一定确保已在当前版本为最新状态，不建议在已安装配置了很多东西的VPS上进行）：cp /etc/apt/sources.list /etc/apt/sources.list.bak sed -i 's/stretch/buster/g' /etc/apt/sources.list #将stretch更换为你的codename apt update apt dist-upgrade apt --purge autoremove 开启BBR（KVM）：modprobe tcp_bbr echo "tcp_bbr" >> /etc/modules-load.d/modules.conf echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf sysctl -p IptablesDebian的iptables是被阉割了的，需要安装这个包以省事：apt install iptables-persistent运行：iptables -F # 清空所有的防火墙规则 iptables -X # 删除用户自定义的空链 iptables -Z # 清空计数 iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 放行22端口（SSH）如果你更改了SSH端口将22改掉即可 iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # 放行回环地址 iptables -P INPUT DROP # 配置默认的不让进 iptables -P FORWARD DROP # 默认的不允许转发 iptables -P OUTPUT ACCEPT # 默认的可以出去 iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 放行443（HTTPS）端口，这里因为有CloudFlare的Page Rule规则仅访问HTTPS不需要使用80端口的HTTP服务 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已经建立的连接得让它进来 iptables-save > /etc/iptables/rules.v4 # 保存ipv4的规则 systemctl enable netfilter-persistent # 启用systemd service如果你也使用ipv6，则把上面命令的iptables改为ip6tables，把/etc/iptables/rules.v4改为/etc/iptables/rules.v6Caddy（本人目前未继续使用此软件，随时可能过时）安装Caddy并配置权限 创建用户 创建必要文件/文件夹：wget https://getcaddy.com -O caddy.sh bash caddy.sh personal http.filemanager,http.nobots,tls.dns.cloudflare chown root:root /usr/local/bin/caddy chmod 755 /usr/local/bin/caddy groupadd caddy useradd -g caddy --home-dir /var/www --no-create-home --shell /usr/sbin/nologin --system caddy mkdir /etc/caddy touch /etc/caddy/Caddyfile chown -R root:caddy /etc/caddy chown caddy:caddy /etc/caddy/Caddyfile chmod 444 /etc/caddy/Caddyfile mkdir /etc/ssl/caddy chown -R caddy:root /etc/ssl/caddy chmod 770 /etc/ssl/caddy mkdir /var/www chown caddy:caddy /var/www 创建Caddy服务：nano /etc/systemd/system/caddy.service 写入（注意查看并删除or修改中文注释）：[Unit] Description=Caddy HTTP/2 web server Documentation=https://caddyserver.com/docs After=network-online.target Wants=network-online.target systemd-networkd-wait-online.service [Service] #Restart=on-failure StartLimitInterval=864000 StartLimitBurst=500 ; User and group the process will run as. User=caddy Group=caddy ; Letsencrypt-issued certificates will be written to this directory. Environment=CADDYPATH=/etc/ssl/caddy Environment=CLOUDFLARE_API_KEY=这里改为你的API Key，在这个页面点击Global API Key--->View API Key即可看到：https://www.cloudflare.com/a/profile Environment=CLOUDFLARE_EMAIL=这里改为你cloudfalre的邮箱 ; Always set "-root" to something safe in case it gets forgotten in the Caddyfile. ExecStart=/usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp ExecReload=/bin/kill -USR1 $MAINPID ; Limit the number of file descriptors; see `man systemd.exec` for more limit settings. LimitNOFILE=1048576 ; Unmodified caddy is not expected to use more than that. LimitNPROC=64 ; Use private /tmp and /var/tmp, which are discarded after caddy stops. PrivateTmp=true ; Use a minimal /dev PrivateDevices=true ; Hide /home, /root, and /run/user. Nobody will steal your SSH-keys. ProtectHome=true ; Make /usr, /boot, /etc and possibly some more folders read-only. ProtectSystem=full ; … except /etc/ssl/caddy, because we want Letsencrypt-certificates there. ; This merely retains r/w access rights, it does not add any new. Must still be writable on the host! ReadWriteDirectories=/etc/ssl/caddy ; The following additional security directives only work with systemd v229 or later. ; They further restrict privileges that can be gained by Caddy. Uncomment if you like. ; Note that you may have to add capabilities required by any plugins in use. CapabilityBoundingSet=CAP_NET_BIND_SERVICE AmbientCapabilities=CAP_NET_BIND_SERVICE ;NoNewPrivileges=true [Install] WantedBy=multi-user.target编辑Caddy配置：nano /etc/caddy/Caddyfile 写入并自行删除你不需要的网站配置（注意查看并删除中文注释）：#主站，将后面的所有yangmame.org换成你自己的域名 https://yangmame.org { tls { dns cloudflare } gzip # 这里的root为网站的根目录，记得创建文件夹并修改权限，之后的root也请自行创建文件夹并修改权限 # 例如：mkdir /var/www/www.yangmame.org && chown caddy:caddy /var/www/www.yangmame.org root /var/www/www.yangmame.org } #主站 https://www.yangmame.org { tls { dns cloudflare } gzip root /var/www/www.yangmame.org } #博客 https://blog.yangmame.org { tls { dns cloudflare } gzip root /var/www/blog.yangmame.org #typecho安装时请删掉下一行的注释 #fastcgi / /run/php/php7.3-fpm.sock php #typecho安装完成之后删掉掉下面的注释（千万不要在安装时删掉下面的注释） #rewrite / { # if {path} not_match (/usr/|/admin/) # to /index.php{uri} #} } #Nextcloud，最好用的自建网盘 https://file.yangmame.org { root /var/www/file.yangmame.org fastcgi / /run/php/php7.3-fpm.sock php { env PATH /bin } # checks for images rewrite { ext .svg .gif .png .html .ttf .woff .ico .jpg .jpeg r ^/index.php/(.+)$ to /{1} /index.php?{1} } rewrite { r ^/index.php/.*$ to /index.php?{query} } # client support (e.g. os x calendar / contacts) redir /.well-known/carddav /remote.php/carddav 301 redir /.well-known/caldav /remote.php/caldav 301 # remove trailing / as it causes errors with php-fpm rewrite { r ^/remote.php/(webdav|caldav|carddav|dav)(\/?)(\/?)$ to /remote.php/{1} } rewrite { r ^/remote.php/(webdav|caldav|carddav|dav)/(.+?)(\/?)(\/?)$ to /remote.php/{1}/{2} } rewrite { r ^/public.php/(dav|webdav|caldav|carddav)(\/?)(\/?)$ to /public.php/{1} } rewrite { r ^/public.php/(dav|webdav|caldav|carddav)/(.+)(\/?)(\/?)$ to /public.php/{1}/{2} } # .htaccess / data / config / ... shouldn't be accessible from outside status 403 { /.htaccess /data /config /db_structure /.xml /README } header / Strict-Transport-Security "max-age=31536000;" #这里是V2ray proxy /download localhost:1234 { websocket header_upstream -Origin } } #另一个”网盘“，不过这个可以访问系统的根目录并上传修改和运行命令 https://admin.yangmame.org { tls { dns cloudflare } gzip filemanager / / { locale zh-cn show / alternative_recaptcha true } } #Git网站 https://git.yangmame.org { tls { dns cloudflare } gzip proxy / localhost:3000 } #qBittorrent的Web控制端 https://bt.yangmame.org { tls { dns cloudflare } gzip proxy / localhost:8080 }给予权限并启用服务：chown root:root /etc/systemd/system/caddy.service chmod 644 /etc/systemd/system/caddy.service systemctl daemon-reload systemctl enable caddy systemctl start caddy PS：请务必过了一俩分钟后检查caddy的运行状态，如果看到错误，请多重启几次(因为申请证书可能失败）：systemctl restart caddy，如果每次报错都一样 请确保Cloudflare添加了对应的子域名CNAME记录or仔细检查配置 > 自行谷歌 > 联系我Nginx如果你不是Debian 10请选择添加源安装Nginx：cat > /etc/apt/sources.list.d/nginx.list << EOF deb http://nginx.org/packages/debian/ stretch nginx deb-src http://nginx.org/packages/debian/ stretch nginx EOF导入Nginx的Key:wget http://nginx.org/keys/nginx_signing.key apt-key add nginx_signing.key安装Nginx：apt update apt install nginx重要：编辑/etc/nginx/nginx.conf将user后的nginx值改为www-data注意，以下步骤请更换为自己的域名、文件名与目录路径（关键词：yangmame.org)写入配置（注意目录、文件名、路径与域名）：mkdir /var/www chown www-data:www-data /var/www # 这里是主页的配置 cat << EOF > /etc/nginx/conf.d/www.yangmame.org.conf server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name www.yangmame.org yangmame.org; root /var/www/www.yangmame.org; index index.html index.htm; ssl on; ssl_certificate "/etc/letsencrypt/live/yangmame.org/fullchain.pem"; ssl_certificate_key "/etc/letsencrypt/live/yangmame.org/privkey.pem"; ssl_prefer_server_ciphers on; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; } EOF # 这里是博客的配置 cat << EOF > /etc/nginx/conf.d/blog.yangmame.org.conf server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name blog.yangmame.org; root /var/www/blog.yangmame.org; index index.html index.php index.htm; ssl on; ssl_certificate "/etc/letsencrypt/live/yangmame.org/fullchain.pem"; ssl_certificate_key "/etc/letsencrypt/live/yangmame.org/privkey.pem"; ssl_prefer_server_ciphers on; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; keepalive_timeout 70; ssl_session_timeout 10m; ssl_session_tickets on; ssl_stapling on; ssl_stapling_verify on; if (!-e $request_filename) { rewrite ^(.*)$ /index.php$1 last; } location ~ .*\.php(\/.*)*$ { include fastcgi.conf; fastcgi_pass unix:/run/php/php7.3-fpm.sock; fastcgi_index index.php; } } EOF # 这里是Nextcloud的配置 请注意，因为我的疏忽，这里的配置用到$的都会被当作变量处理，请务必手动复制粘贴 cat << EOF > /etc/nginx/conf.d/file.yangmame.org.conf upstream php-handler { #server 127.0.0.1:9000; server unix:/run/php/php7.3-fpm.sock; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name file.yangmame.org; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; ssl_certificate "/etc/letsencrypt/live/yangmame.org/fullchain.pem"; ssl_certificate_key "/etc/letsencrypt/live/yangmame.org/privkey.pem"; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; add_header X-Robots-Tag none; add_header X-Download-Options noopen; add_header X-Permitted-Cross-Domain-Policies none; root /var/www/file.yangmame.org/; location = /robots.txt { allow all; log_not_found off; access_log off; } location = /.well-known/carddav { return 301 $scheme://$host/remote.php/dav; } location = /.well-known/caldav { return 301 $scheme://$host/remote.php/dav; } # set max upload size client_max_body_size 512M; fastcgi_buffers 64 4K; gzip on; gzip_vary on; gzip_comp_level 4; gzip_min_length 256; gzip_proxied expired no-cache no-store private no_last_modified no_etag auth; gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; location / { rewrite ^ /index.php$uri; } location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ { deny all; } location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { deny all; } location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\.php(?:$|/) { fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param HTTPS on; #Avoid sending the security headers twice fastcgi_param modHeadersAvailable true; fastcgi_param front_controller_active true; fastcgi_pass php-handler; fastcgi_intercept_errors on; fastcgi_request_buffering off; } location ~ ^/(?:updater|ocs-provider)(?:$|/) { try_files $uri/ =404; index index.php; } # Adding the cache control header for js and css files # Make sure it is BELOW the PHP block location ~ \.(?:css|js|woff|svg|gif)$ { try_files $uri /index.php$uri$is_args$args; add_header Cache-Control "public, max-age=15778463"; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; add_header X-Robots-Tag none; add_header X-Download-Options noopen; add_header X-Permitted-Cross-Domain-Policies none; # Optional: Don't log access to assets access_log off; } location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ { try_files $uri /index.php$uri$is_args$args; # Optional: Don't log access to other assets access_log off; } # 这里是V2ray的配置 location /download { proxy_redirect off; proxy_pass http://localhost:1234; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $http_host; } } EOF # 这里是Git网站的配置 cat << EOF > /etc/nginx/conf.d/git.yangmame.org.conf server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name git.yangmame.org; location / { proxy_pass http://localhost:3000; } ssl on; ssl_certificate "/etc/letsencrypt/live/yangmame.org/fullchain.pem"; ssl_certificate_key "/etc/letsencrypt/live/yangmame.org/privkey.pem"; ssl_prefer_server_ciphers on; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; } EOF # 这里是qbittorrent的webui配置 cat << EOF > /etc/nginx/conf.d/bt.yangmame.org.conf server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name bt.yangmame.org; location / { proxy_pass http://localhost:8080; } ssl on; ssl_certificate "/etc/letsencrypt/live/yangmame.org/fullchain.pem"; ssl_certificate_key "/etc/letsencrypt/live/yangmame.org/privkey.pem"; ssl_prefer_server_ciphers on; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; } EOF先不要急着启动Nginx，还需要配置ssl证书 这里有俩种方式（二选一即可）Acem.sh首先安装它：curl https://get.acme.sh | sh echo 'alias acme.sh=~/.acme.sh/acme.sh' >> ~/.bashrc source ~/.bashrc声明Cloudflare帐号与API KEY并申请证书(在这个页面点击Global API Key--->View API Key即可看到):export CF_Key="你的API KEY" export CF_Email="你的邮箱" acme.sh --issue --dns dns_cf -d yangmame.org -d *.yangmame.org安装证书：mkdir -p /etc/letsencrypt/live/yangmame.org/ acme.sh --installcert -d yangmame.org \ --key-file /etc/letsencrypt/live/yangmame.org/privkey.pem \ --fullchain-file /etc/letsencrypt/live/yangmame.org/fullchain.pem \ --reloadcmd "systemctl reload nginx"到了这里你可以尝试启动Nginx看看是否工作了：systemctl enable nginx systemctl start nginx systemctl status nginxCertbot安装它:apt install certbot python3-certbot-dns-cloudflare新建cloudflare dns的配置：cat << EOF > /etc/letsencrypt/cf.ini dns_cloudflare_email = 你的Cloudflare邮箱 dns_cloudflare_api_key = 你的API Key，在这个页面点击Global API Key--->View API Key即可看到：https://www.cloudflare.com/a/profile EOF申请证书：certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cf.ini --dns-cloudflare-propagation-seconds 60 -d *.yangmame.org添加定时更新任务：crontab -e写入：6 0 * * * certbot renewMariadb安装数据库：apt install mariadb-server 配置mysql：systemctl start mysql mysql_secure_installation 要求输入密码时直接回车，然后会让你设置密码，之后的选项一路Y就行创建数据库和用户:# 输入刚刚设置的root密码登录mysql： mysql -u root -p # 创建typecho的数据库： create database typecho; # 创建typecho用户并赋予typecho数据库的权限： grant all privileges on typecho.* to '用户名,推荐typecho'@'localhost' identified by '密码'; # 如果你想恢复数据库则运行(第一次使用请忽略)： use typecho; source /path/to/typecho.sql; # 创建gitea的数据库： create database gitea; # 创建gitea用户并赋予gitea数据库的权限： grant all privileges on gitea.* to '用户名,推荐gitea'@'localhost' identified by '密码'; # 如果你想恢复数据库则运行(第一次使用请忽略)： use gitea; source path/to/gitea.sql; # 创建Nextcloud数据库 create database nextcloud; # 创建nextcloud用户并赋予nextcloud数据库的权限： grant all privileges on nextcloud.* to '用户名,推荐nextcloud'@'localhost' identified by '密码'; # 如果你想恢复数据库则运行(第一次使用请忽略)： use nextcloud; source path/to/nextcloud.sql; # 刷新数据库： flush privileges; # 退出 exit启动Mysql：systemctl enable mysql systemctl restart mysql PHP安装PHP及Typecho需要的扩展(如果直接安装php会依赖apache2）：apt install php-fpm apt install php php-mysql php-gd php-xml php-cgi php-cli php-curl php-zip php-mbstring unzip 如果你使用caddy则编辑php-fpm配置：nano /etc/php/7.3/fpm/pool.d/www.conf 将如下中的www-data修改为caddy：user = www-data group = www-data 还有：listen.owner = caddy listen.group = caddy 启动php-fpm：systemctl enable php7.3-fpm systemctl start php7.3-fpm systemctl restart php7.3-fpm V2ray安装V2ray：wget https://install.direct/go.sh -O v2ray.sh bash v2ray.sh 更改配置:rm /etc/v2ray/config.json nano /etc/v2ray/config.json 写入(请注意并删除中文注释）：{ "outbound": { "streamSettings": null, "tag": null, "protocol": "freedom", "mux": null, "settings": null }, "log": { "access": "/var/log/v2ray/access.log", "loglevel": "info", "error": "/var/log/v2ray/error.log" }, "outboundDetour": [{ "tag": "direct", "protocol": "freedom", "settings": null }, { "tag": "blocked", "protocol": "blackhole", "settings": null } ], "inbound": { "streamSettings": { "network": "ws", "kcpSettings": null, "wsSettings": { "path": "/download" #这里必须和Caddy或Nginx配置中"/download" 的路径一样 }, "tcpSettings": null, "tlsSettings": {}, "security": "" }, "settings": { "ip": null, "udp": true, "clients": [{ "alterId": 100, "security": "none", "id": "xxxx-xxxx-xxxx-xxxx" #请访问 https://www.uuidgenerator.net/ 获取UUID并改入 }], "auth": null }, "protocol": "vmess", "port": 1234, #这里的端口也必须和Caddy或Nginx配置中"/download" 的路径一样 "listen": null }, "inboundDetour": null, "routing": { "settings": { "rules": [{ "ip": [ "0.0.0.0/8", "10.0.0.0/8", "100.64.0.0/10", "127.0.0.0/8", "169.254.0.0/16", "172.16.0.0/12", "192.0.0.0/24", "192.0.2.0/24", "192.168.0.0/16", "198.18.0.0/15", "198.51.100.0/24", "203.0.113.0/24", "::1/128", "fc00::/7", "fe80::/10" ], "domain": null, "type": "field", "port": null, "outboundTag": "blocked" }], "domainStrategy": null }, "strategy": "rules" }, "dns": null }启动V2ray服务：systemctl enable v2ray systemctl start v2ray Typecho进入网站的根目录:cd /var/www/blog.yangmame.org #注意路径改为自己的 下载Typecho(自行检查最新的实际下载地址）：wget http://typecho.org/downloads/1.1-17.10.30-release.tar.gz tar -xf *.tar.gz mv build/* . rm -rf build *.tar.gz # 如果你使用caddy,否则将caddy改为www-data： chown caddy:caddy -R /var/www然后在浏览器中访问你的博客，例如：blog.yangmame.org这时候应该会显示安装界面数据库和用户均填写typecho,密码为配置数据库时的密码，其它内容自行填写然后你就可以愉快的写作了至于安装主题什么的就自己琢磨吧本博客使用的主题是CatNextcloud进入网站的根目录：cd /var/www/file.yangmame.org #注意路径改为自己的下载Nextcloud(自行检查最新的实际下载地址)wget https://download.nextcloud.com/server/releases/nextcloud-13.0.5.zip unzip *.zip rm *.zip mv nextcloud/* . rmdir nextcloud # 如果你使用caddy,否则将caddy改为www-data： chown caddy:caddy -R /var/www然后在浏览器中访问，例如：file.yangmame.org这时候应该会显示安装界面数据库和用户均填写nextcloud，密码为配置数据库时的密码其它配置内容请自行填写（因为我也不记得是啥样了 2333）Gitea创建git用户并切换：adduser git # 这里除了密码都可以留空（adduser命令为Debian类系统独有） su git 下载Gitea（自行检查最新的实际下载地址：mkdir /home/git/gitea cd /home/git/gitea wget https://github.com/go-gitea/gitea/releases/download/v1.4.0/gitea-1.4.0-linux-amd64 # 请自己检查最新的下载地址 mv gitea-1.4.0-linux-amd64 gitea # 注意文件名 chmod +x gitea exit 新建Gitea服务：nano /etc/systemd/system/gitea.service 写入：[Unit] Description=Gitea (Git with a cup of tea) After=syslog.target After=network.target #After=mysqld.service #After=postgresql.service #After=memcached.service #After=redis.service [Service] # Modify these two values and uncomment them if you have # repos with lots of files and get an HTTP error 500 because # of that ### #LimitMEMLOCK=infinity #LimitNOFILE=65535 RestartSec=2s Type=simple User=git Group=git WorkingDirectory=/home/git/gitea ExecStart=/home/git/gitea/gitea web Restart=always Environment=USER=git HOME=/home/git [Install] WantedBy=multi-user.target启动Gitea：systemctl enable gitea systemctl start gitea 然后在浏览器中访问，例如：git.yangmame.org数据库和用户皆为gitea，密码为配置数据库时的密码，其它内容自行填写qBitttorrent安装qBittorrent：apt install qbittorrent-nox 添加用户：adduser qbtuser # 这里除了密码都可以留空 创建qBittorrent服务：nano /etc/systemd/system/qbittorrent.service 写入：[Unit] Description=qBittorrent Daemon Service After=network.target [Service] User=qbtuser ExecStart=/usr/bin/qbittorrent-nox ExecStop=/usr/bin/killall -w qbittorrent-nox [Install] WantedBy=multi-user.target配置qBittorrent：su qbtuser qbittorrent-nox 然后在浏览器中访问，例如：bt.yangmame.org默认用户为admin，密码为adminadmin，登录之后在设置中修改用户名 密码和语言然后在终端中按Ctrl+C停止启动qBittorrent服务：exit # 退出qbtuser systemctl daemon-reload systemctl enable qbittorrent systemctl start qbittorrent PS：下载目录需要更改所有者,例如：chown qbtuser:qbtuser dirEmail如果你不想拥有自己的域名邮箱，则可以跳过这里推荐使用Yandex的服务点击上面的链接照着它的说明验证域名归属权并添加相应的DNS解析 完成之后打开https://mail.yandex.com即可登录结束如果你觉得此文章帮上忙了，还请支持我：PayPal到了这里，你就已经搭建完成了，这这时你的VPS磁盘占用应该没有超过2G至于V2ray客户端的配置：协议为vmess服务器：主机填你的域名端口填443（不是v2的1234端口）如果你在caddy中修改了端口则改为相同值用户ID填v2配置文件中的UUIDAlterID填100加密方式填none用户等级为0传输：网络填WebSocket加密填tls服务器域名证书不填允许不安全连接随意 （不建议开）WebSocket/WS路径填/download（如果你修改了，改为相同字符)HTTP头不需要管其它设置就随意了（保持默认）如果你找到的桌面/手机客户端不支持这些选项请更换如果你使用v2ray-core（注意并删除中文注释）：{ "log": { "access": "", "error": "", "loglevel": "" }, "inbound": { "port": 1080, # 这里为本地的代理端口 "listen": "0.0.0.0", "protocol": "socks", "settings": { "auth": "noauth", "udp": true, "ip": "127.0.0.1", "clients": null }, "streamSettings": null }, "outbound": { "tag": "agentout", "protocol": "vmess", "settings": { "vnext": [ { "address": "这里改为你自己的域名", "port": 443, "users": [ { "id": "这里改为服务端的UUID", "alterId": 100, "security": "none" } ] } ], "servers": null }, "streamSettings": { "network": "ws", "security": "tls", "tcpSettings": null, "kcpSettings": null, "wsSettings": { "connectionReuse": true, "path": "/download", # 这里为服务端的路径 "headers": null } }, "mux": { "enabled": true } }, "inboundDetour": null, "outboundDetour": [ { "protocol": "freedom", "settings": { "response": null }, "tag": "direct" }, { "protocol": "blackhole", "settings": { "response": { "type": "http" } }, "tag": "blockout" } ], "dns": { "servers": [ "8.8.8.8", "8.8.4.4", "localhost" ] }, "routing": { "strategy": "rules", "settings": { "domainStrategy": "IPIfNonMatch", "rules": [ { "type": "field", "port": null, "outboundTag": "direct", "ip": [ "0.0.0.0/8", "10.0.0.0/8", "100.64.0.0/10", "127.0.0.0/8", "169.254.0.0/16", "172.16.0.0/12", "192.0.0.0/24", "192.0.2.0/24", "192.168.0.0/16", "198.18.0.0/15", "198.51.100.0/24", "203.0.113.0/24", "::1/128", "fc00::/7", "fe80::/10" ], "domain": null } ] } } }
适用场景：外出需要电脑，却没有携带自己的电脑，且不能信任能找到的电脑的环境；不想在外泄漏隐身；不是自己想使用的系统/环境。教程目标：制作一个可以保留更改的运行Linux的U盘，加密根目录(boot除外)，开机可以选择ramroot模式启动(将整个Linux系统加载在内存，适合在大内存机器且不想保留更改时使用)需要的东西：一个正常运行的Arch Linux一个U盘（推荐3.1，3.0和2.0可能体验较差）需要用到的软件/命令：cryptsetuparch-install-scripts(可以直接通过pacman安装）开始以下过程默认在root用户下运行配置分区这里就简单说下如何分区，至于用什么工具分区随你喜欢这里的/dev/sdb将在之后的教程当作U盘使用（请自己注意更换)分区类型：dos，以下分区皆为主分区(primary） 分区-------->挂载点-->大小--->类型 /dev/sdb1--->/boot--->128M--->EFI Filesystem(需要设置为可启动(bootable)） /dev/sdb2--->/------->Free--->Linux创建加密LUKS(需要输入大写yes然后输入你的密码/口令)：cryptsetup luksFormat --type luks2 /dev/sdb2打开LUKS并创建配置LVM(需要输入密码/口令)：cryptsetup open --type luks2 /dev/sdb2 cryptlvm pvcreate /dev/mapper/cryptlvm vgcreate System /dev/mapper/cryptlvm lvcreate -L 8G System -n root # 这里是根分区，一般8G够用 lvcreate -l 100%FREE System -n data # 这里是数据分区，用于存放重要资料（为了和根分区区分，建议不要写入fstab让它默认不挂载）格式化：mkfs -t vfat -F 32 /dev/sdb1 mkfs -i 8192 -t ext4 /dev/System/root mkfs -i 8192 -t ext4 /dev/System/data挂载分区：mount -t ext4 /dev/System/root /mnt mkdir -p /mnt/boot mount /dev/sdb1 /mnt/boot安装系统如果你在使用Arch Linux的Live CD安装，你可能需要修改/etc/pacman.d/mirrorlist选择镜像站pacstrap -i /mnt base base-devel linux # 这里建议不安装默认的linux，安装linux-hardened内核 genfstab -U -p /mnt >> /mnt/etc/fstab进入chroot环境并安装内核：arch-chroot /mnt source /etc/profile pacman -S linux-hardened配置locale:TMP="en_US.UTF-8" # 将这里改为你想使用的语言（建议en） echo "${TMP} UTF-8" > /etc/locale.gen locale-gen echo LANG=${TMP} > /etc/locale.conf至于时区这里示例使用中国时区：ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime hwclock --systohc --utc更改root密码与主机名：passwd echo Live > /etc/hostname编辑/etc/mkinitcpio.conf在HOOKS中加入keyboard keymap encrypt以支持加密（需要注意顺序）：# 示例 HOOKS=(base udev autodetect keyboard keymap consolefont modconf block encrypt lvm2 filesystems fsck)添加ramroot支持：pacman -S git git clone https://github.com/arcmags/ramroot cd ramroot ./ramroot enable -r 这里替换为/dev/System/root的UUID -b 这里替换为/dev/sdb1的UUID # 注意，这里生成initramfs时会报错（如果你使用linux-hardened的话）,可以暂时忽略重新生成initramfs：mkinitcpio -p linux-hardened安装引导:pacman -S grub efibootmgr grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=BOOT # 这里会有非GPT报错可以忽略 cp /boot/EFI/BOOT/grubx64.efi /boot/EFI/BOOT/BOOTX64.efi # 防止BIOS不认 grub-install --target=i386-pc /dev/sdb另开终端运行blkid复制/dev/sdb2的UUID（注意不要和/dev/mapper/cryptroot的UUID混淆）回到原终端编辑/etc/default/grub在GRUB_CMDLINE_LINUX=""加入：cryptdevice=UUID=这里换成刚刚复制的UUID:cryptlvm root=/dev/System/root生成grub.cfg:grub-mkconfig -o /boot/grub/grub.cfg # 这里会报lvm错误，可以忽略安装网络管理器：# 这里建议使用connman或networkmanager pacman -S connman bluez wpa_supplicant systemctl enable connman到了这里 你就可以重启看看能不能启动了结尾最后无非是做一些自己的配置，这里就不多说了，就说说一些建议安装配置完成之后，根目录使用空间不大或内存够用的话 建议使用ramroot启动，启动之后你就可以拔掉U盘了（这样启动不会保留对根目录的更改）。关于分区，之所以分个/data，默认不挂载，这样使用ramroot启动时可以保证数据隐私安全（所以建议新建俩个用户），正常启动时可以手动挂载以保存/访问数据。至于怎么玩随你喜欢了。