从头开始用树莓派做一个NAS【最新超详细教程】

news2024/11/25 13:26:01

一、概述

众所周知在办公的时候两台电脑之间经常倒数据资料非常麻烦,而NAS可以很好的解决这个问题。树莓派搭建NAS方法有很多,我们之前也拍过直接用Samba、FTP这些来实现NAS功能,但是这些需要你会在命令行进行配置,而且对于新手用起来并不直观方便对于一个NAS系统来说功能也不全,故我们这次用开源的OMV来搭建NAS系统!

目前网上普遍的OMV搭建NAS的教程都比较老了,照着做会出现各种问题,而我们本期教程是在最新树莓派官方系统上做的,大家照着做完全不会有问题,本期的精简视频教程在B站-杨坤树莓派爱好者基地中可以看到,VLOG全程记录视频可以在B站-玩派VLOG看到,欢迎大家三连~

视频教程地址:
哔哩哔哩bilibili:树莓派爱好者基地

视频VLOG记录:
哔哩哔哩bilibili:玩派VLOG

二、教程内容

1、树莓派安装系统

这里我们用到的是最新的树莓派官方精简版系统(不能使用带桌面的版本!)
在这里插入图片描述
记得点这个设置,在里面需要开启SSH、设置pi账户的密码、配置WIFI的账号和密码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、固定静态IP

打开路由器后台查看树莓派IP地址
在这里插入图片描述
在ssh软件中输入下面命令,配置DHCP文件

sudo nano /etc/dhcpcd.conf

文件中这个位置按照你自己的情况进行修改
在这里插入图片描述
然后重启树莓派

 sudo reboot

3、换源

 sudo nano /etc/apt/sources.list

把原来的注视掉,把下面的复制进去

deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ bullseye main non-free contrib rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ bullseye main non-free contrib rpi

在这里插入图片描述
继续

sudo nano /etc/apt/sources.list.d/raspi.list

把原来的注视掉,把下面的复制进去

deb https://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bullseye main ui

在这里插入图片描述
然后记得更新一下

sudo apt-get update

sudo apt-get upgrade

4、安装OMV

wget  https://cdn.jsdelivr.net/gh/OpenMediaVault-Plugin-Developers/installScript@master/install

chmod +x install

sudo ./install -n

5、配置OMV

浏览器输入树莓派IP地址就可以进入NAS系统了。

用户名默认为admin,密码为openmediavault

首先在系统设置-工作台里面设置一下登出时间,之前的太短了
在这里插入图片描述
把硬盘插在树莓派上,然后快速擦除磁盘
在这里插入图片描述
创建文件系统
在这里插入图片描述
挂载
在这里插入图片描述
在这里插入图片描述
创建共享文件夹
在这里插入图片描述
在这里插入图片描述
配置SMB服务
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
配置一下一般登陆的用户pi
在这里插入图片描述
在这里插入图片描述

6、开始使用

WINDOWS上直接添加一个映射
在这里插入图片描述
然后就能用了
在这里插入图片描述
MAC上打开点前往,然后连接服务器就好了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7、给NAS安个小显示屏

启动树莓派的I2C功能

sudo apt-get install -y python3-smbus
sudo apt-get install -y i2c-tools
sudo raspi-config

按照下面的步骤设置开启i2c功能
在这里插入图片描述
重启树莓派

sudo reboot

安装Adafruit-SSD1306库
Adafruit-SSD1306库是基于Python的OLED库,可以用于128*64,128*32像素SSD1306芯片控制的屏幕

sudo apt-get remove  python3-pip
sudo apt-get install  python3-pip
sudo python3 -m pip install --upgrade pip setuptools wheel

安装PIL库,有一些图片处理的程序会用到这个。

sudo apt-get install python3-pil

使用pip安装Adafruit-SSD1306库

sudo pip install Adafruit-SSD1306

再下载一份包含代码示例的库后面用

cd  ~
sudo apt install git
git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git
cd ~/Adafruit_Python_SSD1306/examples/

对于屏幕的接线,一定不要接错,树莓派引脚(所有树莓派40针引脚都是这样排列,不需要因为不同版本而改动)如下图所示:
在这里插入图片描述
根据屏幕 PCB 上引脚的功能标注接到树莓派上对应的 GPIO 上即可。

屏幕 GND 接树莓派 GND
屏幕 VCC 接树莓派 3V3
屏幕 SDA 接树莓派 SDA
屏幕 SCL 接树莓派 SCL

注意一定不要接反 VCC 和 GND,否则会烧坏屏幕!!!
接上之后通过命令检测是否识别到i2c设备

sudo i2cdetect -y 1

修改一下程序

cd ~
sudo cp ~/Adafruit_Python_SSD1306/examples/stats.py ~/
sudo nano stats.py

把文件里面的内容全替换成下面的内容

import time

import Adafruit_GPIO.SPI as SPI
import Adafruit_SSD1306

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

import subprocess

# Raspberry Pi pin configuration:
RST = None     # on the PiOLED this pin isnt used
# Note the following are only used with SPI:
DC = 23
SPI_PORT = 0
SPI_DEVICE = 0

# Beaglebone Black pin configuration:
# RST = 'P9_12'
# Note the following are only used with SPI:
# DC = 'P9_15'
# SPI_PORT = 1
# SPI_DEVICE = 0

# 128x32 display with hardware I2C:
#disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST)

# 128x64 display with hardware I2C:
disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)

# Note you can change the I2C address by passing an i2c_address parameter like:
disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, i2c_address=0x3C)

# Alternatively you can specify an explicit I2C bus number, for example
# with the 128x32 display you would use:
# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, i2c_bus=2)

# 128x32 display with hardware SPI:
# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=8000000))
# 128x64 display with hardware SPI:
# disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=8000000))

# Alternatively you can specify a software SPI implementation by providing
# digital GPIO pin numbers for all the required display pins.  For example
# on a Raspberry Pi with the 128x32 display you might use:
# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, dc=DC, sclk=18, din=25, cs=22)

# Initialize library.
disp.begin()

# Clear display.
disp.clear()
disp.display()

# Create blank image for drawing.
# Make sure to create image with mode '1' for 1-bit color.
width = disp.width
height = disp.height
image = Image.new('1', (width, height))

# Get drawing object to draw on image.
draw = ImageDraw.Draw(image)

# Draw a black filled box to clear the image.
draw.rectangle((0,0,width,height), outline=0, fill=0)
# Draw some shapes.
# First define some constants to allow easy resizing of shapes.
padding = -2
top = padding
bottom = height-padding
# Move left to right keeping track of the current x position for drawing shapes.
x = 0


# Load default font.
font = ImageFont.load_default()

# Alternatively load a TTF font.  Make sure the .ttf font file is in the same directory as the python script!
# Some other nice fonts to try: http://www.dafont.com/bitmap.php
# font = ImageFont.truetype('Minecraftia.ttf', 8)
def get_cpu_temp():
        tempfile=open("/sys/class/thermal/thermal_zone0/temp")
        cpu_temp=tempfile.read()
        tempfile.close()
        return float(cpu_temp)/1000
while True:

    # Draw a black filled box to clear the image.
    draw.rectangle((0,0,width,height), outline=0, fill=0)

    # Shell scripts for system monitoring from here : https://unix.stackexchange.com/questions/119126/command-to-display-memory-usage-disk-usage-and-cpu-load
    cmd = "hostname -I | cut -d' ' -f1"
    IP = subprocess.check_output(cmd, shell = True ).decode("utf-8")
    cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'"
    CPU = subprocess.check_output(cmd, shell = True ).decode("utf-8")
    cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%sMB %.2f%% \", $3,$2,$3*100/$2 }'"
    MemUsage = subprocess.check_output(cmd, shell = True ).decode("utf-8")
    cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'"
    Disk = subprocess.check_output(cmd, shell = True ).decode("utf-8")

    # Write two lines of text.

    draw.text((x, top),       "IP: " + str(IP),  font=font, fill=255)
    draw.text((x, top+8),     str(CPU), font=font, fill=255)
    draw.text((x, top+16),    str(MemUsage),  font=font, fill=255)
    draw.text((x, top+25),    str(Disk),  font=font, fill=255)
    draw.text((x, top+35),    "Temp: "+str(get_cpu_temp()), font=font, fill=255)

    # Display image.
    disp.image(image)
    disp.display()
    time.sleep(.1)

为了让stats.py能够开机自动运行,我们可以做下面的配置,这样我们就可以不用通过工具或路由器去查找树莓派的IP地址等信息!!!
修改/etc/rc.local文件

sudo nano /etc/rc.local

在exit 0前面增加一行:

sudo python /home/pi/stats.py &

三、看看效果

sudo python stats.py

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/114437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】Linux权限管理

目录一.Linux用户权限1.权限的概念2.用户分类3.切换用户4.sudo提权二.Linux文件权限1.文件属性2.文件类型3.文件角色划分4.基本权限三.文件访问权限的相关设置方法1.chmod2.chown3.charp4.file5.权限拒绝四.默认权限umask五.目录的权限六.粘滞位1.背景2.准备3.情况4.粘滞位一.L…

初识Docker:(1)什么是docker

初识Docker:(1)什么是docker项目部署的问题Docker总结项目部署的问题 大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题: 依赖关系复杂,容易出现兼容性问题开发、测试、生产环境有差…

git revert以及revert的恢复

一:背景与方案 在工作中遇见的这样的场景: 场景一: 已经merge到待发布的版本分支中的功能需要移除当前的分支,改在后续版本发布,示意图如下,展示的是commit序列, 这里想要移除的功能是commi…

[python库] base64库的基本使用

1. base64是什么 base64是一种二进制到文本格式的编码方式。具体来说就是将byte数组编码为字符串的方法,而编码出来的字符串只包含ASCII基础字符。 虽然说base64是一种编码方式,但是它并不推荐作为常规的加密算法使用,因为该算法的加解密算法…

Android开发进阶——binder通讯学习

什么是binder 通常意义下,binder指的是一种通信机制对Server端来说,Binder指的是Binder本地对象,对于Client端来说,Binder指的是Binder代理对象对于传输过程而言,binder是可以跨进程传输的对象 Binder的基本原理 Bi…

【工作流Activiti7】7、Activiti7+SpringBoot

1. 版本问题 1.1. Activiti版本 7.1.0-M6是最后一个支持JDK1.8的版本,此后的版本都要求JDK11以上 目前,Activiti最新版本是7.6.0,它是用JDK11编译的,因此要想使用最新版7.6.0必须升级JDK版本,不能再用1.8 同时&…

【数组中数字出现的次数-有限状态自动机】

数组中数字出现的次数一,有限状态自动机解法二,一般解法想必大家对数组中数字出现的次数的这种题并不少见, 主要有三种: 1,找出数组中只出现一次的数字(其他数字出现两次) 2,找出数组…

渗透测试指操作系统漏洞发现与防御概述

今天继续给大家介绍渗透测试相关知识,本文主要内容是渗透测试指操作系统漏洞发现与防御概述。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调&#x…

Android四大组件之Service

文章目录Android四大组件之默默劳动的Service什么是ServiceAndroid多线程编程线程的基本用法在子线程中更新UI解析异步消息处理机制MessageHandlerMessageQueueLooper异步消息的整个流程使用AsyncTaskService的基本用法定义一个Service启动和停止ServiceActivity和Service进行通…

【4】axi协议学习

1、axi背景介绍: Advanced extensible Interface(AXI)是为了满足高性能系统设计而定义的一套独立通道协议,首次是在2003年发布的AMBA3标准中出现,经历AMBA4,目前已经到达AMBA5版本。 2、axi 特性: AXI满足如下的特性: 适合于高带宽,低延迟的设计 不需要通过复杂的桥…

去耦电容和旁路的概念说明与应用说明

回想当初第一眼看觉得,这啥玩意自己又菜了! 电容:本质就是充放电,实际应该我们围着这个来转 一、解释 旁路电容从英文角度看,就是抄小路的意思,意思当有一个干扰来临时候,可以通过这个电容抄…

LeetCode 1739. 放置盒子:数学 思维

【LetMeFly】1739.放置盒子 力扣题目链接:https://leetcode.cn/problems/building-boxes/ 有一个立方体房间,其长度、宽度和高度都等于 n 个单位。请你在房间里放置 n 个盒子,每个盒子都是一个单位边长的立方体。放置规则如下: …

世界杯竞猜项目Dapp-第五章(合约升级)

目前主流有三种合约升级方法 transparent 方式;(通用,业务逻辑和代理逻辑解耦合,比较贵)uups 方式;(代理逻辑集成到了业务逻辑,通过继承来实现,便宜)beacon 方式&#x…

408 考研《操作系统》第三章第二节:基本分页存储管理、两级页表、基本分段存储管理方式、段页式管理方式

文章目录教程1. 基本分页存储管理的基本概念1.1 连续分配方式的缺点1.2 把“固定分区分配”改造为“非连续分配版本”1.3 什么是分页存储1.4 如何实现地址的转换?1.5 逻辑地址结构1.6 重要的数据结构——页表1.7 知识回顾与重要考点2. 基本地址变换机构2.1 例题2.2 …

node.js+uni计算机毕设项目购物小程序(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等…

不写一行代码(一):实现安卓基于GPIO的LED设备驱动

文章目录系列文章一、前言二、准备工作2.1 内核版本2.2 内核文档:bindings->leds2.3 文档解析: leds-gpio.txt三、编写DTS3.1 查原理图,挑选GPIO3.2 编写DTS文件四、编译测试4.1 编译dt.img4.2 烧录dt.img五、基于fs的测试5.1 测试命令5.2…

第二十五章 数论——约数

第二十五章 数论——约数一、什么是约数二、约数的求解——试除法1、问题2、思路分析3、代码实现三、约数个数1、问题描述2、算法思路3、代码实现四、约数之和1、问题描述2、算法思路3、代码实现五、最大公约数——欧几里德算法1、问题描述2、算法思路(1&#xff09…

前端实现文件上传(点击+拖拽)

一、简介 之前在Vue项目中使用过element的上传组件,实现了点击上传拖拽上传的两种上传功能。然后我就在想是否可以通过原生的htmljs来实现文件的点击上传和拖拽上传,说干就干。 首先是点击获取上传文件自然没的说,只需要借助input标签即可&a…

Java面试题(六)RabbitMQ常见面试题

RabbitMQ常见面试题RabbitMQ架构设计RabbitMQ有哪些优点RabbitMQ事物机制RabbitMQ持久化机制持久化和非持久化什么时候需要持久化?落盘过程文件删除RabbitMQ如何保证消息不丢失RabbitMQ如何保证消息不被重复消费RabbitMQ死信队列,延时队列死信队列延时队…

如何使用 ChatGPT 进行教学,教师可以利用 ChatGPT 的 5 种方式

我们听说过很多关于学生如何使用 ChatGPT 撰写论文和布置家庭作业的信息。 我们一直在讨论围绕这个问题的担忧,并争先恐后地为 ChatGPT 寻找 AI 检测工具,据传 OpenAI 也在致力于此。 但是关于教师如何将 ChatGPT 用于他们自己的工作的讨论并不多。 在从教师的角度对 Chat…