Skip to main content

树莓派自建 NAS 云盘之——树莓派搭建网络存储盘 | Linux 中国

我将在接下来的这三篇文章中讲述如何搭建一个简便、实用的 NAS 云盘系统。我在这个中心化的存储系统中存储数据,并且让它每晚都会自动的备份增量数据。本系列文章将利用 NFS 文件系统将磁盘挂载到同一网络下的不同设备上,使用 Nextcloud[1] 来离线访问数据、分享数据。
本文主要讲述将数据盘挂载到远程设备上的软硬件步骤。本系列第二篇文章将讨论数据备份策略、如何添加定时备份数据任务。最后一篇文章中我们将会安装 Nextcloud 软件,用户通过 Nextcloud 提供的 web 界面可以方便的离线或在线访问数据。本系列教程最终搭建的 NAS 云盘支持多用户操作、文件共享等功能,所以你可以通过它方便的分享数据,比如说你可以发送一个加密链接,跟朋友分享你的照片等等。
最终的系统架构如下图所示:
硬件
首先需要准备硬件。本文所列方案只是其中一种示例,你也可以按不同的硬件方案进行采购。
最主要的就是树莓派 3[2],它带有四核 CPU、1G RAM,以及(比较)快速的网络接口。数据将存储在两个 USB 磁盘驱动器上(这里使用 1TB 磁盘);其中一个磁盘用于每天数据存储,另一个用于数据备份。请务必使用有源 USB 磁盘驱动器或者带附加电源的 USB 集线器,因为树莓派无法为两个 USB 磁盘驱动器供电。
软件
在该社区中最活跃的操作系统当属 Raspbian[3],便于定制个性化项目。已经有很多 操作指南[4] 讲述如何在树莓派中安装 Raspbian 系统,所以这里不再赘述。在撰写本文时,最新的官方支持版本是 Raspbian Stretch[5],它对我来说很好使用。
到此,我将假设你已经配置好了基本的 Raspbian 系统并且可以通过 ssh 访问到你的树莓派。
准备 USB 磁盘驱动器
为了更好地读写数据,我建议使用 ext4 文件系统去格式化磁盘。首先,你必须先找到连接到树莓派的磁盘。你可以在 /dev/sd/ 中找到磁盘设备。使用命令 fdisk -l,你可以找到刚刚连接的两块 USB 磁盘驱动器。请注意,操作下面的步骤将会清除 USB 磁盘驱动器上的所有数据,请做好备份。
  1. pi@raspberrypi:~ $ sudo fdisk -l
  2. <...>
  3. Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
  4. Units: sectors of 1 * 512 = 512 bytes
  5. Sector size (logical/physical): 512 bytes / 512 bytes
  6. I/O size (minimum/optimal): 512 bytes / 512 bytes
  7. Disklabel type: dos
  8. Disk identifier: 0xe8900690
  9. Device     Boot Start        End    Sectors   Size Id Type
  10. /dev/sda1        2048 1953525167 1953523120 931.5G 83 Linux
  11. Disk /dev/sdb: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
  12. Units: sectors of 1 * 512 = 512 bytes
  13. Sector size (logical/physical): 512 bytes / 512 bytes
  14. I/O size (minimum/optimal): 512 bytes / 512 bytes
  15. Disklabel type: dos
  16. Disk identifier: 0x6aa4f598
  17. Device     Boot Start        End    Sectors   Size Id Type
  18. /dev/sdb1  *     2048 1953521663 1953519616 931.5G  83 Linux
由于这些设备是连接到树莓派的唯一的 1TB 的磁盘,所以我们可以很容易的辨别出 /dev/sda和 /dev/sdb 就是那两个 USB 磁盘驱动器。每个磁盘末尾的分区表提示了在执行以下的步骤后如何查看,这些步骤将会格式化磁盘并创建分区表。为每个 USB 磁盘驱动器按以下步骤进行操作(假设你的磁盘也是 /dev/sda 和 /dev/sdb,第二次操作你只要替换命令中的 sda为 sdb 即可)。
首先,删除磁盘分区表,创建一个新的并且只包含一个分区的新分区表。在 fdisk 中,你可以使用交互单字母命令来告诉程序你想要执行的操作。只需要在提示符 Command(m for help): 后输入相应的字母即可(可以使用 m 命令获得更多详细信息):
  1. pi@raspberrypi:~ $ sudo fdisk /dev/sda
  2. Welcome to fdisk (util-linux 2.29.2).
  3. Changes will remain in memory only, until you decide to write them.
  4. Be careful before using the write command.
  5. Command (m for help): o
  6. Created a new DOS disklabel with disk identifier 0x9c310964.
  7. Command (m for help): n
  8. Partition type
  9.   p   primary (0 primary, 0 extended, 4 free)
  10.   e   extended (container for logical partitions)
  11. Select (default p): p
  12. Partition number (1-4, default 1):
  13. First sector (2048-1953525167, default 2048):
  14. Last sector, +sectors or +size{K,M,G,T,P} (2048-1953525167, default 1953525167):
  15. Created a new partition 1 of type 'Linux' and of size 931.5 GiB.
  16. Command (m for help): p
  17. Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
  18. Units: sectors of 1 * 512 = 512 bytes
  19. Sector size (logical/physical): 512 bytes / 512 bytes
  20. I/O size (minimum/optimal): 512 bytes / 512 bytes
  21. Disklabel type: dos
  22. Disk identifier: 0x9c310964
  23. Device     Boot Start        End    Sectors   Size Id Type
  24. /dev/sda1        2048 1953525167 1953523120 931.5G 83 Linux
  25. Command (m for help): w
  26. The partition table has been altered.
  27. Syncing disks.
现在,我们将用 ext4 文件系统格式化新创建的分区 /dev/sda1
  1. pi@raspberrypi:~ $ sudo mkfs.ext4 /dev/sda1
  2. mke2fs 1.43.4 (31-Jan-2017)
  3. Discarding device blocks: done
  4. <...>
  5. Allocating group tables: done
  6. Writing inode tables: done
  7. Creating journal (1024 blocks): done
  8. Writing superblocks and filesystem accounting information: done
重复以上步骤后,让我们根据用途来对它们建立标签:
  1. pi@raspberrypi:~ $ sudo e2label /dev/sda1 data
  2. pi@raspberrypi:~ $ sudo e2label /dev/sdb1 backup
现在,让我们安装这些磁盘并存储一些数据。以我运营该系统超过一年的经验来看,当树莓派启动时(例如在断电后),USB 磁盘驱动器并不是总被挂载,因此我建议使用 autofs 在需要的时候进行挂载。
首先,安装 autofs 并创建挂载点:
  1. pi@raspberrypi:~ $ sudo apt install autofs
  2. pi@raspberrypi:~ $ sudo mkdir /nas
然后添加下面这行来挂载设备 /etc/auto.master
  1. /nas    /etc/auto.usb
如果不存在以下内容,则创建 /etc/auto.usb,然后重新启动 autofs 服务:
  1. data -fstype=ext4,rw :/dev/disk/by-label/data
  2. backup -fstype=ext4,rw :/dev/disk/by-label/backup
  3. pi@raspberrypi3:~ $ sudo service autofs restart
现在你应该可以分别访问 /nas/data 以及 /nas/backup 磁盘了。显然,到此还不会令人太兴奋,因为你只是擦除了磁盘中的数据。不过,你可以执行以下命令来确认设备是否已经挂载成功:
  1. pi@raspberrypi3:~ $ cd /nas/data
  2. pi@raspberrypi3:/nas/data $ cd /nas/backup
  3. pi@raspberrypi3:/nas/backup $ mount
  4. <...>
  5. /etc/auto.usb on /nas type autofs (rw,relatime,fd=6,pgrp=463,timeout=300,minproto=5,maxproto=5,indirect)
  6. <...>
  7. /dev/sda1 on /nas/data type ext4 (rw,relatime,data=ordered)
  8. /dev/sdb1 on /nas/backup type ext4 (rw,relatime,data=ordered)
首先进入对应目录以确保 autofs 能够挂载设备。autofs 会跟踪文件系统的访问记录,并随时挂载所需要的设备。然后 mount 命令会显示这两个 USB 磁盘驱动器已经挂载到我们想要的位置了。
设置 autofs 的过程容易出错,如果第一次尝试失败,请不要沮丧。你可以上网搜索有关教程。
挂载网络存储
现在你已经设置了基本的网络存储,我们希望将它安装到远程 Linux 机器上。这里使用 NFS 文件系统,首先在树莓派上安装 NFS 服务器:
  1. pi@raspberrypi:~ $ sudo apt install nfs-kernel-server
然后,需要告诉 NFS 服务器公开 /nas/data 目录,这是从树莓派外部可以访问的唯一设备(另一个用于备份)。编辑 /etc/exports 添加如下内容以允许所有可以访问 NAS 云盘的设备挂载存储:
  1. /nas/data *(rw,sync,no_subtree_check)
更多有关限制挂载到单个设备的详细信息,请参阅 man exports。经过上面的配置,任何人都可以访问数据,只要他们可以访问 NFS 所需的端口:111 和 2049。我通过上面的配置,只允许通过路由器防火墙访问到我的家庭网络的 22 和 443 端口。这样,只有在家庭网络中的设备才能访问 NFS 服务器。
如果要在 Linux 计算机挂载存储,运行以下命令:
  1. you@desktop:~ $ sudo mkdir /nas/data
  2. you@desktop:~ $ sudo mount -t nfs <raspberry-pi-hostname-or-ip>:/nas/data /nas/data
同样,我建议使用 autofs 来挂载该网络设备。如果需要其他帮助,请参看 如何使用 Autofs 来挂载 NFS 共享[6]
现在你可以在远程设备上通过 NFS 系统访问位于你树莓派 NAS 云盘上的数据了。在后面一篇文章中,我将介绍如何使用 rsync 自动将数据备份到第二个 USB 磁盘驱动器。你将会学到如何使用 rsync 创建增量备份,在进行日常备份的同时还能节省设备空间。

Comments

Popular posts from this blog

CKA Simulator Kubernetes 1.22

  https://killer.sh Pre Setup Once you've gained access to your terminal it might be wise to spend ~1 minute to setup your environment. You could set these: alias k = kubectl                         # will already be pre-configured export do = "--dry-run=client -o yaml"     # k get pod x $do export now = "--force --grace-period 0"   # k delete pod x $now Vim To make vim use 2 spaces for a tab edit ~/.vimrc to contain: set tabstop=2 set expandtab set shiftwidth=2 More setup suggestions are in the tips section .     Question 1 | Contexts Task weight: 1%   You have access to multiple clusters from your main terminal through kubectl contexts. Write all those context names into /opt/course/1/contexts . Next write a command to display the current context into /opt/course/1/context_default_kubectl.sh , the command should use kubectl . Finally write a second command doing the same thing into ...

OWASP Top 10 Threats and Mitigations Exam - Single Select

Last updated 4 Aug 11 Course Title: OWASP Top 10 Threats and Mitigation Exam Questions - Single Select 1) Which of the following consequences is most likely to occur due to an injection attack? Spoofing Cross-site request forgery Denial of service   Correct Insecure direct object references 2) Your application is created using a language that does not support a clear distinction between code and data. Which vulnerability is most likely to occur in your application? Injection   Correct Insecure direct object references Failure to restrict URL access Insufficient transport layer protection 3) Which of the following scenarios is most likely to cause an injection attack? Unvalidated input is embedded in an instruction stream.   Correct Unvalidated input can be distinguished from valid instructions. A Web application does not validate a client’s access to a resource. A Web action performs an operation on behalf of the user without checkin...