raspberry pi
建立家庭实验室是一种有趣的娱乐方式,同时可以学习新概念并尝试新技术。 由于以Raspberry Pi为首的单板计算机(SBC)的普及,从家中舒适地建立多计算机实验室比以往任何时候都更加容易。 与试图与一家主要的云提供商复制相同的设置相比,创建“在家中的私有云”也是一种以低得多的钱获得云原生技术的好方法。
本文介绍了如何修改Raspberry Pi或其他SBC的磁盘映像,如何为SSH(安全外壳)预先配置主机,以及禁用在首次启动时强制进行交互以进行配置的服务。 这是使设备“启动并运行”的好方法,类似于云实例。 以后,您可以使用自动过程通过SSH连接进行更专业,更深入的配置。
另外,当您向实验室添加更多的Pi时,修改磁盘映像使您只需将映像写入SD卡,然后将其放入Pi中就可以了!
![多台Raspberry Pi计算机,一台交换机和一个移动电源 Multiple Raspberry Pi computers, a switch, and a power bank](https://i-blog.csdnimg.cn/blog_migrate/2eb4ccbf915ce19c6521b4786f188f90.jpeg)
解压缩并挂载映像
对于此项目,您需要修改服务器磁盘映像。 我在测试期间使用了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。
进一步阅读
本文研究了很多研究方法。 下面列出了我发现的两个最有用的资源,它们是学习如何自定义磁盘映像和使用非本机体系结构的。 他们对于从“我不知道我在做什么”到“确定,我可以做到!”的转变非常有帮助。
翻译自: https://opensource.com/article/20/5/disk-image-raspberry-pi
raspberry pi