远程登录
- 远程登录是指通过网络在本地计算机(客户端)上操作远程计算机(服务器端)。
- 在 Linux 系统中,常用的远程登录工具包括 Telnet 和 SSH。下面是使用 Telnet 进行远程登录的配置方法。请注意:Telnet 由于传输内容不加密,安全性较低,在实际应用中通常使用 SSH 替代。这里只演示如何配置和使用 Telnet。
- 具体步骤
- 服务器端配置(开发板)
- 服务器端是指嵌入式开发板,它运行 Telnet 服务器(telnetd),以允许客户端通过 Telnet 进行远程登录。我们通过修改启动脚本来让开发板启动时自动运行 Telnet 服务。
- 步骤 1:在 /etc/init.d/rcS 中启动 Telnet
vi /etc/init.d/rcS //在该脚本中添加启动 Telnet 服务的命令。在脚本的末尾添加以下内容以启动 telnetd telnetd & 保存并退出编辑器。
- 步骤2:配置登录账户 - 为了允许通过 Telnet 登录,必须确保系统中存在可以使用的用户。通常,我们会使用 root 用户进行登录,并设置空密码。
vi /etc/passwd //打开 /etc/passwd 文件 确保文件中有以下内容,表示用户 root 可以登录,密码为空 root::0:0:root:/:/bin/sh 保存并退出编辑器。
- 客户端配置(虚拟机或本地计算机)
- 客户端可以是虚拟机、个人电脑或者其他可以通过网络连接的设备。确保客户端和服务器端在同一个网络中,并且可以互相通信。
- 步骤 1:使用 Telnet 连接服务器
在客户端设备(如虚拟机)上打开终端。
使用以下命令通过 Telnet 连接到开发板的 IP 地址(例如:192.168.2.245)
telnet 192.168.2.245
- 服务器端配置(开发板)
如果 Telnet 连接成功,系统会提示你输入用户名。输入 root 并按回车
login: root
因为我们在 /etc/passwd 中设置了空密码,直接按回车登录。
登录成功后,你现在可以在远程开发板上执行命令,就像在本地终端中一样。
- 步骤 2:退出 Telnet 会话
- 当你完成远程操作后,可以通过输入 exit 命令来退出 Telnet 会话
exit
使用 SSH 替代 Telnet
由于 Telnet 的通信是明文传输,存在较大的安全风险,因此在生产环境中通常使用 SSH(Secure Shell)替代 Telnet。SSH 提供了更高的安全性,支持加密通信,并且可以使用密钥认证等安全机制。
- 安装 SSH 服务器(以 OpenSSH 为例)
在开发板上运行以下命令安装 openssh 服务器
sudo apt-get install openssh-server
- 启动 SSH 服务器:
启动 SSH 服务并设置为开机自动启动:
sudo systemctl start ssh
sudo systemctl enable ssh
- 客户端使用 SSH 连接:
在客户端设备上,使用以下命令通过 SSH 连接到开发板:
ssh root@192.168.2.245
这样就可以使用加密的方式安全地进行远程登录。
文件系统格式
- 文件系统是操作系统用来管理存储设备(如硬盘、U盘等)上文件和目录的一种机制。在对磁盘进行格式化时,会安装文件系统软件,将物理地址转换为用户可见的文件和目录结构,方便用户使用。
文件系统的作用
每个存储设备(磁盘、分区)都需要安装一个文件系统,以便操作系统能够识别和管理其中的数据。
- 存储和管理文件的元数据:文件名、大小、权限等信息。
- 管理磁盘上的物理空间:确保文件存储在磁盘的正确位置并高效利用存储空间。
常见文件系统类型
如表格所示
平台 | 文件系统类型 | 特点 |
---|---|---|
Windows | FAT16 | 早期文件系统,支持较小的分区和文件(最大文件大小 2GB)。 |
FAT32 | 更常用的 FAT 文件系统,文件大小上限为 4GB。 | |
NTFS | 支持大文件、文件压缩、加密等高级功能,是 Windows 的主流文件系统。 | |
ReFS | 适用于服务器,提供更高的数据完整性和可靠性。 | |
Linux | EXT2 | 不支持日志功能,简单高效,适合小型嵌入式系统。 |
EXT3 | 支持日志功能,能有效避免系统崩溃后的数据丢失。 | |
EXT4 | 更先进的文件系统,支持更大文件和分区,性能高。 | |
嵌入式 | Ramdisk | 内存中的文件系统,访问速度快,断电丢失数据。 |
YAFFS2 | 适合 NAND 闪存,体积小、性能高,适合嵌入式设备。 | |
JFFS2 | 日志文件系统,适用于闪存设备,支持数据压缩和磨损均衡。 |
制作RAMDisk 文件系统
- RAMDisk 文件系统是将文件系统加载到内存中,具有访问速度快但数据易丢失的特点。以下是详细的制作 RAMDisk 文件系统的步骤,并在 NFS 测试通过后可以开始制作。
- 制作 8M 大小的镜像文件
在用户主目录下创建一个大小为 8MB 的镜像文件,作为 RAMDisk 文件系统的基础:
$ cd ~
$ dd if=/dev/zero of=ramdisk bs=1k count=8192 # 创建一个大小为8MB的空文件
//if=/dev/zero:输入文件是 /dev/zero,即空数据。
//of=ramdisk:输出文件是 ramdisk,即我们创建的镜像文件。
//bs=1k:表示每次读取和写入 1KB 数据。
//count=8192:一共写入 8192 个块,因此生成的文件大小为 8MB。
- 格式化镜像文件为 ext2 文件系统
将创建的镜像文件格式化为 ext2 文件系统:
mkfs.ext2 -F ramdisk
//-F:强制格式化该文件为 ext2 文件系统。
- 创建挂载点
在 /mnt 目录下创建一个 initrd 目录,作为镜像文件的挂载点:
sudo mkdir /mnt/initrd
- 将镜像文件挂载到 /mnt/initrd 下
将格式化好的 ramdisk 文件挂载到 /mnt/initrd 下,以便后续操作文件:
sudo mount -t ext2 ramdisk /mnt/initrd
注意:ramdisk 文件不能放在根文件系统(rootfs)目录中,防止循环挂载的问题。
- 将测试好的文件系统复制到 RAMDisk 中
cat /etc/exports//最后一行就是测试好的文件系统位置(NFS服务器位置)
//NFS 挂载了文件系统
将已测试好的文件系统中的所有文件复制到挂载点 /mnt/initrd 中
sudo cp -a xxx/rootfs/* /mnt/initrd
//sudo cp -a /home/ubuntu/source/rootfs/* /mnt/initrd
-a:保留文件属性并递归复制目录下所有内容。
- 卸载挂载点
文件复制完成后,卸载挂载点 /mnt/initrd:
sudo umount /mnt/initrd
- 压缩 RAMDisk 文件
将 RAMDisk 文件压缩为 ramdisk.gz,以减小文件大小
gzip --best -c ramdisk > ramdisk.gz
--best:使用最高级别的压缩。
-c:将输出写入标准输出,并重定向到 ramdisk.gz 文件中。
然后将压缩后的文件拷贝到 /tftpboot 目录,方便后续通过网络引导:
cp ramdisk.gz /tftpboot
- 制作 U-Boot 识别的格式
将 ramdisk.gz 文件转换为 U-Boot 可识别的镜像格式(ramdisk.img):
mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img
-n:设置镜像的名称,这里为 "ramdisk"。
-A arm:指定处理器架构为 ARM。
-O linux:目标操作系统为 Linux。
-T ramdisk:类型为 RAMDisk。
-C gzip:使用 gzip 压缩格式。
-d:指定要包含的文件,这里为 ramdisk.gz。
然后将生成的 ramdisk.img 复制到 /tftpboot:
cp ramdisk.img /tftpboot
- 配置内核支持 RAMDisk
要让内核支持 RAMDisk 作为启动文件系统,需要在编译内核时启用相关选项。
9.1 运行 make menuconfig 配置内核:
make menuconfig ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
9.2 配置文件系统和设备驱动支持:
- 文件系统(File systems):
<*> Second extended fs support
- 设备驱动(Device Drivers):
- SCSI 设备支持:
SCSI device support ---> <*> SCSI disk support
- 块设备支持(Block devices):
Block devices ---> <*> RAM block device support (16) Default number of RAM disks # 默认的 RAM 磁盘数量为 16 (8192) Default RAM disk size (kbytes) # 设置默认 RAMDisk 大小为 8MB(8192KB)
- 通用设置(General setup):
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
9.3 重新编译内核并将新的内核镜像复制到 /tftpboot:
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage
cp arch/arm/boot/uImage /tftpboot
- 重新烧录 RAMDisk 并启动
最后一步是通过 U-Boot 重新加载并启动 RAMDisk 文件系统。
在 U-Boot 中,加载内核、设备树和新的 RAMDisk:
tftp 0x41000000 uImage
tftp 0x42000000 exynos4412-fs4412.dtb
tftp 0x43000000 ramdisk.img
bootm 0x41000000 0x43000000 0x42000000
这里分别加载内核(0x41000000)、RAMDisk 镜像(0x43000000)和设备树(0x42000000)。
总结
- 制作 RAMDisk 文件系统:
- 通过 dd 命令创建 RAMDisk 镜像文件,并格式化为 ext2 文件系统。
- 将已测试好的根文件系统复制到 RAMDisk 中,并压缩镜像为 ramdisk.gz。
- 配置内核支持 RAMDisk:
- 使用 make menuconfig 配置内核以支持 RAMDisk,并设置默认的 RAM 磁盘大小。
- 重新编译内核并将内核和 RAMDisk 镜像上传至 /tftpboot,方便后续通过 U-Boot 启动。
- 启动流程:
- 使用 U-Boot 通过网络引导加载内核、设备树和 RAMDisk 镜像,完成启动。