raspberry pi

建立家庭实验室是一种有趣的娱乐方式,同时可以学习新概念并尝试新技术。 由于以Raspberry Pi为首的单板计算机(SBC)的普及,从家中舒适地建立多计算机实验室比以往任何时候都更加容易。 与试图与一家主要的云提供商复制相同的设置相比,创建“在家中的私有云”也是一种以低得多的钱获得云原生技术的好方法。

本文介绍了如何修改Raspberry Pi或其他SBC的磁盘映像,如何为SSH(安全外壳)预先配置主机,以及禁用在首次启动时强制进行交互以进行配置的服务。 这是使设备“启动并运行”的好方法,类似于云实例。 以后,您可以使用自动过程通过SSH连接进行更专业,更深入的配置。

另外,当您向实验室添加更多的Pi时,修改磁盘映像使您只需将映像写入SD卡,然后将其放入Pi中就可以了!

解压缩并挂载映像

对于此项目,您需要修改服务器磁盘映像。 我在测试期间使用了Fedora Server 31 ARM映像。 下载磁盘映像并验证其校验和之后 ,需要解压缩并将其安装到主机计算机文件系统上的某个位置,以便可以根据需要对其进行修改。

您可以使用xz命令通过--decompress参数来解压缩Fedora服务器映像:

 xz --decompress Fedora-Server-armhfp-X-y.z-sda.raw.xz 

这为您提供了一个原始的,已解压缩的磁盘映像(它将自动替换.xz压缩文件)。 原始磁盘映像听起来就是这样:一个包含所有在格式化和安装的磁盘上的数据的文件。 这包括分区信息,引导分区,根分区和任何其他分区。 您需要挂载要使用的分区,但要这样做,您需要有关该分区在磁盘映像中的起始位置以及磁盘上扇区大小的信息,以便可以在正确的扇区挂载文件。

幸运的是,您可以像在实际磁盘上一样容易地在磁盘映像上使用fdisk命令,并使用--list-l参数查看分区列表及其信息:

# Use fdisk to list the partitions in the raw image:
$ fdisk -l Fedora-Server-armhfp- 31 - 1.9 -sda.raw
Disk Fedora-Server-armhfp-X-y.z-sda.raw: 3.2 GiB, 3242196992 bytes, 6332416 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: 0xdaad9f57

Device                               Boot   Start     End Sectors  Size Id Type
Fedora-Server-armhfp-X-y.z-sda.raw1         8192  163839  155648   76M  c W95 F
Fedora-Server-armhfp-X-y.z-sda.raw2 *     163840 1163263  999424  488M 83 Linux
Fedora-Server-armhfp-X-y.z-sda.raw3      1163264 6047743 4884480  2.3G 83 Linux


您需要的所有信息都可以在此输出中获得。 第3行表示逻辑和物理扇区大小:(512字节/ 512字节)。

设备列表显示原始磁盘映像中的分区。 第一个Fedora-Server-armhfp-Xy.z-sda.raw1无疑是引导加载程序分区,因为它是第一个小文件(仅76MB),类型为W95 FAT32(LBA),由ID“ c”标识。 ”,用于启动SD卡的FAT32分区。

第二个分区也不是很大,只有488MB。 该分区是Linux本机类型的分区(Id 83),它可能是包含内核和initramfs的Linux引导分区。

第三个分区是您可能想要的分区:它是2.3GB,因此应该具有大部分的发行版,并且它是Linux本地分区类型,这是预期的。 这应该包含您要修改的分区和数据。

第三个分区从扇区1163264开始(由fdisk输出中的“开始”列指示),因此您的安装偏移为595591168 ,是通过将扇区大小(512)乘以起始扇区(1163264)(即512 * 1163264 )。 这意味着您需要以595591168的偏移量挂载文件,以使其在挂载点的正确位置。

有了此信息,武装(请参阅我在那儿做了什么?),现在可以将第三个分区安装到homedir中的目录中:

$ mkdir ~ / mnt
$ sudo mount -o loop, offset = 595591168 Fedora-Server-armhfp-X-y.z-sda.raw ~ / mnt
$ ls ~ / mnt

直接在磁盘映像中工作

将磁盘映像解压缩并安装到主机上的某个位置后,就可以开始修改映像以满足您的需要了。 我认为,更改映像的最简单方法是使用chroot将会话的工作根更改为已安装映像的工作根。 不过有一点棘手。

当您更改root用户时,您的会话将使用新root用户中的二进制文件。 除非您从ARM系统执行所有这些操作,否则解压缩的磁盘映像的体系结构将与所使用的主机系统不同。 即使在chroot内部,主机系统也将无法使用具有不同体系结构的二进制文件。 至少不是本地的。

幸运的是,有一个解决方案: qemu-user-static 。 从Debian Wiki :

“ [qemu-user-static]提供了静态构建的用户模式仿真二进制文件。在这种模式下,QEMU可以在另一个CPU上启动为一个CPU编译的Linux进程…如果安装了binfmt-support软件包,则qemu-user-static软件包将注册。所提供的仿真器可以处理的二进制格式,这样就可以直接运行外部二进制文件。”

这正是在chroot内部非本机体系结构中工作所需的内容。 如果主机系统是Fedora,请安装带有DNF的qemu-user-static软件包,然后重新启动systemd-binfmt.service

# Enable non-native arch chroot with DNF, adding new binary format information
# Output suppressed for brevity
$ dnf install qemu-user-static
$ systemctl restart systemd-binfmt.service

这样,您应该能够将root更改为已挂载的磁盘映像,并运行uname命令以验证一切正常:

sudo chroot ~ / mnt / / usr / bin / uname -a -r
Linux marvin 5.5.16- 200 .fc31.x86_64 #1 SMP Wed Apr 8 16:43:33 UTC 2020 armv7l armv7l armv7l GNU/Linux

从更改后的根内部运行uname 在输出中显示armv7l (原始磁盘映像的体系结构),而不显示主机。 一切都按预期工作,您可以继续修改图像。

修改磁盘映像

为了使它的行为更像云环境并实现家中私有云的梦想,请添加本地用户,向该用户授予sudo权限,并且(就像云重量级人物一样)允许该用户使用sudo而无需密码。

因此,您的待办事项清单是:

  • 安装并启用SSHD(Fedora ARM映像中已经安装并启用了SSHD,但是您可能需要手动执行此操作以进行分发)
  • 设置本地用户
  • 允许本地用户使用sudo(无密码,可选)
  • 添加授权密钥
  • 允许root使用授权密钥进行SSH(可选)

我使用GitHub功能,该功能允许您上传公共SSH密钥,并通过https://github.com/<your_github_username>.keys使它们可用。 我发现这是分发公钥的一种便捷方法,尽管我很偏执,总是检查下载的密钥是否符合我的期望。 如果不想使用此方法,则可以直接从主机将公用密钥复制到chroot中 ,也可以将密钥托管在您控制的Web服务器上以使用相同的工作流程。

要开始修改磁盘映像,请再次将chroot更改为已挂载的磁盘映像,这一次启动外壳程序,以便可以运行多个命令:

# Output of these commands (if any) are omitted for brevity
$ sudo chroot ~ / mnt / bin / bash

# Install openssh-server and enable it (already done on Fedora)
$ dnf install -y openssh-server
$ systemctl enable sshd.service

# Allow root to SSH with your authorized keys
$ mkdir / root / .ssh

# Download, or otherwise add to the authorized_keys file, your public keys
# Replace the URL with the path to your own public keys
$ curl https: // github.com / clcollins.keys -o / root / .ssh / authorized_keys
$ chmod 700 / root / .ssh
$ chmod 600 / root / .ssh / authorized_keys

# Add a local user, and put them in the wheel group
# Change the group and user to whatever you desire
groupadd chris
useradd -g chris -G wheel -m -u 1000 chris

# Download or add your authorized keys
# Change the homedir and URL as you've done above
mkdir / home / chris / .ssh
curl https: // github.com / clcollins.keys -o / home / chris / .ssh / authorized_keys
chmod 700 / home / chris / .ssh
chmod 600 / home / chris / .ssh / authorized_keys
chown -R chris.chris / home / chris / .ssh /

# Allow the wheel group (with your local user) to use suso without a password
echo "%wheel ALL=(ALL) NOPASSWD:ALL" >> / etc / sudoers.d / 91 -wheel-nopasswd


这是在首次启动时将SSH设置到Raspberry Pi或其他单板计算机中通常需要完成的所有操作。 但是,每个发行版都有其自己的怪癖。 例如,Rasbian已经包括本地用户pi ,并且不使用wheel组。 因此,对于Raspbian,最好使用现有用户或删除pi用户并将其替换为其他用户。

对于Fedora ARM,该映像会提示您在首次引导时完成设置。 这违背了您进行上述更改的目的,尤其是因为它完全阻止了启动,直到完成安装为止。 您的目标是使Raspberry Pi像私有云基础结构一样起作用,并且该工作流程包括启动时通过SSH远程设置主机。 禁用由服务initial-setup.service控制的初始设置:

# Disable the initial-setup.service for both the multi-user and graphical targets
unlink / etc / systemd / system / multi-user.target.wants / initial-setup.service
unlink / etc / systemd / system / graphical.target.wants / initial-setup.service

在更改根目录中时,您可以对系统进行其他任何更改,也可以仅保留这些更改,并在首次启动后通过SSH遵循云原生的配置工作流程。

重新压缩并安装修改后的映像

完成对系统的这些更改后,剩下的就是重新压缩磁盘映像并将其安装在Raspberry Pi的SD卡上。

确保退出chroot,然后卸载磁盘映像:

 $  sudo umount ~ / mnt / 

就像最初解压缩图像一样,您可以再次使用xz命令来压缩图像。 通过使用--keep参数, xz将保留原始图像,而不是对其进行清理。 尽管这会占用更多的磁盘空间,但保留未压缩的映像使您可以对正在使用的映像进行增量更改,而无需每次都对它们进行解压缩。 这非常适合节省时间,同时可以根据您的喜好测试和调整图像:

# Compress the raw disk image to a .xz file, but keep the raw disk image
xz --compress Fedora-Server-armhfp- 31 - 1.9 -sda.raw --keep

压缩需要一段时间,因此请花点时间站起来,伸展并让您的血液再次流动。

压缩完成后,可以将修改后的新磁盘映像复制到SD卡以与Raspberry Pi一起使用。 将图像复制到SD卡的标准dd方法效果很好,但是我喜欢使用Fedora的arm-image-installer,因为它提供了在处理未编辑图像时使用的选项。 它也适用于编辑的图像,并且比dd命令更加用户友好。

确保检查SD卡在哪个磁盘上,并将其用于--media参数:

# Use arm-image-installer to copy the modified disk image to the SD card
arm-image-installer --image =Fedora-Server-armhfp-X-y.z-sda.raw.xz --target =rpi3 --media = / dev / sdc --norootpass --resizefs -y

现在,您已经为树莓派或其他单板计算机准备了一个经过修改的新Fedora Server ARM映像,可以启动并通过修改立即通过SSH进入。 也可以使用此方法进行其他更改,如果您喜欢Fedora,可以将其与其他发行版的原始磁盘映像一起使用。 这是开始构建家庭私有云homelab的良好基础。 在以后的文章中,我将指导您使用云技术和自动化来建立homelab。

进一步阅读

本文研究了很多研究方法。 下面列出了我发现的两个最有用的资源,它们是学习如何自定义磁盘映像和使用非本机体系结构的。 他们对于从“我不知道我在做什么”到“确定,我可以做到!”的转变非常有帮助。

  • 如何修改自定义Linux发行版的原始磁盘映像
  • 使用DNF Wiki

翻译自: https://opensource.com/article/20/5/disk-image-raspberry-pi

raspberry pi

raspberry pi_修改磁盘映像以创建基于Raspberry Pi的homelab相关推荐

  1. raspberry pi_我如何从Mac Mini迁移到Raspberry Pi

    raspberry pi 不久前,我决定将计算环境从Mac Mini PowerPC迁移到Raspberry Pi Model2.本文介绍了这样做的原因以及如何做到这一点. 尽管它在某些地方是非常技术 ...

  2. raspberry pi_课堂上有5个出色的Raspberry Pi项目

    raspberry pi 1. Minecraft Pi 由Raspberry Pi基金会提供. CC BY-SA 4.0 . <我的世界>是世界上几乎每个青少年都喜欢的游戏,它是迄今为止 ...

  3. 如何将Mac磁盘映像转换为其他格式?

    磁盘映像用于数据备份,指将数据复制到不同的装置或数据格式.其中DMG格式为Mac OS X的磁盘映像文件格式,多用于打包软件.网络分发以及备份磁盘.Mac磁盘映像如何转换成其他格式? 例如,您创建了一 ...

  4. sd linux系统克隆,如何使用dd轻松克隆和还原Linux磁盘映像 | MOS86

    当需要在Linux上擦除,备份或还原数据时,可以选择许多应用程序. GParted是目前最成熟的选项之一. 磁盘是一种更现代的替代方案,在GNOME桌面环境中看起来很棒. 但是,无论您运行哪种Linu ...

  5. 创建可启动 WinPE 介质|使用 DISM 修改 Windows 映像

    创建可启动 WinPE 介质 使用 DISM 修改 Windows 映像 # 使用 DISM 装载映像 DISM /Mount-image /imagefile:<path_to_Image_f ...

  6. fog volume_使用FOG创建磁盘映像

    fog volume 在IT领域,保持机器间一致的体验至关重要. 映像,也称为磁盘克隆,是将一个硬盘驱动器中的内容复制到另一个硬盘上的过程. IT专业人员使用所需的设置,调整和软件安装来创建通常称为& ...

  7. 打开虚拟机磁盘类型无效_[图文]VMWARE虚拟机如何打开.VMDK格式的磁盘映像

    最近在折腾安卓虚拟机时使用Android x86项目组提供的镜像,架构问题本身无法直接在电脑安装安卓系统. 而Android x86项目则是国外团队通过源代码进行移植的版本,虽然不能同步更新但现在也倒 ...

  8. linux0.11磁盘映像制作及其剩余程序阅读注释笔记

    [ 1] linux0.11引导程序阅读注释. [ 2] linux0.11由实模式进入保护模式程序阅读注释 . [ 3] linux0.11护模式初始化程序阅读注释. [ 4] linux0.11主 ...

  9. 2.Linux磁盘,文件系统管理--创建文件系统

    第一篇:创建文件系统(格式化) ============================================================================ 概述: === ...

最新文章

  1. auve子表单中只读不好用
  2. 三插头内部结构图_10寸三防加固平板电脑 条码数据采集器 工业级耐摔防爆 高清屏幕带网口串口 支持航空插头...
  3. java、前端、php、asp.net开发资源分享(视频教程,源码,项目)
  4. 【JVM】第二章 JVM类加载、JVM对象
  5. 论文赏析[ACL18]基于RNN和动态规划的线性时间成分句法分析
  6. 434.字符串中的单词数
  7. python 移动平均线_使用python计算简单移动平均线
  8. [虚树模板] 洛谷P2495 消耗战
  9. android中base64编码解码,Andorid自带的Base64编解码表
  10. 用python进行因式分解_Python实现的质因式分解算法示例
  11. 图解QQ空间日志爬虫的全部日志获取与日志实际地址分析.
  12. python兔子繁殖问题循环_for循环——兔子繁殖问题
  13. 双十一来了,给自己的应用做个icon换脸小功能
  14. java去除中文括号小括号,或者英文括号
  15. P-touch Editor 批量打印标签
  16. 三维几何学基础(向量、点乘、叉乘、反对称矩阵)
  17. 去掉系统启动时提示输入用户名及密码 ,Windows XP自动登录设置方法(转)
  18. characterReplacement-替换后的的最长重复字符
  19. 开源协议(Open Source License)
  20. 爬虫,爬虫,爬爬爬爬爬爬爬爬

热门文章

  1. Redis集群之主从复制
  2. 浅谈分布式一致性协议之2PC
  3. springboot使用redis做session会话管理
  4. Redis设计与实现阅读总结(一)数据结构和对象
  5. 超级详细的手写webpack4配置来启动vue2项目(附配置作用)
  6. golang生成c-shared so供c语言或者golang调用到例子
  7. HttpsURLConnection 利用keepAlive特性进行优化一例
  8. 转 Phpstorm调试详解(包含命令行以及浏览器)
  9. (01)odoo模型中调用窗体动作
  10. 使用delphi 开发多层应用(十六)使用XMLRPC 实现basic4android 远程调用RTC服务