|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
引言
Alpine Linux是一个基于musl libc和BusyBox的轻量级Linux发行版,以其安全性、简洁性和高效性而闻名。它的体积小(基本系统只有5MB左右),资源占用低,非常适合用作文件服务器的基础操作系统。本文将详细介绍如何从零开始使用Alpine Linux构建一个轻量高效的文件服务器,适合企业和个人用户使用。
文件服务器是网络中用于存储、管理和共享文件的专用计算机。在企业环境中,它通常用于集中管理文档、提供数据备份和恢复、支持多用户协作等。对于个人用户,文件服务器可以用于家庭网络中的媒体存储、文件备份和远程访问等。
选择Alpine Linux作为文件服务器的主要优势包括:
• 资源占用低:可以在老旧或低配置硬件上高效运行
• 安全性高:默认采用最小化安装原则,减少攻击面
• 稳定性好:滚动更新模式确保系统始终处于最新状态
• 包管理简单:APK包管理器简洁高效
• 容器友好:可以轻松部署在容器环境中
准备工作
系统要求
在开始之前,我们需要确保硬件满足基本要求:
• CPU:至少1GHz的单核处理器(推荐多核处理器以提高并发性能)
• 内存:至少512MB RAM(推荐2GB或更多,特别是对于多用户环境)
• 存储:至少8GB的磁盘空间(根据实际存储需求调整)
• 网络:千兆以太网接口(推荐,以提高文件传输速度)
安装Alpine Linux
1. - 下载Alpine Linux ISO镜像:
- 访问Alpine Linux官方网站(https://alpinelinux.org/downloads/)下载最新的标准版ISO镜像。
复制代码 2. 创建启动介质:
使用dd命令(Linux/macOS)或Rufus(Windows)将ISO镜像写入USB驱动器。
下载Alpine Linux ISO镜像:
访问Alpine Linux官方网站(https://alpinelinux.org/downloads/)下载最新的标准版ISO镜像。
创建启动介质:
使用dd命令(Linux/macOS)或Rufus(Windows)将ISO镜像写入USB驱动器。
在Linux上使用dd命令:
- dd if=alpine-standard-3.17.0-x86_64.iso of=/dev/sdX bs=4M status=progress
复制代码
(将/dev/sdX替换为你的USB设备)
1. 从USB启动计算机:
重启计算机,进入BIOS/UEFI设置,将启动顺序调整为首先从USB设备启动。
2. 开始安装:
系统启动后,使用root用户登录(无密码),然后运行setup-alpine脚本开始安装过程。
从USB启动计算机:
重启计算机,进入BIOS/UEFI设置,将启动顺序调整为首先从USB设备启动。
开始安装:
系统启动后,使用root用户登录(无密码),然后运行setup-alpine脚本开始安装过程。
- login: root
- Welcome to Alpine Linux 3.17
- Kernel 5.15.74-0-lts on an x86_64 (/dev/tty1)
-
- localhost:~# setup-alpine
复制代码
1. - 按照提示完成安装:键盘布局:选择适合你的键盘布局(默认为us)主机名:输入服务器的主机名(例如fileserver)网络配置:选择要配置的网卡(例如eth0)IP地址:选择dhcp或手动配置静态IP(对于服务器,建议使用静态IP)网络配置示例(静态IP):ip address: 192.168.1.100
- netmask: 255.255.255.0
- gateway: 192.168.1.1
- dns server: 8.8.8.8 8.8.4.4密码:设置root用户密码时区:选择你的时区(例如UTC)代理/镜像:如果需要,配置HTTP代理或自定义镜像源SSH服务器:选择安装OpenSSH服务器(建议选择openssh)磁盘配置:选择磁盘安装模式(sys模式将Alpine安装到磁盘,data模式将配置和数据保存到磁盘但系统运行在内存中)选择要安装的磁盘(例如sda)确认格式化并安装
复制代码 2. 键盘布局:选择适合你的键盘布局(默认为us)
3. 主机名:输入服务器的主机名(例如fileserver)
4. 网络配置:选择要配置的网卡(例如eth0)
5. IP地址:选择dhcp或手动配置静态IP(对于服务器,建议使用静态IP)
6. - 网络配置示例(静态IP):ip address: 192.168.1.100
- netmask: 255.255.255.0
- gateway: 192.168.1.1
- dns server: 8.8.8.8 8.8.4.4
复制代码 7. 密码:设置root用户密码
8. 时区:选择你的时区(例如UTC)
9. 代理/镜像:如果需要,配置HTTP代理或自定义镜像源
10. SSH服务器:选择安装OpenSSH服务器(建议选择openssh)
11. 磁盘配置:选择磁盘安装模式(sys模式将Alpine安装到磁盘,data模式将配置和数据保存到磁盘但系统运行在内存中)
12. 选择要安装的磁盘(例如sda)
13. 确认格式化并安装
14. 安装完成后,重启系统:reboot
按照提示完成安装:
• 键盘布局:选择适合你的键盘布局(默认为us)
• 主机名:输入服务器的主机名(例如fileserver)
• 网络配置:选择要配置的网卡(例如eth0)
• IP地址:选择dhcp或手动配置静态IP(对于服务器,建议使用静态IP)
• - 网络配置示例(静态IP):ip address: 192.168.1.100
- netmask: 255.255.255.0
- gateway: 192.168.1.1
- dns server: 8.8.8.8 8.8.4.4
复制代码 • 密码:设置root用户密码
• 时区:选择你的时区(例如UTC)
• 代理/镜像:如果需要,配置HTTP代理或自定义镜像源
• SSH服务器:选择安装OpenSSH服务器(建议选择openssh)
• 磁盘配置:选择磁盘安装模式(sys模式将Alpine安装到磁盘,data模式将配置和数据保存到磁盘但系统运行在内存中)
• 选择要安装的磁盘(例如sda)
• 确认格式化并安装
- ip address: 192.168.1.100
- netmask: 255.255.255.0
- gateway: 192.168.1.1
- dns server: 8.8.8.8 8.8.4.4
复制代码
安装完成后,重启系统:
基本系统配置
1. 更新系统:apk update
apk upgrade
2. 安装常用工具:apk add bash vim curl wget sudo
3. 配置时区:setup-timezone -z Asia/Shanghai
4. - 配置主机名解析:
- 编辑/etc/hosts文件,添加主机名解析:vim /etc/hosts添加以下内容(根据你的实际情况调整):127.0.0.1 localhost
- 127.0.0.1 fileserver.example.com fileserver
- ::1 localhost
- ::1 fileserver.example.com fileserver
复制代码 5. 创建普通用户(可选,但推荐):adduser -h /home/user -s /bin/bash user
6. - 配置sudo(如果创建了普通用户):apk add sudo
- visudo取消注释或添加以下行:%wheel ALL=(ALL) ALL然后将用户添加到wheel组:adduser user wheel
复制代码
更新系统:
安装常用工具:
- apk add bash vim curl wget sudo
复制代码
配置时区:
- setup-timezone -z Asia/Shanghai
复制代码
配置主机名解析:
编辑/etc/hosts文件,添加主机名解析:
添加以下内容(根据你的实际情况调整):
- 127.0.0.1 localhost
- 127.0.0.1 fileserver.example.com fileserver
- ::1 localhost
- ::1 fileserver.example.com fileserver
复制代码
创建普通用户(可选,但推荐):
- adduser -h /home/user -s /bin/bash user
复制代码
配置sudo(如果创建了普通用户):
取消注释或添加以下行:
然后将用户添加到wheel组:
网络配置
设置静态IP地址
虽然我们在安装过程中已经配置了网络,但为了确保配置正确并便于将来修改,我们可以手动配置网络。
1. 编辑网络配置文件:vim /etc/network/interfaces
2. 添加以下配置(根据你的网络环境调整):
“`
auto lo
iface lo inet loopback
编辑网络配置文件:
- vim /etc/network/interfaces
复制代码
添加以下配置(根据你的网络环境调整):
“`
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
- address 192.168.1.100
- netmask 255.255.255.0
- gateway 192.168.1.1
- dns-nameservers 8.8.8.8 8.8.4.4
复制代码- 3. 重启网络服务:
- ```bash
- service networking restart
复制代码
配置DNS
Alpine Linux使用/etc/resolv.conf文件来配置DNS服务器。我们可以手动编辑此文件:
添加以下内容(根据你的DNS服务器调整):
- nameserver 8.8.8.8
- nameserver 8.8.4.4
- search example.com
复制代码
配置防火墙
Alpine Linux默认使用iptables作为防火墙工具。我们可以配置基本防火墙规则来保护服务器:
1. 安装iptables:apk add iptables
2. 创建防火墙规则脚本:vim /etc/firewall.rules
3. 添加以下规则(根据你的需求调整):
“`bash
#!/bin/sh
安装iptables:
创建防火墙规则脚本:
添加以下规则(根据你的需求调整):
“`bash
#!/bin/sh
# 清除现有规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
# 默认策略:拒绝所有传入连接,允许所有传出连接
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接和相关连接
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
# 允许SSH(端口22)
iptables -A INPUT -p tcp –dport 22 -j ACCEPT
# 允许Samba(端口139,445)
iptables -A INPUT -p tcp –dport 139 -j ACCEPT
iptables -A INPUT -p tcp –dport 445 -j ACCEPT
iptables -A INPUT -p udp –dport 137 -j ACCEPT
iptables -A INPUT -p udp –dport 138 -j ACCEPT
# 允许NFS(端口2049)
iptables -A INPUT -p tcp –dport 2049 -j ACCEPT
iptables -A INPUT -p udp –dport 2049 -j ACCEPT
# 允许FTP(端口21)
iptables -A INPUT -p tcp –dport 21 -j ACCEPT
# 允许ICMP(ping)
iptables -A INPUT -p icmp -j ACCEPT
# 记录并拒绝其他连接
iptables -A INPUT -j LOG –log-prefix “INPUT:DROP:”
iptables -A INPUT -j DROP
- 4. 使脚本可执行:
- ```bash
- chmod +x /etc/firewall.rules
复制代码
1. 创建启动脚本以在系统启动时加载防火墙规则:vim /etc/local.d/firewall.start
2. 添加以下内容:#!/bin/sh
/etc/firewall.rules
3. 使脚本可执行:chmod +x /etc/local.d/firewall.start
4. 启用本地服务:rc-update add local default
5. 立即启动防火墙:/etc/firewall.rules
创建启动脚本以在系统启动时加载防火墙规则:
- vim /etc/local.d/firewall.start
复制代码
添加以下内容:
- #!/bin/sh
- /etc/firewall.rules
复制代码
使脚本可执行:
- chmod +x /etc/local.d/firewall.start
复制代码
启用本地服务:
- rc-update add local default
复制代码
立即启动防火墙:
存储配置
磁盘分区与格式化
在配置文件服务器之前,我们需要准备存储空间。假设我们有一个新的磁盘/dev/sdb用于存储文件。
1. 查看可用磁盘:fdisk -l
2. 使用fdisk对磁盘进行分区:fdisk /dev/sdb
查看可用磁盘:
使用fdisk对磁盘进行分区:
在fdisk命令行中:
• 输入n创建新分区
• 选择分区类型(主分区或扩展分区)
• 设置分区号
• 设置起始扇区(通常使用默认值)
• 设置结束扇区(可以使用+sizeG格式,例如+100G表示100GB)
• 输入w保存更改并退出
1. 格式化分区:mkfs.ext4 /dev/sdb1
对于需要更高性能的场景,可以考虑XFS文件系统:
- apk add xfsprogs
- mkfs.xfs /dev/sdb1
复制代码
挂载存储
1. 创建挂载点:mkdir -p /srv/storage
2. 挂载分区:mount /dev/sdb1 /srv/storage
3. 配置自动挂载:
编辑/etc/fstab文件:vim /etc/fstab
创建挂载点:
挂载分区:
- mount /dev/sdb1 /srv/storage
复制代码
配置自动挂载:
编辑/etc/fstab文件:
添加以下行(根据你的文件系统类型调整):
- /dev/sdb1 /srv/storage ext4 defaults 0 0
复制代码
1. 验证挂载:mount -a
df -h
配置RAID(可选)
对于需要更高数据可靠性的场景,可以配置RAID。以下是一个使用RAID1(镜像)的示例:
1. 安装mdadm:apk add mdadm
2. 假设我们有两个磁盘/dev/sdb和/dev/sdc,每个磁盘上都有一个分区/dev/sdb1和/dev/sdc1。
3. 创建RAID1阵列:mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
4. 格式化RAID设备:mkfs.ext4 /dev/md0
5. 挂载RAID设备:mkdir -p /srv/storage
mount /dev/md0 /srv/storage
6. 配置自动挂载:
编辑/etc/fstab文件:vim /etc/fstab
安装mdadm:
假设我们有两个磁盘/dev/sdb和/dev/sdc,每个磁盘上都有一个分区/dev/sdb1和/dev/sdc1。
创建RAID1阵列:
- mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
复制代码
格式化RAID设备:
挂载RAID设备:
- mkdir -p /srv/storage
- mount /dev/md0 /srv/storage
复制代码
配置自动挂载:
编辑/etc/fstab文件:
添加以下行:
- /dev/md0 /srv/storage ext4 defaults 0 0
复制代码
1. 保存RAID配置:mdadm --detail --scan >> /etc/mdadm/mdadm.conf
- mdadm --detail --scan >> /etc/mdadm/mdadm.conf
复制代码
配置LVM(可选)
逻辑卷管理器(LVM)提供了更灵活的存储管理方式。以下是一个基本的LVM配置示例:
1. 安装LVM工具:apk add lvm2
2. 创建物理卷(PV):pvcreate /dev/sdb1
3. 创建卷组(VG):vgcreate vg_storage /dev/sdb1
4. 创建逻辑卷(LV):lvcreate -l 100%FREE -n lv_data vg_storage
5. 格式化逻辑卷:mkfs.ext4 /dev/vg_storage/lv_data
6. 挂载逻辑卷:mkdir -p /srv/storage
mount /dev/vg_storage/lv_data /srv/storage
7. 配置自动挂载:
编辑/etc/fstab文件:vim /etc/fstab
安装LVM工具:
创建物理卷(PV):
创建卷组(VG):
- vgcreate vg_storage /dev/sdb1
复制代码
创建逻辑卷(LV):
- lvcreate -l 100%FREE -n lv_data vg_storage
复制代码
格式化逻辑卷:
- mkfs.ext4 /dev/vg_storage/lv_data
复制代码
挂载逻辑卷:
- mkdir -p /srv/storage
- mount /dev/vg_storage/lv_data /srv/storage
复制代码
配置自动挂载:
编辑/etc/fstab文件:
添加以下行:
- /dev/vg_storage/lv_data /srv/storage ext4 defaults 0 0
复制代码
文件服务选择与配置
Alpine Linux支持多种文件服务协议,包括Samba(SMB/CIFS)、NFS和FTP等。根据你的需求选择合适的文件服务。
Samba配置
Samba是一个开源软件套件,提供Windows风格的文件和打印服务。它使用SMB/CIFS协议,是跨平台文件共享的理想选择。
1. 安装Samba:apk add samba samba-common-tools
2. 创建Samba配置目录:mkdir -p /etc/samba
3. 创建基本配置文件:vim /etc/samba/smb.conf
4. - 添加以下基本配置:
- “`ini
- [global]
- workgroup = WORKGROUP
- server string = Alpine File Server
- netbios name = FILESERVER
- security = user
- map to guest = bad user
- dns proxy = no
- log file = /var/log/samba/log.%m
- max log size = 1000
- syslog = 0
- panic action = /usr/share/samba/panic-action %d
- encrypt passwords = true
- passdb backend = tdbsam
- obey pam restrictions = yes
- unix password sync = yes
- passwd program = /usr/bin/passwd %u
- passwd chat =Enter\snew\s\spassword:* %n\nRetype\snew\s\spassword:* %n\npassword\supdated\ssuccessfully.
- pam password change = yes
复制代码
安装Samba:
- apk add samba samba-common-tools
复制代码
创建Samba配置目录:
创建基本配置文件:
添加以下基本配置:
“`ini
[global]
workgroup = WORKGROUP
server string = Alpine File Server
netbios name = FILESERVER
security = user
map to guest = bad user
dns proxy = no
log file = /var/log/samba/log.%m
max log size = 1000
syslog = 0
panic action = /usr/share/samba/panic-action %d
encrypt passwords = true
passdb backend = tdbsam
obey pam restrictions = yes
unix password sync = yes
passwd program = /usr/bin/passwd %u
passwd chat =Enter\snew\s\spassword:* %n\nRetype\snew\s\spassword:* %n\npassword\supdated\ssuccessfully.
pam password change = yes
[public]
- comment = Public Storage
- path = /srv/storage/public
- browsable = yes
- writable = yes
- guest ok = yes
- read only = no
- create mask = 0777
- directory mask = 0777
- force user = nobody
- force group = nogroup
复制代码
[private]
- comment = Private Storage
- path = /srv/storage/private
- browsable = yes
- writable = yes
- valid users = @smbusers
- create mask = 0770
- directory mask = 0770
- force group = smbusers
复制代码- 5. 创建共享目录:
- ```bash
- mkdir -p /srv/storage/public
- mkdir -p /srv/storage/private
- chown nobody:nogroup /srv/storage/public
- chown root:smbusers /srv/storage/private
- chmod 777 /srv/storage/public
- chmod 770 /srv/storage/private
复制代码
1. 创建Samba用户组:addgroup smbusers
2. 添加Samba用户:adduser -h /home/user1 -s /bin/false -G smbusers user1
smbpasswd -a user1
3. 启动Samba服务:rc-update add samba default
service samba start
4. 验证Samba配置:testparm
创建Samba用户组:
添加Samba用户:
- adduser -h /home/user1 -s /bin/false -G smbusers user1
- smbpasswd -a user1
复制代码
启动Samba服务:
- rc-update add samba default
- service samba start
复制代码
验证Samba配置:
NFS配置
网络文件系统(NFS)是一种分布式文件系统协议,允许客户端计算机通过网络访问文件,就像访问本地存储一样。
1. 安装NFS服务器:apk add nfs-utils
2. - 创建NFS导出目录:mkdir -p /srv/storage/nfs
- chown nobody:nogroup /srv/storage/nfs
- chmod 777 /srv/storage/nfs
复制代码 3. 配置NFS导出:
编辑/etc/exports文件:vim /etc/exports
安装NFS服务器:
创建NFS导出目录:
- mkdir -p /srv/storage/nfs
- chown nobody:nogroup /srv/storage/nfs
- chmod 777 /srv/storage/nfs
复制代码
配置NFS导出:
编辑/etc/exports文件:
添加以下内容(根据你的网络环境调整):
- /srv/storage/nfs 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
复制代码
这表示将/srv/storage/nfs目录导出到192.168.1.0/24网络,允许读写访问。
1. 启动NFS服务:rc-update add nfs default
service nfs start
2. 导出NFS目录:exportfs -a
3. 验证NFS导出:showmount -e
启动NFS服务:
- rc-update add nfs default
- service nfs start
复制代码
导出NFS目录:
验证NFS导出:
FTP配置
文件传输协议(FTP)是一种用于在客户端和服务器之间传输文件的标准网络协议。
1. 安装FTP服务器(vsftpd):apk add vsftpd
2. 配置vsftpd:
编辑/etc/vsftpd/vsftpd.conf文件:vim /etc/vsftpd/vsftpd.conf
安装FTP服务器(vsftpd):
配置vsftpd:
编辑/etc/vsftpd/vsftpd.conf文件:
- vim /etc/vsftpd/vsftpd.conf
复制代码
添加以下配置:
- listen=YES
- anonymous_enable=NO
- local_enable=YES
- write_enable=YES
- local_umask=022
- dirmessage_enable=YES
- xferlog_enable=YES
- connect_from_port_20=YES
- xferlog_std_format=YES
- chroot_local_user=YES
- allow_writeable_chroot=YES
- pam_service_name=vsftpd
- userlist_enable=YES
- userlist_file=/etc/vsftpd/user_list
- userlist_deny=NO
复制代码
1. - 创建FTP用户目录:mkdir -p /srv/storage/ftp
- chown nobody:nogroup /srv/storage/ftp
- chmod 755 /srv/storage/ftp
复制代码 2. 创建FTP用户:adduser -h /srv/storage/ftp/user1 -s /bin/false ftpuser1
echo "ftpuser1" | tee -a /etc/vsftpd/user_list
3. 设置FTP用户密码:passwd ftpuser1
4. 启动vsftpd服务:rc-update add vsftpd default
service vsftpd start
创建FTP用户目录:
- mkdir -p /srv/storage/ftp
- chown nobody:nogroup /srv/storage/ftp
- chmod 755 /srv/storage/ftp
复制代码
创建FTP用户:
- adduser -h /srv/storage/ftp/user1 -s /bin/false ftpuser1
- echo "ftpuser1" | tee -a /etc/vsftpd/user_list
复制代码
设置FTP用户密码:
启动vsftpd服务:
- rc-update add vsftpd default
- service vsftpd start
复制代码
用户与权限管理
创建用户和组
在文件服务器中,合理的用户和组管理对于安全性和数据组织至关重要。
1. 创建用户:adduser -h /home/user1 -s /bin/bash user1
2. 创建组:addgroup developers
addgroup managers
3. 将用户添加到组:adduser user1 developers
adduser user1 managers
4. 查看用户和组信息:id user1
groups user1
创建用户:
- adduser -h /home/user1 -s /bin/bash user1
复制代码
创建组:
- addgroup developers
- addgroup managers
复制代码
将用户添加到组:
- adduser user1 developers
- adduser user1 managers
复制代码
查看用户和组信息:
设置文件权限
1. 设置目录权限:
“`bash创建项目目录mkdir -p /srv/storage/projects
mkdir -p /srv/storage/projects/project1
mkdir -p /srv/storage/projects/project2
设置目录权限:
“`bash
mkdir -p /srv/storage/projects
mkdir -p /srv/storage/projects/project1
mkdir -p /srv/storage/projects/project2
# 设置组所有权
chown -R root:developers /srv/storage/projects/project1
chown -R root:managers /srv/storage/projects/project2
# 设置目录权限
chmod -R 770 /srv/storage/projects/project1
chmod -R 770 /srv/storage/projects/project2
- 2. 设置SGID位,确保新创建的文件继承目录的组:
- ```bash
- chmod -R g+s /srv/storage/projects/project1
- chmod -R g+s /srv/storage/projects/project2
复制代码
1. - 设置默认ACL(访问控制列表):apk add acl
- setfacl -d -m u::rwx,g::rwx,o::--- /srv/storage/projects/project1
- setfacl -d -m u::rwx,g::rwx,o::--- /srv/storage/projects/project2
复制代码- apk add acl
- setfacl -d -m u::rwx,g::rwx,o::--- /srv/storage/projects/project1
- setfacl -d -m u::rwx,g::rwx,o::--- /srv/storage/projects/project2
复制代码
配置磁盘配额
磁盘配额可以限制用户或组可用的磁盘空间量,防止单个用户占用过多空间。
1. 安装配额工具:apk add quota
2. 编辑/etc/fstab文件,为文件系统启用配额:vim /etc/fstab
安装配额工具:
编辑/etc/fstab文件,为文件系统启用配额:
修改相关行,添加usrquota和grpquota选项:
- /dev/sdb1 /srv/storage ext4 defaults,usrquota,grpquota 0 0
复制代码
1. 重新挂载文件系统:mount -o remount /srv/storage
2. 创建配额数据库文件:quotacheck -cug /srv/storage
3. 生成初始配额表:quotacheck -avug
4. 启用配额:quotaon -avug
5. 为用户设置配额:# 为user1设置软限制10GB,硬限制12GB
setquota -u user1 10G 12G 0 0 /srv/storage
6. 为组设置配额:# 为developers组设置软限制50GB,硬限制60GB
setquota -g developers 50G 60G 0 0 /srv/storage
7. 查看配额报告:repquota -a
重新挂载文件系统:
- mount -o remount /srv/storage
复制代码
创建配额数据库文件:
- quotacheck -cug /srv/storage
复制代码
生成初始配额表:
启用配额:
为用户设置配额:
- # 为user1设置软限制10GB,硬限制12GB
- setquota -u user1 10G 12G 0 0 /srv/storage
复制代码
为组设置配额:
- # 为developers组设置软限制50GB,硬限制60GB
- setquota -g developers 50G 60G 0 0 /srv/storage
复制代码
查看配额报告:
安全配置
配置SSH安全
SSH是远程管理服务器的主要方式,确保其安全性至关重要。
1. 编辑SSH配置文件:vim /etc/ssh/sshd_config
2. 修改以下配置以提高安全性:
“`禁用root登录PermitRootLogin no
编辑SSH配置文件:
修改以下配置以提高安全性:
“`
PermitRootLogin no
# 仅允许特定用户登录
AllowUsers user1 user2
# 禁用密码认证,仅允许密钥认证(可选)
PasswordAuthentication no
# 更改默认端口
Port 2222
# 禁用空密码
PermitEmptyPasswords no
# 设置最大登录尝试次数
MaxAuthTries 3
# 设置登录超时时间
LoginGraceTime 60
# 仅使用SSH协议2
Protocol 2
- 3. 重启SSH服务:
- ```bash
- service sshd restart
复制代码
1. 为用户生成SSH密钥(在客户端计算机上):ssh-keygen -t rsa -b 4096
2. 将公钥复制到服务器:ssh-copy-id -p 2222 user1@fileserver.example.com
为用户生成SSH密钥(在客户端计算机上):
- ssh-keygen -t rsa -b 4096
复制代码
将公钥复制到服务器:
- ssh-copy-id -p 2222 user1@fileserver.example.com
复制代码
配置Fail2ban
Fail2ban是一个入侵防御软件,可以保护服务器免受暴力破解攻击。
1. 安装Fail2ban:apk add fail2ban
2. 创建配置文件:cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
3. 编辑配置文件:vim /etc/fail2ban/jail.local
4. - 修改以下配置:
- “`
- [DEFAULT]
- bantime = 1h
- findtime = 10m
- maxretry = 5
复制代码
安装Fail2ban:
创建配置文件:
- cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
复制代码
编辑配置文件:
- vim /etc/fail2ban/jail.local
复制代码
修改以下配置:
“`
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
port = 2222
logpath = /var/log/messages
- 5. 启动Fail2ban服务:
- ```bash
- rc-update add fail2ban default
- service fail2ban start
复制代码
配置自动安全更新
定期更新系统是保持服务器安全的重要措施。
1. 安装必要的工具:apk add e2fsprogs-extra
2. 创建自动更新脚本:vim /etc/periodic/daily/security-updates
3. 添加以下内容:
“`bash
#!/bin/sh
安装必要的工具:
创建自动更新脚本:
- vim /etc/periodic/daily/security-updates
复制代码
添加以下内容:
“`bash
#!/bin/sh
# 更新包索引
apk update > /var/log/apk-update.log 2>&1
# 升级系统
apk upgrade –available > /var/log/apk-upgrade.log 2>&1
# 清理缓存
cache_clean
- 4. 使脚本可执行:
- ```bash
- chmod +x /etc/periodic/daily/security-updates
复制代码
1. 确保定期任务服务已启用:rc-update add crond default
service crond start
- rc-update add crond default
- service crond start
复制代码
高级功能
配置RAID
如果之前没有配置RAID,现在可以按照以下步骤配置:
1. 安装mdadm:apk add mdadm
2. 创建RAID1阵列(假设有两个磁盘/dev/sdb和/dev/sdc):mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
3. 格式化RAID设备:mkfs.ext4 /dev/md0
4. 挂载RAID设备:mkdir -p /srv/storage
mount /dev/md0 /srv/storage
5. 配置自动挂载:
编辑/etc/fstab文件:vim /etc/fstab
安装mdadm:
创建RAID1阵列(假设有两个磁盘/dev/sdb和/dev/sdc):
- mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
复制代码
格式化RAID设备:
挂载RAID设备:
- mkdir -p /srv/storage
- mount /dev/md0 /srv/storage
复制代码
配置自动挂载:
编辑/etc/fstab文件:
添加以下行:
- /dev/md0 /srv/storage ext4 defaults 0 0
复制代码
1. 保存RAID配置:mdadm --detail --scan >> /etc/mdadm/mdadm.conf
- mdadm --detail --scan >> /etc/mdadm/mdadm.conf
复制代码
配置LVM快照
LVM快照是创建文件系统时间点映像的有效方法,可用于备份或测试目的。
1. 创建快照:# 创建一个大小为1GB的快照
lvcreate -L 1G -s -n lv_data_snapshot /dev/vg_storage/lv_data
2. 挂载快照:mkdir -p /mnt/snapshot
mount /dev/vg_storage/lv_data_snapshot /mnt/snapshot
3. 使用快照(例如,备份或恢复文件):# 从快照恢复文件
cp /mnt/snapshot/important_file /srv/storage/
4. 卸载并删除快照:umount /mnt/snapshot
lvremove /dev/vg_storage/lv_data_snapshot
创建快照:
- # 创建一个大小为1GB的快照
- lvcreate -L 1G -s -n lv_data_snapshot /dev/vg_storage/lv_data
复制代码
挂载快照:
- mkdir -p /mnt/snapshot
- mount /dev/vg_storage/lv_data_snapshot /mnt/snapshot
复制代码
使用快照(例如,备份或恢复文件):
- # 从快照恢复文件
- cp /mnt/snapshot/important_file /srv/storage/
复制代码
卸载并删除快照:
- umount /mnt/snapshot
- lvremove /dev/vg_storage/lv_data_snapshot
复制代码
配置自动备份
定期备份是保护数据的重要措施。以下是一个使用rsync进行增量备份的示例。
1. 安装rsync:apk add rsync
2. 创建备份脚本:vim /usr/local/bin/backup.sh
3. 添加以下内容:
“`bash
#!/bin/sh
安装rsync:
创建备份脚本:
- vim /usr/local/bin/backup.sh
复制代码
添加以下内容:
“`bash
#!/bin/sh
# 设置变量
SOURCE_DIR=”/srv/storage”
BACKUPDIR=“/srv/backups”
DATE=$(date +%Y%m%d%H%M%S)
LOG_FILE=“/var/log/backup.log”
# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR
# 记录开始时间
echo “Backup started at\((date)" >> \)LOG_FILE
# 执行备份
rsync -a –delete –link-dest=\(BACKUP_DIR/latest \)SOURCE_DIR/\(BACKUP_DIR/\)DATE >> $LOG_FILE 2>&1
# 更新最新备份链接
rm -f\(BACKUP_DIR/latest
ln -s \)BACKUP_DIR/\(DATE \)BACKUP_DIR/latest
# 记录结束时间
echo “Backup completed at\((date)" >> \)LOG_FILE
echo “————————” >> $LOG_FILE
- 4. 使脚本可执行:
- ```bash
- chmod +x /usr/local/bin/backup.sh
复制代码
1. 添加到crontab以定期执行:crontab -e
添加以下行以每天凌晨2点执行备份:
- 0 2 * * * /usr/local/bin/backup.sh
复制代码
1. 确保crond服务已启用:rc-update add crond default
service crond start
- rc-update add crond default
- service crond start
复制代码
监控与维护
配置系统监控
监控系统资源使用情况对于维护服务器性能至关重要。
1. 安装监控工具:apk add htop iotop vmstat
2. 使用htop监控系统资源:htop
3. 使用iotop监控磁盘I/O:iotop
4. 使用vmstat监控虚拟内存统计:vmstat 1
安装监控工具:
- apk add htop iotop vmstat
复制代码
使用htop监控系统资源:
使用iotop监控磁盘I/O:
使用vmstat监控虚拟内存统计:
配置日志管理
1. 安装logrotate:apk add logrotate
2. 创建日志轮转配置:vim /etc/logrotate.d/fileserver
3. - 添加以下内容:
- “`
- /var/log/samba/log.* {
- weekly
- missingok
- rotate 4
- compress
- delaycompress
- notifempty
- create 640 root adm
- }
复制代码
安装logrotate:
创建日志轮转配置:
- vim /etc/logrotate.d/fileserver
复制代码
添加以下内容:
“`
/var/log/samba/log.* {
weekly
missingok
rotate 4
compress
delaycompress
notifempty
create 640 root adm
}
/var/log/vsftpd.log {
- weekly
- missingok
- rotate 4
- compress
- delaycompress
- notifempty
- create 640 root adm
复制代码
}
/var/log/backup.log {
- weekly
- missingok
- rotate 4
- compress
- delaycompress
- notifempty
- create 640 root adm
复制代码
}
- 4. 测试logrotate配置:
- ```bash
- logrotate -f /etc/logrotate.d/fileserver
复制代码
配置系统更新
1. 创建系统更新脚本:vim /usr/local/bin/system-update.sh
2. 添加以下内容:
“`bash
#!/bin/sh
创建系统更新脚本:
- vim /usr/local/bin/system-update.sh
复制代码
添加以下内容:
“`bash
#!/bin/sh
# 记录开始时间
echo “System update started at $(date)” >> /var/log/system-update.log
# 更新包索引
apk update >> /var/log/system-update.log 2>&1
# 升级系统
apk upgrade –available >> /var/log/system-update.log 2>&1
# 清理缓存
cache_clean >> /var/log/system-update.log 2>&1
# 记录结束时间
echo “System update completed at $(date)” >> /var/log/system-update.log
echo “————————” >> /var/log/system-update.log
- 3. 使脚本可执行:
- ```bash
- chmod +x /usr/local/bin/system-update.sh
复制代码
1. 添加到crontab以每周执行一次:crontab -e
添加以下行以每周日凌晨2点执行系统更新:
- 0 2 * * 0 /usr/local/bin/system-update.sh
复制代码
实战案例
企业环境案例
假设我们需要为一家中型企业搭建文件服务器,要求如下:
• 支持多部门文件共享
• 提供用户认证和权限管理
• 支持Windows和Linux客户端访问
• 实现数据冗余和备份
• 提供监控和日志功能
1. 硬件准备:服务器:2U机架式服务器,配备双核CPU,8GB内存,4块1TB SATA硬盘(用于RAID 10)网络:千兆以太网连接
2. 服务器:2U机架式服务器,配备双核CPU,8GB内存,4块1TB SATA硬盘(用于RAID 10)
3. 网络:千兆以太网连接
4. 系统安装:
按照前面的步骤安装Alpine Linux,并配置静态IP地址(例如192.168.1.100)。
5. 存储配置:
“`bash安装mdadm和lvm2apk add mdadm lvm2
硬件准备:
• 服务器:2U机架式服务器,配备双核CPU,8GB内存,4块1TB SATA硬盘(用于RAID 10)
• 网络:千兆以太网连接
系统安装:
按照前面的步骤安装Alpine Linux,并配置静态IP地址(例如192.168.1.100)。
存储配置:
“`bash
apk add mdadm lvm2
# 创建RAID 10阵列
mdadm –create /dev/md0 –level=10 –raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
# 创建物理卷
pvcreate /dev/md0
# 创建卷组
vgcreate vg_raid /dev/md0
# 创建逻辑卷
lvcreate -l 100%FREE -n lv_data vg_raid
# 格式化逻辑卷
mkfs.ext4 /dev/vg_raid/lv_data
# 挂载逻辑卷
mkdir -p /srv/storage
mount /dev/vg_raid/lv_data /srv/storage
# 配置自动挂载
echo “/dev/vg_raid/lv_data /srv/storage ext4 defaults 0 0” >> /etc/fstab
# 保存RAID配置
mdadm –detail –scan >> /etc/mdadm/mdadm.conf
- 4. **目录结构创建**:
- ```bash
- # 创建部门目录
- mkdir -p /srv/storage/departments/{hr,finance,engineering,marketing}
- mkdir -p /srv/storage/public
- mkdir -p /srv/storage/backups
- # 创建用户和组
- addgroup hr
- addgroup finance
- addgroup engineering
- addgroup marketing
- # 创建用户并添加到相应组
- adduser -h /home/hr_manager -s /bin/bash -G hr hr_manager
- adduser -h /home/finance_manager -s /bin/bash -G finance finance_manager
- adduser -h /home/engineer1 -s /bin/bash -G engineering engineer1
- adduser -h /home/marketing_manager -s /bin/bash -G marketing marketing_manager
- # 设置目录权限
- chown -R root:hr /srv/storage/departments/hr
- chown -R root:finance /srv/storage/departments/finance
- chown -R root:engineering /srv/storage/departments/engineering
- chown -R root:marketing /srv/storage/departments/marketing
- chown -R root:nogroup /srv/storage/public
- chmod -R 770 /srv/storage/departments/hr
- chmod -R 770 /srv/storage/departments/finance
- chmod -R 770 /srv/storage/departments/engineering
- chmod -R 770 /srv/storage/departments/marketing
- chmod -R 777 /srv/storage/public
- # 设置SGID位
- chmod -R g+s /srv/storage/departments/hr
- chmod -R g+s /srv/storage/departments/finance
- chmod -R g+s /srv/storage/departments/engineering
- chmod -R g+s /srv/storage/departments/marketing
复制代码
1. Samba配置:
“`bash安装Sambaapk add samba samba-common-tools
Samba配置:
“`bash
apk add samba samba-common-tools
# 创建Samba配置
cat > /etc/samba/smb.conf << EOF
[global]
- workgroup = COMPANY
- server string = Company File Server
- netbios name = FILESERVER
- security = user
- map to guest = bad user
- dns proxy = no
- log file = /var/log/samba/log.%m
- max log size = 1000
- syslog = 0
- panic action = /usr/share/samba/panic-action %d
- encrypt passwords = true
- passdb backend = tdbsam
- obey pam restrictions = yes
- unix password sync = yes
- passwd program = /usr/bin/passwd %u
- passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
- pam password change = yes
复制代码
[public]
- comment = Public Storage
- path = /srv/storage/public
- browsable = yes
- writable = yes
- guest ok = yes
- read only = no
- create mask = 0777
- directory mask = 0777
- force user = nobody
- force group = nogroup
复制代码
- comment = HR Department
- path = /srv/storage/departments/hr
- browsable = yes
- writable = yes
- valid users = @hr
- create mask = 0770
- directory mask = 0770
- force group = hr
复制代码
[finance]
- comment = Finance Department
- path = /srv/storage/departments/finance
- browsable = yes
- writable = yes
- valid users = @finance
- create mask = 0770
- directory mask = 0770
- force group = finance
复制代码
[engineering]
- comment = Engineering Department
- path = /srv/storage/departments/engineering
- browsable = yes
- writable = yes
- valid users = @engineering
- create mask = 0770
- directory mask = 0770
- force group = engineering
复制代码
[marketing]
- comment = Marketing Department
- path = /srv/storage/departments/marketing
- browsable = yes
- writable = yes
- valid users = @marketing
- create mask = 0770
- directory mask = 0770
- force group = marketing
复制代码
EOF
# 添加Samba用户
echo -e “password\npassword” | smbpasswd -a hr_manager
echo -e “password\npassword” | smbpasswd -a finance_manager
echo -e “password\npassword” | smbpasswd -a engineer1
echo -e “password\npassword” | smbpasswd -a marketing_manager
# 启动Samba服务
rc-update add samba default
service samba start
- 6. **NFS配置**(用于Linux客户端):
- ```bash
- # 安装NFS服务器
- apk add nfs-utils
- # 配置NFS导出
- cat > /etc/exports << EOF
- /srv/storage/departments/hr 192.168.1.0/24(rw,sync,no_subtree_check)
- /srv/storage/departments/finance 192.168.1.0/24(rw,sync,no_subtree_check)
- /srv/storage/departments/engineering 192.168.1.0/24(rw,sync,no_subtree_check)
- /srv/storage/departments/marketing 192.168.1.0/24(rw,sync,no_subtree_check)
- /srv/storage/public 192.168.1.0/24(rw,sync,no_subtree_check)
- EOF
- # 启动NFS服务
- rc-update add nfs default
- service nfs start
- # 导出NFS目录
- exportfs -a
复制代码
1. 备份配置:
“`bash安装rsyncapk add rsync
备份配置:
“`bash
apk add rsync
# 创建备份脚本
cat > /usr/local/bin/backup.sh << ‘EOF’
#!/bin/sh
# 设置变量
SOURCE_DIR=”/srv/storage”
BACKUPDIR=“/srv/backups”
DATE=$(date +%Y%m%d%H%M%S)
LOG_FILE=“/var/log/backup.log”
# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR
# 记录开始时间
echo “Backup started at\((date)" >> \)LOG_FILE
# 执行备份
rsync -a –delete –link-dest=\(BACKUP_DIR/latest \)SOURCE_DIR/\(BACKUP_DIR/\)DATE >> $LOG_FILE 2>&1
# 更新最新备份链接
rm -f\(BACKUP_DIR/latest
ln -s \)BACKUP_DIR/\(DATE \)BACKUP_DIR/latest
# 记录结束时间
echo “Backup completed at\((date)" >> \)LOG_FILE
echo “————————” >> $LOG_FILE
EOF
# 使脚本可执行
chmod +x /usr/local/bin/backup.sh
# 添加到crontab以每天凌晨2点执行备份
echo “0 2 * * * /usr/local/bin/backup.sh” | crontab -
# 确保crond服务已启用
rc-update add crond default
service crond start
- 8. **监控配置**:
- ```bash
- # 安装监控工具
- apk add htop iotop vmstat
- # 创建系统监控脚本
- cat > /usr/local/bin/system-monitor.sh << 'EOF'
- #!/bin/sh
- # 设置变量
- LOG_FILE="/var/log/system-monitor.log"
- DATE=$(date +"%Y-%m-%d %H:%M:%S")
- # 记录系统状态
- echo "===== System Status at $DATE =====" >> $LOG_FILE
- # 记录磁盘使用情况
- echo "Disk Usage:" >> $LOG_FILE
- df -h >> $LOG_FILE
- # 记录内存使用情况
- echo "Memory Usage:" >> $LOG_FILE
- free -h >> $LOG_FILE
- # 记录CPU使用情况
- echo "CPU Usage:" >> $LOG_FILE
- uptime >> $LOG_FILE
- # 记录进程信息
- echo "Top Processes:" >> $LOG_FILE
- ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head >> $LOG_FILE
- echo "=============================" >> $LOG_FILE
- echo "" >> $LOG_FILE
- EOF
- # 使脚本可执行
- chmod +x /usr/local/bin/system-monitor.sh
- # 添加到crontab以每小时执行一次
- echo "0 * * * * /usr/local/bin/system-monitor.sh" | crontab -
复制代码
个人环境案例
假设我们需要为家庭用户搭建文件服务器,要求如下:
• 提供家庭媒体存储和共享
• 支持多设备访问(PC、手机、平板等)
• 提供个人文件备份功能
• 简单易用的用户界面
• 低功耗运行
1. 硬件准备:设备:树莓派4B(4GB内存)或类似低功耗设备存储:1TB或2TB外置USB硬盘网络:千兆以太网连接
2. 设备:树莓派4B(4GB内存)或类似低功耗设备
3. 存储:1TB或2TB外置USB硬盘
4. 网络:千兆以太网连接
5. 系统安装:
下载适用于树莓派的Alpine Linux镜像,按照官方指南安装到SD卡。
6. 存储配置:
“`bash识别USB硬盘(假设为/dev/sda)fdisk -l
硬件准备:
• 设备:树莓派4B(4GB内存)或类似低功耗设备
• 存储:1TB或2TB外置USB硬盘
• 网络:千兆以太网连接
系统安装:
下载适用于树莓派的Alpine Linux镜像,按照官方指南安装到SD卡。
存储配置:
“`bash
fdisk -l
# 创建分区(如果需要)
# fdisk /dev/sda
# 格式化分区(假设为/dev/sda1)
mkfs.ext4 /dev/sda1
# 创建挂载点
mkdir -p /srv/storage
# 挂载分区
mount /dev/sda1 /srv/storage
# 配置自动挂载
echo “/dev/sda1 /srv/storage ext4 defaults 0 0” >> /etc/fstab
- 4. **目录结构创建**:
- ```bash
- # 创建目录结构
- mkdir -p /srv/storage/{media,documents,backups,public}
- mkdir -p /srv/storage/media/{movies,music,photos}
- mkdir -p /srv/storage/documents/{personal,shared}
- # 创建用户
- adduser -h /home/family -s /bin/bash family
- # 设置目录权限
- chown -R family:family /srv/storage
- chmod -R 755 /srv/storage
- chmod -R 777 /srv/storage/public
复制代码
1. Samba配置:
“`bash安装Sambaapk add samba samba-common-tools
Samba配置:
“`bash
apk add samba samba-common-tools
# 创建Samba配置
cat > /etc/samba/smb.conf << EOF
[global]
- workgroup = WORKGROUP
- server string = Home File Server
- netbios name = HOMESERVER
- security = user
- map to guest = bad user
- dns proxy = no
- log file = /var/log/samba/log.%m
- max log size = 1000
- syslog = 0
- panic action = /usr/share/samba/panic-action %d
- encrypt passwords = true
- passdb backend = tdbsam
- obey pam restrictions = yes
- unix password sync = yes
- passwd program = /usr/bin/passwd %u
- passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
- pam password change = yes
复制代码
[public]
- comment = Public Storage
- path = /srv/storage/public
- browsable = yes
- writable = yes
- guest ok = yes
- read only = no
- create mask = 0777
- directory mask = 0777
- force user = family
- force group = family
复制代码
[media]
- comment = Media Files
- path = /srv/storage/media
- browsable = yes
- writable = yes
- valid users = family
- create mask = 0755
- directory mask = 0755
- force user = family
- force group = family
复制代码
[documents]
- comment = Documents
- path = /srv/storage/documents
- browsable = yes
- writable = yes
- valid users = family
- create mask = 0755
- directory mask = 0755
- force user = family
- force group = family
复制代码
[backups]
- comment = Backup Storage
- path = /srv/storage/backups
- browsable = yes
- writable = yes
- valid users = family
- create mask = 0755
- directory mask = 0755
- force user = family
- force group = family
复制代码
EOF
# 添加Samba用户
echo -e “password\npassword” | smbpasswd -a family
# 启动Samba服务
rc-update add samba default
service samba start
- 6. **配置DLNA媒体服务器**(用于媒体流):
- ```bash
- # 安装minidlna
- apk add minidlna
- # 配置minidlna
- cat > /etc/minidlna.conf << EOF
- media_dir=V,/srv/storage/media/movies
- media_dir=A,/srv/storage/media/music
- media_dir=P,/srv/storage/media/photos
- db_dir=/var/lib/minidlna
- log_dir=/var/log
- port=8200
- inotify=yes
- enable_tivo=no
- strict_dlna=no
- notify_interval=900
- serial=12345678
- model_name=Home Media Server
- friendly_name=Home Media Server
- EOF
- # 创建必要的目录
- mkdir -p /var/lib/minidlna
- # 启动minidlna服务
- rc-update add minidlna default
- service minidlna start
复制代码
1. 配置FTP(用于远程访问):
“`bash安装vsftpdapk add vsftpd
配置FTP(用于远程访问):
“`bash
apk add vsftpd
# 配置vsftpd
cat > /etc/vsftpd/vsftpd.conf << EOF
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
allow_writeable_chroot=YES
pam_service_name=vsftpd
userlist_enable=YES
userlist_file=/etc/vsftpd/user_list
userlist_deny=NO
pasv_min_port=40000
pasv_max_port=50000
EOF
# 创建用户列表
echo “family” > /etc/vsftpd/user_list
# 启动vsftpd服务
rc-update add vsftpd default
service vsftpd start
- 8. **配置自动备份**:
- ```bash
- # 安装rsync
- apk add rsync
- # 创建备份脚本
- cat > /usr/local/bin/backup.sh << 'EOF'
- #!/bin/sh
- # 设置变量
- SOURCE_DIR="/home/family"
- BACKUP_DIR="/srv/storage/backups"
- DATE=$(date +%Y%m%d_%H%M%S)
- LOG_FILE="/var/log/backup.log"
- # 创建备份目录(如果不存在)
- mkdir -p $BACKUP_DIR
- # 记录开始时间
- echo "Backup started at $(date)" >> $LOG_FILE
- # 执行备份
- rsync -a --delete --link-dest=$BACKUP_DIR/latest $SOURCE_DIR/ $BACKUP_DIR/$DATE >> $LOG_FILE 2>&1
- # 更新最新备份链接
- rm -f $BACKUP_DIR/latest
- ln -s $BACKUP_DIR/$DATE $BACKUP_DIR/latest
- # 记录结束时间
- echo "Backup completed at $(date)" >> $LOG_FILE
- echo "------------------------" >> $LOG_FILE
- EOF
- # 使脚本可执行
- chmod +x /usr/local/bin/backup.sh
- # 添加到crontab以每天凌晨2点执行备份
- echo "0 2 * * * /usr/local/bin/backup.sh" | crontab -
- # 确保crond服务已启用
- rc-update add crond default
- service crond start
复制代码
1. 配置Web界面(可选,用于简化管理):
“`bash安装Nginx和PHPapk add nginx php7 php7-fpm php7-session php7-json
配置Web界面(可选,用于简化管理):
“`bash
apk add nginx php7 php7-fpm php7-session php7-json
# 配置Nginx
cat > /etc/nginx/nginx.conf << EOF
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
}
http {
- include /etc/nginx/mime.types;
- default_type application/octet-stream;
- sendfile on;
- keepalive_timeout 65;
- server {
- listen 80;
- server_name localhost;
- root /var/www/html;
- index index.php index.html index.htm;
- location / {
- try_files $uri $uri/ =404;
- }
- location ~ \.php$ {
- fastcgi_pass unix:/var/run/php/php7-fpm.sock;
- fastcgi_index index.php;
- include fastcgi_params;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- }
- }
复制代码
}
EOF
# 配置PHP-FPM
cat > /etc/php7/php-fpm.conf << EOF
[global]
pid = /var/run/php/php7-fpm.pid
error_log = /var/log/php/php7-fpm.log
[www]
user = nginx
group = nginx
listen = /var/run/php/php7-fpm.sock
listen.owner = nginx
listen.group = nginx
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
EOF
# 创建Web根目录
mkdir -p /var/www/html
# 创建简单的文件管理界面
cat > /var/www/html/index.php << ‘EOF’
<!DOCTYPE html>
- <title>Home File Server</title>
- <style>
- body { font-family: Arial, sans-serif; margin: 20px; }
- table { border-collapse: collapse; width: 100%; }
- th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
- th { background-color: #f2f2f2; }
- tr:nth-child(even) { background-color: #f9f9f9; }
- a { text-decoration: none; }
- a:hover { text-decoration: underline; }
- </style>
复制代码- <h1>Home File Server</h1>
- <p>Welcome to your home file server. You can access your files using the links below:</p>
- <ul>
- <li><a href="/media">Media Files</a></li>
- <li><a href="/documents">Documents</a></li>
- <li><a href="/public">Public Files</a></li>
- <li><a href="/backups">Backups</a></li>
- </ul>
- <h2>File Browser</h2>
- <?php
- $dir = isset($_GET['dir']) ? $_GET['dir'] : '/srv/storage';
- $dir = realpath($dir);
- if (strpos($dir, '/srv/storage') !== 0) {
- $dir = '/srv/storage';
- }
- echo '<p>Current directory: ' . htmlspecialchars($dir) . '</p>';
- echo '<table>';
- echo '<tr><th>Name</th><th>Size</th><th>Type</th><th>Modified</th></tr>';
- if ($dir != '/srv/storage') {
- $parent = dirname($dir);
- echo '<tr><td><a href="?dir=' . urlencode($parent) . '">..</a></td><td>-</td><td>Parent Directory</td><td>-</td></tr>';
- }
- if (is_dir($dir)) {
- if ($dh = opendir($dir)) {
- while (($file = readdir($dh)) !== false) {
- if ($file != '.' && $file != '..') {
- $fullpath = $dir . '/' . $file;
- $type = filetype($fullpath);
- $size = is_file($fullpath) ? filesize($fullpath) : '-';
- $modified = date('Y-m-d H:i:s', filemtime($fullpath));
- if ($type == 'dir') {
- $name = '<a href="?dir=' . urlencode($fullpath) . '">' . htmlspecialchars($file) . '</a>';
- } else {
- $name = htmlspecialchars($file);
- }
- echo '<tr><td>' . $name . '</td><td>' . $size . '</td><td>' . $type . '</td><td>' . $modified . '</td></tr>';
- }
- }
- closedir($dh);
- }
- }
- echo '</table>';
- ?>
复制代码 |
|