Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

第 1 章 Introduction

目录

1.1. Rocky Linux
1.1.1. 制作 U 盘
1.1.2. Rocky-9.3-x86_64-minimal.iso 镜像初始化
1.1.3. .Net 环境
1.2. AlmaLinux
1.2.1. 制作 U 盘启动盘
1.2.2. AlmaLinux 镜像安装初始化
1.2.3. Minimal 版本安装 XWindows
1.3. Debian / Ubuntu
1.3.1. Debian 12
1.3.2. 历史记录优化
1.3.3. 关闭 SELinux
1.3.4. sysctl / ulimit
1.3.5. 时间同步
1.3.6. 启动 rc.local
1.3.7. 禁用防火墙
1.3.8. 更换包镜像
1.3.9. The following signatures couldn't be verified because the public key is not available: NO_PUBKEY
1.4. CentOS 8 Stream
1.4.1. U 盘安装 CentOS Stream
1.4.2. macOS 制作 U 盘启动盘速度慢
1.4.3. 首次安装后初始化系统
1.4.4. 启用 rc.local
1.4.5. 卸载防火墙
1.5. Alpine Linux
1.6. 其他 Linux 发行版本
1.6.1. Linux 下载排名
1.6.2. Redhat 衍生版本
1.6.3. FreeBSD 包风格的Linux 发行版
1.6.4. Linux 专用领域发行版
1.6.5. 早起版本

[注意]对初学Linux的爱好者忠告

玩Linux最忌reboot(重新启动)这是windows玩家坏习惯

Linux只要接上电源你就不要再想用reboot,shutdown,halt,poweroff命令,Linux系统和应用软件一般备有reload,reconfigure,restart/start/stop...不需要安装软件或配置服务器后使用reboot重新引导计算机

在Linux系统里SIGHUP信号被定义为刷新配置文件,有些程序没有提供reload参数,你可以给进程发送HUP信号,让它刷新配置文件,而不用restart.通过pkill,killall,kill 都可以发送HUP信号例如: pkill -HUP httpd

1.1. Rocky Linux

CentOS 8 的后续版本,CentOS 替代方案

1.1.1. 制作 U 盘

查看 U 盘设备

	
Neo-iMac:~ neo$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *28.0 GB    disk0
   1:                        EFI ⁨EFI⁩                     314.6 MB   disk0s1
   2:                 Apple_APFS ⁨Container disk2⁩         27.7 GB    disk0s2

/dev/disk1 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk1
   1:                        EFI ⁨EFI⁩                     209.7 MB   disk1s1
   2:                 Apple_APFS ⁨Container disk2⁩         1000.0 GB  disk1s2

/dev/disk2 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +1.0 TB     disk2
                                 Physical Stores disk0s2, disk1s2
   1:                APFS Volume ⁨Macintosh HD - 数据⁩     148.6 GB   disk2s1
   2:                APFS Volume ⁨Preboot⁩                 269.0 MB   disk2s2
   3:                APFS Volume ⁨Recovery⁩                1.1 GB     disk2s3
   4:                APFS Volume ⁨VM⁩                      2.2 GB     disk2s4
   5:                APFS Volume ⁨Macintosh HD⁩            15.7 GB    disk2s5
   6:              APFS Snapshot ⁨com.apple.os.update-...⁩ 15.7 GB    disk2s5s1
   7:                APFS Volume ⁨Data⁩                    2.1 GB     disk2s7

/dev/disk3 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                                                   *30.8 GB    disk3	
	
		

/dev/disk3 是 U 盘,使用下面命令将ISO镜像制作成启动盘

		
Neo-iMac:Data neo$ ls
Rocky-8.5-x86_64-minimal.iso
 
Neo-iMac:Data neo$ sudo dd if=Rocky-8.5-x86_64-minimal.iso of=/dev/rdisk3 bs=100m
Password:
		
		

过程比较缓慢,请耐心等待

		
sudo dd if=Rocky-9.0-x86_64-minimal.iso of=/dev/rdisk4 bs=100m		
		
		

Rocky Linux 安装过程与 CentOS 8 没有太大差异。

1.1.2. Rocky-9.3-x86_64-minimal.iso 镜像初始化

首次安装后初始化系统

		 
cp /etc/dnf/dnf.conf{,.original} 
echo "fastestmirror=true" >> /etc/dnf/dnf.conf
dnf makecache 
		
		

Extra Packages for Enterprise Linux repository configuration

			
dnf -y upgrade
dnf -y install epel-release
			
		

管理员常用工具

			
dnf install -y bzip2 tree psmisc \
telnet wget rsync vim-enhanced \
net-tools bind-utils			
			
		

设置终端字符集(这样对 macOS 更友好),还可以解决 Failed to set locale, defaulting to C.UTF-8 问题

			
dnf install -y langpacks-en glibc-langpack-en
localectl set-locale LANG=en_US.UTF-8

cat >> /etc/environment <<EOF
LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8
LC_CTYPE=UTF-8
EOF
			
		

设置历史记录格式,可以看到命令的执行时间

						
cat >> /etc/profile.d/history.sh <<EOF
# Administrator specific aliases and functions for system security
export HISTSIZE=10000
export HISTFILESIZE=10000
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
export TIME_STYLE=long-iso
EOF

source /etc/profile.d/history.sh
			
		

sysctl 优化

			
cat >> /etc/sysctl.conf <<EOF

# add by netkiller
net.ipv4.ip_local_port_range = 10000 65500
net.core.somaxconn = 1024
vm.max_map_count = 262144

# TCP BBR
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
EOF

sysctl -p			
			
		

确认 ulimit 已经优化

			
cat > /etc/security/limits.d/20-nofile.conf <<EOF

root soft nofile 65535
root hard nofile 65535

docker soft nofile 65535
docker hard nofile 65535

EOF
	
			
		

设置时区

			
timedatectl set-timezone Asia/Shanghai			
			
		

安装时间同步服务 chronyd 并确认工作正常

			
dnf install -y chrony
systemctl enable chronyd
systemctl start chronyd	
			
		

zmodem 用来上传和下载文件(注意 macOS 的 Terminal.app 不支持)

			
dnf install -y lrzsz			
			
		

优化 SSH

			
cp /etc/ssh/sshd_config{,.original}

vim /etc/ssh/sshd_config <<EOF > /dev/null 2>&1
:43,43s/PermitRootLogin yes/PermitRootLogin no/
:84,84s/GSSAPIAuthentication yes/GSSAPIAuthentication no/
:99,99s/#AllowTcpForwarding yes/AllowTcpForwarding no/
:106,106/X11Forwarding yes/X11Forwarding no/
:116,116s/#TCPKeepAlive yes/TCPKeepAlive yes/
:121,121s/#UseDNS no/UseDNS no/
:wq
EOF
			
		

禁止 root 登陆,开启 sudo

禁用普通用户,我们需要一个普通用户登陆,然后使用 sudo 暂时获得 root 权限,我不打算新建一个用户,发现系统里面内置了 operator 这个操作员用户符合我的需求。

			
usermod -s /bin/bash -aG wheel operator

PASSWORD=$(cat /dev/urandom | tr -dc [:alnum:] | head -c 32)

echo operator:${PASSWORD} | chpasswd
echo "operator password: ${PASSWORD}"			
			
		

将 /usr/local/sbin:/usr/local/bin 路径加入到 Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin,否则sudo找不到 /usr/local/sbin:/usr/local/bin 中的可执行文件。

			
sed -i "s/#PermitRootLogin yes/PermitRootLogin no/" /etc/ssh/sshd_config
systemctl restart sshd
			
cp /etc/sudoers{,.original}

sed -i '88s#$#:/usr/local/sbin:/usr/local/bin#' /etc/sudoers

visudo -c
			
		

1.1.3. .Net 环境

		
[root@netkiller ~]# dnf search dotnet
Last metadata expiration check: 0:30:16 ago on Mon 06 Jan 2025 11:11:05 AM CST.
=============================================================== Name Matched: dotnet ================================================================
dotnet-apphost-pack-6.0.x86_64 : Targeting Pack for Microsoft.NETCore.App 6.0
dotnet-apphost-pack-7.0.x86_64 : Targeting Pack for Microsoft.NETCore.App 7.0
dotnet-apphost-pack-8.0.x86_64 : Targeting Pack for Microsoft.NETCore.App 8.0
dotnet-apphost-pack-9.0.x86_64 : Targeting Pack for Microsoft.NETCore.App 9.0
dotnet-host.x86_64 : .NET command line launcher
dotnet-hostfxr-6.0.x86_64 : .NET command line host resolver
dotnet-hostfxr-7.0.x86_64 : .NET command line host resolver
dotnet-hostfxr-8.0.x86_64 : .NET command line host resolver
dotnet-hostfxr-9.0.x86_64 : .NET command line host resolver
dotnet-runtime-6.0.x86_64 : NET 6.0 runtime
dotnet-runtime-7.0.x86_64 : NET 7.0 runtime
dotnet-runtime-8.0.x86_64 : NET 8.0 runtime
dotnet-runtime-9.0.x86_64 : NET 9.0 runtime
dotnet-runtime-dbg-8.0.x86_64 : Managed debug symbols NET 8.0 runtime
dotnet-runtime-dbg-9.0.x86_64 : Managed debug symbols NET 9.0 runtime
dotnet-sdk-6.0.x86_64 : .NET 6.0 Software Development Kit
dotnet-sdk-7.0.x86_64 : .NET 7.0 Software Development Kit
dotnet-sdk-8.0.x86_64 : .NET 8.0 Software Development Kit
dotnet-sdk-9.0.x86_64 : .NET 9.0 Software Development Kit
dotnet-sdk-aot-9.0.x86_64 : Ahead-of-Time (AOT) support for the .NET 9.0 Software Development Kit
dotnet-sdk-dbg-8.0.x86_64 : Managed debug symbols for the .NET 8.0 Software Development Kit
dotnet-sdk-dbg-9.0.x86_64 : Managed debug symbols for the .NET 9.0 Software Development Kit
dotnet-targeting-pack-6.0.x86_64 : Targeting Pack for Microsoft.NETCore.App 6.0
dotnet-targeting-pack-7.0.x86_64 : Targeting Pack for Microsoft.NETCore.App 7.0
dotnet-targeting-pack-8.0.x86_64 : Targeting Pack for Microsoft.NETCore.App 8.0
dotnet-targeting-pack-9.0.x86_64 : Targeting Pack for Microsoft.NETCore.App 9.0
dotnet-templates-6.0.x86_64 : .NET 6.0 templates
dotnet-templates-7.0.x86_64 : .NET 7.0 templates
dotnet-templates-8.0.x86_64 : .NET 8.0 templates
dotnet-templates-9.0.x86_64 : .NET 9.0 templates
		
		

1.1.3.1. 运行环境

只安装运行境

			
[root@netkiller ~]# dnf install dotnet-runtime-7.0
					
			

1.1.3.2. 开发包

			
[root@netkiller ~]# dnf install dotnet-sdk-7.0
			
			

1.1.3.3. aspnetcore

			
[root@netkiller ~]# dnf search aspnetcore
Last metadata expiration check: 0:31:08 ago on Mon 06 Jan 2025 11:11:05 AM CST.
======================================================== Name & Summary Matched: aspnetcore =========================================================
aspnetcore-targeting-pack-6.0.x86_64 : Targeting Pack for Microsoft.AspNetCore.App 6.0
aspnetcore-targeting-pack-7.0.x86_64 : Targeting Pack for Microsoft.AspNetCore.App 7.0
aspnetcore-targeting-pack-8.0.x86_64 : Targeting Pack for Microsoft.AspNetCore.App 8.0
aspnetcore-targeting-pack-9.0.x86_64 : Targeting Pack for Microsoft.AspNetCore.App 9.0
============================================================= Name Matched: aspnetcore ==============================================================
aspnetcore-runtime-6.0.x86_64 : ASP.NET Core 6.0 runtime
aspnetcore-runtime-7.0.x86_64 : ASP.NET Core 7.0 runtime
aspnetcore-runtime-8.0.x86_64 : ASP.NET Core 8.0 runtime
aspnetcore-runtime-9.0.x86_64 : ASP.NET Core 9.0 runtime
aspnetcore-runtime-dbg-8.0.x86_64 : Managed debug symbols for the ASP.NET Core 8.0 runtime
aspnetcore-runtime-dbg-9.0.x86_64 : Managed debug symbols for the ASP.NET Core 9.0 runtime			
			
			

1.1.3.4. 后台运行

			
[Unit]
Description="Netkiller Service"
Wants=network-online.target
StartLimitIntervalSec=60
StartLimitBurst=5
 
[Service]
WorkingDirectory=/srv/RCT/WD.Net.Web.Admin
ExecStart=dotnet /srv/RCT/WD.Net.Web.Admin/bin/Release/net7.0/WD.Net.Web.Admin.dll --urls "http://*:8086"
Restart=always
RestartSec=10s
StartLimitInterval=0 

[Install]
WantedBy=default.target
			
			
			
[root@netkiller ~]# systemctl start api.service
[root@netkiller ~]# systemctl status api.service			
			
			

配置文件中设置端口

			
dotnet YourApp.dll --urls "http://*:5002"			
			
			

在 appsettings.json 或 appsettings.Production.json 中直接配置端口号:

			
示例:

{
  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://localhost:5003"
      }
    }
  }
}			
			
			

			
[root@netkiller net7.0]# ss -lnt | egrep "8085|8086"
LISTEN 0      512                *:8086            *:*          
LISTEN 0      512                *:8085            *:*