一直想自己搞一个服务器,现在手头上有一块树莓派,就想着自己搭建一下。
1.配置
硬件:树莓派B4
硬盘:4T机械硬盘
系统:ubuntu-22.04.2-preinstalled-server-arm64+raspi(树莓派官网下载)
2.前期准备
根据树莓派官网设置烧录系统并运行起来。
3.挂载硬盘
3.1 将机械硬盘格式化以便挂载
实操过程中,发现卷标为中文时,用ubuntu的控制台修改卷标会报错,建议卷标修改为英文卷标。
3.2 挂载硬盘
将硬盘接到树莓派上,然后挂载,这一步需要先接好硬盘,然后再启动机器,否则操作时会报Input/Output错误。
3.2.1创建目录:
linux中硬盘挂载需要挂载到系统的目录下,因为linux系统无法自动识别,只能挂载的指定的目录中,网上说一般在mnt目录下创建,作为一个新手,那我也在该目录下创建。
sudo mkdir /mnt/DbDisk
3.2.2 识别硬盘
通过fdisk -l指令识别硬盘:
ubuntu@ubuntu:~$ sudo fdisk -l
Disk /dev/loop0: 59.09 MiB, 61956096 bytes, 121008 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop1: 59.12 MiB, 61988864 bytes, 121072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop2: 109.61 MiB, 114929664 bytes, 224472 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop3: 43.19 MiB, 45289472 bytes, 88456 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop4: 43.18 MiB, 45277184 bytes, 88432 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sdb: 119.24 GiB, 128035676160 bytes, 250069680 sectors
Disk model: e SSD ST600 MSAT
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 33553920 bytes
Disklabel type: dos
Disk identifier: 0x12c9124a
Device Boot Start End Sectors Size Id Type
/dev/sdb1 * 2048 526335 524288 256M c W95 FAT32 (LBA)
/dev/sdb2 526336 250069679 249543344 119G 83 Linux
Disk /dev/sda: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: 006-3CW104
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 9463367F-46F9-46DB-AC72-5633AEA58D7E
Device Start End Sectors Size Type
/dev/sda1 4096 7814037134 7814033039 3.6T Microsoft basic data
我要挂在的硬盘是/dev/sda1,这个我是根据自己要挂载的硬盘大小识别的。
3.2.3 挂载硬盘:
sudo mount /dev/sda1 /mnt/DbDisk
通过sudo df可以查看硬盘挂载情况,我目前将sda1硬盘挂载到DbDisk目录下
ubuntu@ubuntu:~$ sudo df
Filesystem 1K-blocks Used Available Use% Mounted on
tmpfs 388000 3176 384824 1% /run
/dev/sdb2 122731688 4809364 111667360 5% /
tmpfs 1939984 0 1939984 0% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
/dev/sdb1 258095 151621 106475 59% /boot/firmware
/dev/sda1 3907016516 221416 3906795100 1% /mnt/DbDisk
tmpfs 387996 4 387992 1% /run/user/1000
3.2.4 设置自动挂载
直接挂载,需要每次重启的时候均需要挂载一次,一般设置自动挂载比较香,可通过修改配置文件实现。
ubuntu@ubuntu:~$ sudo vim /etc/fstab
然后再配置文件中加入要新挂载的盘:
LABEL=writable / ext4 discard,errors=remount-ro 0 1
LABEL=system-boot /boot/firmware vfat defaults 0 1
/dev/sda1 /mnt/DbDisk ntfs auto,user,rw 0 1
挂载开头的识别号可用LABEL卷标,UUID硬盘编号,或者向我一样直接写系统识别到的设备路径。实际使用时我出现过LABEL和UUID都无法识别的情况,所以我后面改成使用设备路径直接挂载,好用。
若要挂载的硬盘支持acl,需要再支持的属性中添加acl。既属性修改未auto,user,rw,acl
设置完之后,可以重启树莓派看下是否能正常运行。
4.安装svnserver
4.1 安装svn服务器
sudo apt-get install subversion
4.2 创建svn仓库文件夹
ubuntu@ubuntu:~$ sudo mkdir /mnt/DbDisk/svn
在硬盘目录下创建一个svn仓库文件夹,用来做svn仓库文件夹。
ubuntu@ubuntu:/mnt/DbDisk/svn$ sudo mkdir test
ubuntu@ubuntu:/mnt/DbDisk/svn$ ls
test
在仓库目录下一个版本库test
4.3 创建版本库
sudo svnadmin create /mnt/DbDisk/svn/test
ubuntu@ubuntu:/mnt/DbDisk/svn/test$ ls
README.txt conf db format hooks locks
ubuntu@ubuntu:/mnt/DbDisk/svn/test$ ls -a
. .. README.txt conf db format hooks locks
ubuntu@ubuntu:/mnt/DbDisk/svn/test$
创建完之后目录下又文件。
4.4 配置
通过修改conf文件夹下的文件配置权限。
注意,修改配置文件svnserve.conf、authz、passwd文件时,所有行头不能有空给,末尾也不能添加空空格,下午配置#号说明的信息主要用于备注,实际修改时不能添加,否则会报“authorization failed”错误。
4.4.1 svnserve.conf文件
[general]
### The anon-access and auth-access options control access to the
### repository for unauthenticated (a.k.a. anonymous) users and
### authenticated users, respectively.
### Valid values are "write", "read", and "none".
### Setting the value to "none" prohibits both reading and writing;
### "read" allows read-only access, and "write" allows complete
### read/write access to the repository.
### The sample settings below are the defaults and specify that anonymous
### users have read-only access to the repository, while authenticated
### users have read and write access to the repository.
anon-access = none # 设置匿名用户不可读
auth-access = write # 权限用户可写
### The password-db option controls the location of the password
### database file. Unless you specify a path starting with a /,
### the file's location is relative to the directory containing
### this configuration file.
### If SASL is enabled (see below), this file will NOT be used.
### Uncomment the line below to use the default password file.
password-db = passwd # 使用用密码文件
### The authz-db option controls the location of the authorization
### rules for path-based access control. Unless you specify a path
### starting with a /, the file's location is relative to the
### directory containing this file. The specified path may be a
### repository relative URL (^/) or an absolute file:// URL to a text
### file in a Subversion repository. If you don't specify an authz-db,
### no path-based access control is done.
### Uncomment the line below to use the default authorization file.
authz-db = authz # 使用权限文件
注:如果要全局配置权限,可以将用户和权限的库文件authz和passwd文件存储到一个特定位置,然后文件配置中,采用相对路径或者绝对路径指向到存储的位置,如下示例,以相对路径指向:
password-db = ../../conf/passwd
authz-db = ../../conf/authz
4.4.2 authz文件
[groups]
# harry_and_sally = harry,sally
# harry_sally_and_joe = harry,sally,&joe
# [/foo/bar]
# harry = rw
# &joe = r
# * =
# [repository:/baz/fuz]
# @harry_and_sally = rw
# * = r
# 在末尾添加信息
admin = admin # 管理员用户admin分组属于admin组
[/] # 从仓库开始设置权限
@admin = rw # 管理员组的权限是读写
注:/路径是启动svn服务器时设置的根目录,如果库目录不是在根目录下,而是在根目录下的其他文件夹下,则指定库是需要加上子目录,示例如下:
[forder/repos:/...]
4.4.3 passwd文件
[users]
# harry = harryssecret
# sally = sallyssecret
admin = 123456 # 在末尾添加用户和密码,明文输入
4.5 启动服务器
ubuntu@ubuntu:/mnt/DbDisk/svn/test/conf$ sudo svnserve -d -r /mnt/DbDisk/svn
- -d:标识以守护模式启动
- -r:设置svn存储库根目录,这样访问的时候不要输入完整路径
- 其他:暂时还没研究。
4.6 查看连接状态
ubuntu@ubuntu:~$ ps -aux | grep svnserve
root 1588 0.0 0.0 18904 2552 ? Ss 07:46 0:00 svnserve -d -r /mnt/DbDisk/svn
ubuntu 1598 0.0 0.0 6420 1864 pts/0 S+ 07:51 0:00 grep --color=auto svnserve
u
有看到服务表示服务器启动成功。
4.7停止服务器
killall svnserve
4.8 设置开机自启动
4.8.1 使用update-rc.d增加开机启动服务
注:此方法我尝试了,但是没有成功启动,后面改用4.8.2的方法实现。
svn开机自启动需要通过配置脚本文件进行启动,在/etc/init.d文件夹下添加启动脚本文件。
# 切到启动文件夹
ubuntu@ubuntu:~$ cd /etc/init.d
# 创建脚本文件
ubuntu@ubuntu:/etc/init.d$ sudo vim svnstart.sh
修改脚本文件:
其中“/mnt/DbDisk/svn”就是自己挂载的svn库根目录。
#!/bin/bash
#svnserve startup
sudo svnserve -d -r /mnt/DbDisk/svn
exit 0
修改脚本文件的权限为755:
# 修改权限
ubuntu@ubuntu:/etc/init.d$ sudo chmod 755 svnstart.sh
添加脚本文件,默认启动:
ubuntu@ubuntu:/etc/init.d$ update-rc.d svnstart.sh defaults
==== AUTHENTICATING FOR org.freedesktop.systemd1.reload-daemon ===
Authentication is required to reload the systemd state.
Authenticating as: Ubuntu (ubuntu)
Password:
==== AUTHENTICATION COMPLETE ===
ubuntu@ubuntu:/etc/init.d$
4.8.2 使用rc.local设置开机自启动
切到etc目录下
ubuntu@ubuntu:~$ cd /etc
编辑rc.local,注有的系统没有这个文件,直接新建即可:
ubuntu@ubuntu:/etc$ sudo vim rc.local
输入启动内容:
#!/bin/bash
sudo svnserve -d -r /mnt/DbDisk/svn
exit 0
然后esc,按:wq保存退出。
修改rc.local文件权限:
sudo chmod +x rc.local
然后重启服务器。完事
5 访问svn
5.1 查看端口
ubuntu@ubuntu:~$ sudo netstat -anp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 822/systemd-resolve
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 1588/svnserve
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 987/sshd: /usr/sbin
tcp 0 0 192.168.1.17:22 192.168.1.19:60135 ESTABLISHED 1312/sshd: ubuntu [
tcp6 0 0 :::3389 :::* LISTEN 936/xrdp
tcp6 0 0 ::1:3350 :::* LISTEN 896/xrdp-sesman
tcp6 0 0 :::22 :::* LISTEN 987/sshd: /usr/sbin
udp 0 0 127.0.0.53:53 0.0.0.0:* 822/systemd-resolve
udp 0 0 192.168.1.17:68 0.0.0.0:* 820/systemd-network
udp6 0 0 fe80::dea6:32ff:fe4:546 :::* 820/systemd-network
raw6 0 0 :::58 :::* 7 820/systemd-network
通过sudo netstat -anp 查看svn服务的端口号,这边我们可以看到svn服务器的默认端口为3690。
5.2 开放svn服务器端口
ubuntu@ubuntu:~$ sudo ufw allow 3690 # 开放端口
Rule added
Rule added (v6)
ubuntu@ubuntu:~$ sudo ufw status #检查端口状态
Status: active
To Action From
-- ------ ----
3690 ALLOW Anywhere
3690 (v6) ALLOW Anywhere (v6)
端口打开后就可以通过外部访问。
5.3 访问svn库
我是以window环境的svn客户端访问的 :
试着创建个文件夹:
5.4 愉快的玩耍吧
网上资料看着一看就觉得自己会,实际还是需要动手去实践才能发现问题,只有自己动手配置过了才能有所收获。
6 从Windows服务器迁移svn数据到ubuntu中
6.1 dump指令介绍
svnadmin dump REPOS_PATH [-r LOWER[:UPPER]] [--incremental] Repos.dump
- REPOS_PATH :仓库完整路径或者相对路径
- [-r LOWER[:UPPER]]:指定要导出的版本信息
- [--incremental]:表示以增量方式导出,就是每次只导出上个一版的变化信息,这样可以用于将不同的版本进行分割拆分,便于备份。
- Repos.dump:备份的文件名,建议文件名以库名命名,然后如果是分割不同版本导出的,建议备注不同版本。
6.2 在Windows服务器中使用dump指令备份整个数据库
svnadmin dump svnrepositories > svnrepositories.dump
dump是svn的备份指令。
运行cmd,然后通过cd指令切换到版本库所在文件夹,然后运行上述指令进行备份。
备份的文件名最好与库名称保持一致,便于后续管理。
C:\Users\Administrator>cd C:\Repositories
C:\Repositories>svnadmin dump RepoName > RepoName.dump
* Dumped revision 0.
* Dumped revision 1.
* Dumped revision 2.
* Dumped revision 3.
* Dumped revision 4.
* Dumped revision 5.
* Dumped revision 6.
* Dumped revision 7.
* Dumped revision 8.
* Dumped revision 9.
* Dumped revision 10.
* Dumped revision 11.
* Dumped revision 12.
* Dumped revision 13.
......
# 等到备份完成
6.3 使用dump指令以增量式模式分割导出库进行备份
使用增量式导出需要先将最初的版本导出,然后后续的版本再使用增量式的模式进行导出。
svnadmin dump RepoName -r 0:100 > RepoName_0-100.dump
然后后续的版本导出是添加[--incremental]参数以增量式模式导出。
svnadmin dump RepoName -r 101:200 --incremental > RepoName_101-200.dump
依次类推分批导出。
6.4 将文件拷贝到ubuntu服务器中
我是使用scp通过ssh拷贝的,可以根据自己的实际情况进行拷贝。
(base) PS D:\svn> scp -p 3122 RepoName.dump ubuntu@***:/mnt/DbDisk/svn/
warning: agent returned different signature type ssh-rsa (expected rsa-sha2-512)
3122: No such file or directory
RepoName.dump 100% 930MB 3.1MB/s 05:03
(base) PS D:\svn>
6.5 创建一个新的库
svnadmin create RepoName
6.6 通过load指令加载库
svnadmin load RepoName < RepoName.dump
如果是使用增量式导出的,需要按照顺序依次导入对应的包文件。
7 踩坑
在配置完之后,我测试了CPU的温升(手指温度计)觉的还可以,我就听信了网上说的树莓派,不跑大软件不用加散热,结果在我跑了一个礼拜之后,终于,我的服务器顺利的gg了,结果我还是没有加散热,我买了个只能排插,搞个非工作时间断电,结果如何,后面再看。