准备系统
在这里下载最新的镜像,或者在这里下载历史镜像。
可以选择不带桌面最精简的Lite
,这里使用最新的带桌面的with desktop
版本。
建议下载种子,然后使用迅雷等下载工具下载。
下载 Win32 Disk Imager,直接下载即可,安装。
将SD卡通过读卡器连接到电脑,从下载的文件(.zip)解压出系统(.img),选择后写入,等待5分钟左右。
写入完成后,在boot
盘里新建空白文件ssh
,不需要后缀,后续SSH连接时使用。
可以直接右键新建一个TXT文件,重命名为ssh
。
安全弹出SD卡,将SD卡插到树莓派上。
插上网线连接到路由器,使用5V 2.5A适配器供电。
配置网络
登录路由器管理界面,查看树莓派IP地址。
使用SSH工具连接到树莓派,这里使用MobaXterm。
默认账户名:pi
,密码:raspberry
。
pi@raspberrypi:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.103 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::d8e:4f58:5590:c47c prefixlen 64 scopeid 0x20<link>
ether b8:27:eb:22:30:9f txqueuelen 1000 (Ethernet)
RX packets 514 bytes 45984 (44.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 198 bytes 36548 (35.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
默认没有打开无线网卡,使用rfkill unblock
。
pi@raspberrypi:~ $ rfkill list
0: phy0: Wireless LAN
Soft blocked: yes
Hard blocked: no
1: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
pi@raspberrypi:~ $ rfkill unblock 0
pi@raspberrypi:~ $ rfkill list
0: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
1: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
pi@raspberrypi:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.103 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::d8e:4f58:5590:c47c prefixlen 64 scopeid 0x20<link>
ether b8:27:eb:22:30:9f txqueuelen 1000 (Ethernet)
RX packets 779 bytes 64604 (63.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 284 bytes 45312 (44.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlan0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether b8:27:eb:77:65:ca txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
修改网络接口配置文件/etc/network/interfaces
。设置为动态IP,配置无线网络的SSID和密码。
pi@raspberrypi:~ $ sudo vi /etc/network/interfaces
# 在最后添加
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid "IoT"
wpa-psk "12345678"
重启树莓派sudo reboot now
。
可以在路由器管理界面看到树莓派的无线网卡连接上了。
使用路由器DHCP服务器的静态地址分配功能,为树莓派固定IP地址。
树莓派的网络名称默认是raspberrypi
,可以修改以便更好地辨识。
需要改两个地方,/etc/hostname
和/etc/hosts
。
首先,hostname
文件里直接编辑替换掉文件内容即可,必须是一个单词,不能包含任何标点符号和特殊字符(包括下划线_)。
pi@raspberrypi:~ $ sudo vi /etc/hostname
其次,在hosts
中最后一行,将raspberrypi
替换成与前面一致的单词。
pi@raspberrypi:~ $ sudo vi /etc/hosts
配置完成后重启树莓派。路由器管理页可以看到两个静态IP,分别是有线网卡和无线网卡的。此时可以拔下网线,使用SSH登录无线网卡对应的IP地址。
更新源
将软件源更改为国内的清华源 ,提高软件的下载的稳定性和速度。
pi@nas:~ $ sudo vi /etc/apt/sources.list
# 注释掉原内容
# 添加以下内容
# 注意,如果系统是stretch的,要将buster改为stretch。
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi
pi@nas:~ $ sudo vi /etc/apt/sources.list.d/raspi.list
# 注释掉原内容
# 添加以下内容
# 注意,如果系统是stretch的,要将buster改为stretch。
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
# 最后,更新软件源列表
pi@nas:~ $ sudo apt-get update
xrdp
软件。pi@nas:~ $ sudo apt-get install xrdp
xrdp
是一个 守护进程,安装完后和树莓派启动时,xrdp
服务会自动启动。
在Windows中,按住WIN
+R
,弹出运行
窗口, 输入mstsc
,启动远程桌面连接
。
账户信息和登录树莓派是使用的一样,默认帐号pi
,密码raspberry
。
6. 修改密码
出于安全考虑,通过passwd
修改用户pi
和root
密码。
pi@nas:~ $ sudo passwd pi
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
pi@nas:~ $ sudo passwd root
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
注意RDP登录的密码也受此影响。
sudo fdisk -l
可以看到连接的U盘。pi@nas:~ $ sudo fdisk -l
# 此处省略其他磁盘信息
Disk /dev/sda: 28.9 GiB, 31029460992 bytes, 60604416 sectors
Disk model: DataTraveler 3.0
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x4512774c
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 109824 60604415 60494592 28.9G c W95 FAT32 (LBA)
Disk /dev/sdb: 28.9 GiB, 31029460992 bytes, 60604416 sectors
Disk model: DataTraveler 3.0
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd6f680e7
Device Boot Start End Sectors Size Id Type
/dev/sdb1 * 109824 60604415 60494592 28.9G c W95 FAT32 (LBA)
删除原有的分区表,创建只包含一个分区的分区表,并格式化为ext4文件系统。
pi@nas:~ $ sudo fdisk /dev/sda1
Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): o # o是创建一个空的分区表
Created a new DOS disklabel with disk identifier 0xdda30595.
Command (m for help): n # n是添加新的分区
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): # 直接回车,默认创建主分区
Using default response p.
Partition number (1-4, default 1): # 直接回车,默认值
First sector (2048-60494591, default 2048): # 直接回车,默认值
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-60494591, default 60494591): # 直接回车,默认值
Created a new partition 1 of type 'Linux' and of size 28.9 GiB.
Command (m for help): p # p是打印分区表
Disk /dev/sda1: 28.9 GiB, 30973231104 bytes, 60494592 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
Disklabel type: dos
Disk identifier: 0xdda30595
Device Boot Start End Sectors Size Id Type
/dev/sda1p1 2048 60494591 60492544 28.9G 83 Linux
Command (m for help): w # w是将分区表写入磁盘并退出
The partition table has been altered.
Syncing disks.
# 格式化U盘,需要等待几分钟,需要先卸载了再格式化
pi@nas:~ $ sudo mkfs.ext4 /dev/sda1 # 挂载时格式化报错
mke2fs 1.44.5 (15-Dec-2018)
Found a dos partition table in /dev/sda1
Proceed anyway? (y,N) y # 输入y
/dev/sda1 is mounted; will not make a filesystem here!
pi@nas:~ $ umount /dev/sda1 # 先卸载U盘
pi@nas:~ $ sudo mkfs.ext4 /dev/sda1 # 格式化
mke2fs 1.44.5 (15-Dec-2018)
Found a dos partition table in /dev/sda1
Proceed anyway? (y,N) y # 输入y
Creating filesystem with 7561824 4k blocks and 1892352 inodes
Filesystem UUID: 0024c9ea-4959-44d7-aece-9465c84dc085
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
对第二个U盘/dev/sdb1
也是同样的操作,将以上命令里的/dev/sda1
更换为/dev/sdb1
就可以。
pi@nas:~ $ sudo fdisk /dev/sdb1
pi@nas:~ $ umount /dev/sdb1
pi@nas:~ $ sudo mkfs.ext4 /dev/sdb1
为方便后续的磁盘管理,使用e2label
为磁盘指定卷标。这样就可以通过卷标挂载磁盘,即使磁盘更换了接口。
pi@nas:~ $ sudo e2label /dev/sda1 data
pi@nas:~ $ sudo e2label /dev/sdb1 backup
pi@nas:~ $ sudo e2label /dev/sda1
data
pi@nas:~ $ sudo e2label /dev/sdb1
backup
格式化和建立卷标也可以合为一条命令,但还是建议先全部格式化后再统一指定卷标。
pi@nas:~ $ sudo mke2fs -t ext4 /dev/sda1 -L data
pi@nas:~ $ sudo mke2fs -t ext4 /dev/sdb1 -L backup
# 安装 autofs
pi@nas:~ $ sudo apt install autofs
# 创建挂载点 /nas
pi@nas:~ $ sudo mkdir /nas
# 设置使用时自动挂载设备
# 修改 /etc/auto.master
pi@nas:~ $ sudo vi /etc/auto.master
# 在文件最后添加
/nas /etc/auto.misc
# 修改 /etc/auto.misc
pi@nas:~ $ sudo vi /etc/auto.misc
# 在文件最后添加
data -fstype=ext4,rw :/dev/disk/by-label/data
backup -fstype=ext4,rw :/dev/disk/by-label/backup
# 重新启动autofs服务
pi@nas:~ $ sudo service autofs restart
pi@nas:~ $ ls /nas/ # 此时没有挂载U盘
pi@nas:~ $ cd /nas/data # 使用时自动挂载data
pi@nas:/nas/data $ ls /nas/
data
pi@nas:/nas/data $ cd /nas/backup # 使用时自动挂载backup
pi@nas:/nas/backup $ ls /nas
backup data
# 安装NFS服务器
pi@nas:~ $ sudo apt install nfs-kernel-server
# 公开/nas/data目录
pi@nas:~ $ sudo vi /etc/exports
# 在文件最后添加
/nas/data 192.168.0.*(rw,sync,no_subtree_check,no_root_squash)
# 重新启动NFS服务
pi@nas:~ $ sudo systemctl restart nfs-server.service
# 设置NFS服务开机自启动
pi@nas:~ $ sudo systemctl enable nfs-server
# 启动和停止命令
pi@nas:~ $ sudo systemctl start nfs-server.service
pi@nas:~ $ sudo systemctl stop nfs-server.service
# 查询NFS服务状态
pi@nas:~ $ sudo systemctl status nfs-server.service
启动或关闭Windows功能
中,启用NFS服务
。WIN
+R
,弹出运行
窗口, 输入regedit
,启动注册表编辑器
。HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default
,添加两项AnonymousUid
、AnonymousGid
,值为0
,否则对NFS服务器的文件只有读权限。WIN
+R
,弹出运行
窗口, 输入cmd
,启动命令行窗口
。C:\Users\LCH>showmount -e \\192.168.0.121
导出列表在 192.168.0.121:
/nas/data 192.168.0.*
C:\Users\LCH>mount \\192.168.0.121\nas\data X:\
X: 现已成功连接到 \\192.168.0.121\nas\data
命令已成功完成。
C:\Users\LCH>umount X:\
正在断开连接 X: \\192.168.0.121\nas\data
命令已成功完成。
pi@NAS:~ $ sudo apt-get install nfs-common portmap
pi@NAS:~ $ sudo mkdir /mnt/data
pi@NAS:~ $ sudo mount -t nfs 192.168.0.121:/nas/data /mnt/data
pi@NAS:~ $ ls /mnt/data/
lost+found
pi@NAS:~ $
rsync算法
来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。/nas/data
的数据拷贝到/nas/backup
里。/nas/backup
里初始化一个完整的备份。pi@nas:~ $ sudo rsync -a /nas/data/ /nas/backup/2020-04-19
这里,新建了一个初始化脚本InitializeBackup.sh
用于初始化完整备份。
#!/bin/bash
# InitializeBackup.sh
DATADIR=/nas/data/
BACKUPDIR=/nas/backup/
TODAY=$(date +%Y-%m-%d)
TODAYPATH=${BACKUPDIR}/${TODAY}/
LASTDAY=$(ls ${BACKUPDIR} | tail -n 1)
LASTDAYPATH=${BACKUPDIR}/${LASTDAY}/
# echo "${TODAYPATH}"
# echo "${LASTDAYPATH}"
if [[ ! -n "${LASTDAY}" ]]; then
echo "Initialization:${TODAYPATH}"
if [[ ! -e ${TODAYPATH} ]]; then
mkdir -p ${TODAYPATH}
fi
rsync -a ${DATADIR} ${TODAYPATH}
elif [[ "${LASTDAYPATH}" == "${TODAYPATH}" ]]; then
echo "Reinitialization:${TODAYPATH}"
rm -rf ${TODAYPATH}
rsync -a ${DATADIR} ${TODAYPATH}
else
echo "Not clean:${BACKUPDIR}"
fi
在后续的备份中,使用--link-dest=DIR
参数,当文件未改变时,基于DIR创建硬链接文件。
比如,基于初始化的完整备份,新建增量备份2020-04-20
。
pi@nas:~ $ sudo rsync -a --link-dest /nas/backup/2020-04-19/ /nas/data/ /nas/backup/2020-04-20/
# 可以看到测试文件2020-4-19.txt的文件ID是一样
pi@nas:~ $ ls -i /nas/backup/2020-04-19
262147 2020-4-19.txt 262146 lost+found
pi@nas:~ $ ls -i /nas/backup/2020-04-20
262147 2020-4-19.txt 1048579 2020-4-20.txt 1048578 lost+found
这里,新建了一个日常备份脚本DailyBackup.sh
,用于后续新建日常任务时进行调用。
#!/bin/bash
# DailyBackup.sh
DATADIR=/nas/data/
BACKUPDIR=/nas/backup/
SCRIPTDIR=/nas/data/backup_scripts
TODAY=$(date +%Y-%m-%d)
TODAYPATH=${BACKUPDIR}/${TODAY}/
LASTDAY=$(ls ${BACKUPDIR} | grep -v -e log | tail -n 1)
LASTDAYPATH=${BACKUPDIR}/${LASTDAY}/
echo "Incremental backup: ${TODAYPATH}"
rsync -a --link-dest ${LASTDAYPATH} ${DATADIR} ${TODAYPATH}
#!/bin/bash
# DeleteOldBackup.sh
BACKUPDIR=/nas/backup/
# backups of January 1st for the last 5 years
function listYearlyBackups() {
for i in {0..4}
do
ls ${BACKUPDIR} | egrep "$(date +%Y -d "${i} year ago")-01-01"
# ls用于列出备份目录下的所有备份,目录名格式是yyyy-mm-dd,如2020-04-19,然后通过管道连接egrep
# egrep通过模式匹配,查找yyyy-01-01的目录,也就是每年1月1日的目录,其中,yyyy通过date命令和for循环获取当年以及往前4年的年份
done
}
# backups of the 1st of the last 12 months
function listMonthlyBackups() {
for i in {0..11}
do
ls ${BACKUPDIR} | egrep "$(date +%Y-%m -d "${i} month ago")-01"
# 原理同上,匹配当年当月以及往前11个月的1号
done
}
# backups of the last 4 Sundays
function listWeeklyBackups() {
for i in {0..3}
do
ls ${BACKUPDIR} | grep "$(date +%Y-%m-%d -d "-$(($(date +%u) + 7*${i})) day")"
# 原理同上,匹配当年当周以及往前3周的周日
done
}
# backups of the last 7 days
function listDailyBackups() {
for i in {0..6}
do
ls ${BACKUPDIR} | grep "$(date +%Y-%m-%d -d "-${i} day")"
# 原理同上,匹配当年当月当日以及往前6天
done
}
# get all reserved backups
function getAllBackups() {
listYearlyBackups
listMonthlyBackups
listWeeklyBackups
listDailyBackups
}
# remove duplicates
function listUniqueBackups() {
getAllBackups | sort -u
# sort -u 用于删除重复目录
}
# filter out backups for deletion
function listBackupsToDelete() {
ls ${BACKUPDIR} | grep -v -e "$(echo -n $(listUniqueBackups) |sed "s/ /\\\|/g")"
# grep -v 反转查找,即出列后面列出的保留的目录外,其他目录均删除
# grep -e 进行模式匹配
# sed命令对字符串进行字符替换,\\\|是\|的转义,s/ /\\\|/g是将空格替换为\|
}
cd ${BACKUPDIR}
echo "Reserved backups: $(listUniqueBackups | xargs)"
echo "Deleted backups: $(listBackupsToDelete | xargs)"
listBackupsToDelete | xargs rm -rf # 通过管道和xargs命令将要删除的目录传给rm命令
/nas/data/
便可以了。heirloom-mailx
。# 安装 heirloom-mailx
pi@nas:~ $ sudo apt-get install heirloom-mailx
# 修改配置
pi@nas:~ $ sudo vi /etc/s-nail.rc
# 在最后添加
set from="[email protected]"
set smtp="smtps://smtp.163.com:465"
set smtp-auth-user="[email protected]" # 这里我发送和接收用同一个邮箱,不然可能会被认为是垃圾邮件
set smtp-auth-password="your_password" # 网易邮箱使用的是授权码,在网页邮箱里设置
set smtp-auth=login
pi@nas:~ $ echo "test" | heirloom-mailx -s "TEST" "[email protected]"
DailyRun.sh
,调用备份DailyBackup.sh
、删除备份DeleteOldBackup.sh
、检查磁盘容量CheckDiskRemain.sh
,并将log以邮件形式发送出去。#!/bin/bash
# CheckDiskRemain.sh
DATADIR=/nas/data
BACKUPDIR=/nas/backup
# 简单地使用df显示磁盘空间并匹配出/nas/data和/nas/backup
df -h | grep -e 'Filesystem' -e ${DATADIR} -e ${BACKUPDIR}
#!/bin/bash
# DailyRun.sh
DATADIR=/nas/data/
BACKUPDIR=/nas/backup/
SCRIPTDIR=/nas/data/backup_scripts/
TODAY=$(date +%Y-%m-%d)
LOGFILE=${BACKUPDIR}/${TODAY}.log
EMAIL="[email protected]"
if [[ -f ${LOGFILE} ]];then
rm ${LOGFILE}
fi
# 暂存标准输出和错误输出
exec 3>&1
exec 4>&2
# 将标准输出和错误输出重定向到log文件
exec 1>>${LOGFILE}
exec 2>>${LOGFILE}
# 调用相关脚本并将打印信息输出到log文件
echo "**********DAILYBACKUP**********"
${SCRIPTDIR}/DailyBackup.sh
echo -e "\n**********DELETEBACKUP**********"
${SCRIPTDIR}/DeleteOldBackup.sh
echo -e "\n***********DISKREMAIN***********"
${SCRIPTDIR}/CheckDiskRemain.sh
echo -e "\n"
# 恢复标准输出和错误输出
exec 1>&3
exec 2>&4
# cat ${LOGFILE}
# 发送邮件并且将错误输出到log文件
heirloom-mailx -s "Raspberry Pi NAS Log - ${TODAY}" ${EMAIL} < ${LOGFILE} 2>>${LOGFILE}
先测试运行下脚本。
pi@nas:~ $ sudo /nas_backup_scripts/DailyRun.sh
pi@nas:~ $ cat /nas/backup/2020-04-19.log
**********DAILYBACKUP**********
Incremental backup: /nas/backup//2020-04-19/
**********DELETEBACKUP**********
Reserved backups: 2020-04-19 2020-04-19.log
Deleted backups:
***********DISKREMAIN***********
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 29G 45M 27G 1% /nas/data
/dev/sda1 29G 45M 27G 1% /nas/backup
pi@nas:~ $ date
Sun 19 Apr 18:16:57 BST 2020
可以直接通过raspi-config
-4 Localisation Options
-I2 Change Timezone
-Asia
-Shanghai
设置。
pi@nas:~ $ sudo raspi-config
Current default time zone: 'Asia/Shanghai'
Local time is now: Mon Apr 20 01:18:51 CST 2020.
Universal Time is now: Sun Apr 19 17:18:51 UTC 2020.
pi@nas:~ $ date
Mon 20 Apr 01:18:58 CST 2020
再运行一次脚本。
pi@nas:sudo /nas_backup_scripts/DailyRun.sh
pi@nas:~ $ cat /nas/backup/2020-04-20.log
**********DAILYBACKUP**********
Incremental backup: /nas/backup//2020-04-20/
**********DELETEBACKUP**********
Reserved backups: 2020-04-19 2020-04-19.log 2020-04-20 2020-04-20.log
Deleted backups:
***********DISKREMAIN***********
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 29G 45M 27G 1% /nas/data
/dev/sda1 29G 45M 27G 1% /nas/backup
pi@nas:~ $ sudo crontab -e # -e表示编辑用户的计时器设置
no crontab for root - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.tiny
3. /bin/ed
Choose 1-3 [1]: 2
crontab: installing new crontab
# 这里会打开文件,在文件最后添加
0 2 * * * /nas_backup_scripts/DailyRun.sh
# 顺序是分、时、日、月、周、命令
# 这里表示的是每天2点执行DailyRun.sh
# 直接查看或者修改文件
pi@nas:~ $ sudo cat /var/spool/cron/crontabs/root