HankChow's Blog


  • 首页

  • 归档

  • 关于

  • 标签

  • 搜索

Saltstack 初始化部署

发表于 2018-07-10
字数统计: 263 | 阅读时长 ≈ 1

主控端安装 salt-master:

1
2
3
yum install -y salt-master
systemctl enable salt-master.service
systemctl start salt-master.service

被控端安装 salt-minion:

1
2
3
yum install -y salt-minion
systemctl enable salt-minion.service
systemctl start salt-minion.service

在主控端添加 TCP 4505、TCP 4506 的规则,在被控端无需配置防火墙。原理是被控端直接与主控端的 zeroMQ 建立长连接,接受广播到的任务信息并执行。

1
2
iptables -I INPUT -m state --state new -m tcp -p tcp --dport 4505 -j ACCEPT
iptables -I INPUT -m state --state new -m tcp -p tcp --dport 4506 -j ACCEPT

在主控端进行角色配置,修改主控端配置文件 /etc/salt/master:

1
2
3
4
5
6
7
8
9
interface: {主控端 IP 地址}

# 自动认证,如果不打开,需要通过 `salt-key -a {id}` 进行 key 的认证
auto_accept: true

# 指定 Saltstack 文件根目录位置
file_roots:
base:
- /srv/salt

然后重启主控端的 Saltstack 服务。

在被控端进行角色配置,修改被控端配置文件 /etc/salt/minion:

1
2
3
4
master: {主控端 IP 地址}

# 修改被控端主机识别 id
id: {id}

然后重启被控端的 Saltstack 服务。

如何使用 Ansible 打补丁以及安装应用

发表于 2018-05-20
字数统计: 1.1k | 阅读时长 ≈ 4

使用 Ansible IT 自动化引擎节省更新的时间。

你有没有想过,如何打补丁、重启系统,然后继续工作?

如果你的回答是肯定的,那就需要了解一下 Ansible 了。它是一个配置管理工具,对于一些复杂的有时候需要几个小时才能完成的系统管理任务,又或者对安全性有比较高要求的时候,使用 Ansible 能够大大简化工作流程。

以我作为系统管理员的经验,打补丁是一项最有难度的工作。每次遇到公共漏洞批露Common Vulnearbilities and Exposure(CVE)通知或者信息保障漏洞预警Information Assurance Vulnerability Alert(IAVA)时都必须要高度关注安全漏洞,否则安全部门将会严肃追究自己的责任。

使用 Ansible 可以通过运行封装模块以缩短打补丁的时间,下面以 yum 模块更新系统为例,使用 Ansible 可以执行安装、更新、删除、从其它地方安装(例如持续集成/持续开发中的 rpmbuild)。以下是系统更新的任务:

1
2
3
4
- name: update the system
yum:
name: "*"
state: latest

在第一行,我们给这个任务命名,这样可以清楚 Ansible 的工作内容。第二行表示使用 yum 模块在CentOS虚拟机中执行更新操作。第三行 name: "*" 表示更新所有程序。最后一行 state: latest 表示更新到最新的 RPM。

系统更新结束之后,需要重新启动并重新连接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- name: restart system to reboot to newest kernel
shell: "sleep 5 && reboot"
async: 1
poll: 0

- name: wait for 10 seconds
pause:
seconds: 10

- name: wait for the system to reboot
wait_for_connection:
connect_timeout: 20
sleep: 5
delay: 5
timeout: 60

- name: install epel-release
yum:
name: epel-release
state: latest

shell 模块中的命令让系统在 5 秒休眠之后重新启动,我们使用 sleep 来保持连接不断开,使用 async 设定最大等待时长以避免发生超时,poll 设置为 0 表示直接执行不需要等待执行结果。暂停 10 秒钟以等待虚拟机恢复,使用 wait_for_connection 在虚拟机恢复连接后尽快连接。随后由 install epel-release 任务检查 RPM 的安装情况。你可以对这个剧本执行多次来验证它的幂等性,唯一会显示造成影响的是重启操作,因为我们使用了 shell 模块。如果不想造成实际的影响,可以在使用 shell 模块的时候 changed_when: False。

现在我们已经知道如何对系统进行更新、重启虚拟机、重新连接、安装 RPM 包。下面我们通过 Ansible Lightbulb 来安装 NGINX:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
- name: Ensure nginx packages are present
yum:
name: nginx, python-pip, python-devel, devel
state: present
notify: restart-nginx-service

- name: Ensure uwsgi package is present
pip:
name: uwsgi
state: present
notify: restart-nginx-service

- name: Ensure latest default.conf is present
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/nginx.conf
backup: yes
notify: restart-nginx-service

- name: Ensure latest index.html is present
template:
src: templates/index.html.j2
dest: /usr/share/nginx/html/index.html

- name: Ensure nginx service is started and enabled
service:
name: nginx
state: started
enabled: yes

- name: Ensure proper response from localhost can be received
uri:
url: "http://localhost:80/"
return_content: yes
register: response
until: 'nginx_test_message in response.content'
retries: 10
delay: 1

以及用来重启 nginx 服务的操作文件:

1
2
3
4
5
# 安装 nginx 的操作文件
- name: restart-nginx-service
service:
name: nginx
state: restarted

在这个角色里,我们使用 RPM 安装了 nginx、python-pip、python-devel、devel,用 PIP 安装了 uwsgi,接下来使用 template 模块复制 nginx.conf 和 index.html 以显示页面,并确保服务在系统启动时启动。然后就可以使用 uri 模块检查到页面的连接了。

这个是一个系统更新、系统重启、安装 RPM 包的剧本示例,后续可以继续安装 nginx,当然这里可以替换成任何你想要的角色和应用程序。

1
2
3
4
- hosts: all
roles:
- centos-update
- nginx-simple

观看演示视频了解了解这个过程。

demo

这只是关于如何更新系统、重启以及后续工作的示例。简单起见,我只添加了不带变量的包,当你在操作大量主机的时候,你就需要修改其中的一些设置了:

  • async & poll
  • serial
  • forks

这是由于在生产环境中如果你想逐一更新每一台主机的系统,你需要花相当一段时间去等待主机重启才能够继续下去。

有关 Ansible 进行自动化工作的更多用法,请查阅其它文章。


via: https://opensource.com/article/18/3/ansible-patch-systems

如何使用树莓派测定颗粒物(PM 2.5)

发表于 2018-05-08
字数统计: 1.7k | 阅读时长 ≈ 6

使用两个简单的硬件设备和几行代码构建一个空气质量探测器。

我们在东南亚的学校定期测定空气中的颗粒物。这里的测定值非常高,尤其是在二到五月之间,干燥炎热、土地干旱等各种因素都对空气质量产生了不利的影响。我将会在这篇文章中展示如何使用树莓派来测定颗粒物。

什么是颗粒物?

颗粒物就是粉尘或者空气中的微小颗粒。其中 PM10 和 PM2.5 之间的差别就是 PM10 指的是粒径小于 10 微米的颗粒,而 PM2.5 指的是粒径小于 2.5 微米的颗粒。在粒径小于 2.5 微米的的情况下,由于它们能被吸入肺泡中并且对呼吸系统造成影响,因此颗粒越小,对人的健康危害越大。

世界卫生组织的建议颗粒物浓度是:

  • 年均 PM10 不高于 20 µg/m³
  • 年均 PM2.5 不高于 10 µg/m³
  • 不允许超标时,日均 PM10 不高于 50 µg/m³
  • 不允许超标时,日均 PM2.5 不高于 25 µg/m³

以上数值实际上是低于大多数国家的标准的,例如欧盟对于 PM10 所允许的年均值是不高于 40 µg/m³。

什么是空气质量指数Air Quality Index(AQI)?

空气质量指数是按照颗粒物的测定值来评价空气质量的好坏,然而由于各国之间的计算方式有所不同,这个指数并没有统一的标准。维基百科上关于空气质量指数的词条对此给出了一个概述。我们学校则以美国环境保护协会Environment Protection Agency(EPA)建立的分类法来作为依据。

空气质量指数

空气质量指数

测定颗粒物需要哪些准备?

测定颗粒物只需要以下两种器材:

  • 树莓派(款式不限,最好带有 WiFi)
  • SDS011 颗粒物传感器

颗粒物传感器

颗粒物传感器

如果是只带有 Micro USB 的树莓派 Zero W,那还需要一根连接到标准 USB 端口的适配线,只需要 20 美元,而传感器则自带适配串行接口的 USB 适配器。

安装过程

对于树莓派,只需要下载对应的 Raspbian Lite 镜像并且写入到 Micro SD 卡上就可以了(网上很多教程都有介绍如何设置 WLAN 连接,我就不细说了)。

如果要使用 SSH,那还需要在启动分区建立一个名为 ssh 的空文件。树莓派的 IP 通过路由器或者 DHCP 服务器获取,随后就可以通过 SSH 登录到树莓派了(默认密码是 raspberry):

1
$ ssh pi@192.168.1.5

首先我们需要在树莓派上安装一下这些包:

1
$ sudo apt install git-core python-serial python-enum lighttpd

在开始之前,我们可以用 dmesg 来获取 USB 适配器连接的串行接口:

1
2
3
4
5
6
7
8
$ dmesg
[ 5.559802] usbcore: registered new interface driver usbserial
[ 5.559930] usbcore: registered new interface driver usbserial_generic
[ 5.560049] usbserial: USB Serial support registered for generic
[ 5.569938] usbcore: registered new interface driver ch341
[ 5.570079] usbserial: USB Serial support registered for ch341-uart
[ 5.570217] ch341 1–1.4:1.0: ch341-uart converter detected
[ 5.575686] usb 1–1.4: ch341-uart converter now attached to ttyUSB0

在最后一行,可以看到接口 ttyUSB0。然后我们需要写一个 Python 脚本来读取传感器的数据并以 JSON 格式存储,在通过一个 HTML 页面就可以把数据展示出来了。

在树莓派上读取数据

首先创建一个传感器实例,每 5 分钟读取一次传感器的数据,持续 30 秒,这些数值后续都可以调整。在每两次测定的间隔,我们把传感器调到睡眠模式以延长它的使用寿命(厂商认为元件的寿命大约 8000 小时)。

我们可以使用以下命令来下载 Python 脚本:

1
$ wget -O /home/pi/aqi.py https://raw.githubusercontent.com/zefanja/aqi/master/python/aqi.py

另外还需要执行以下两条命令来保证脚本正常运行:

1
2
$ sudo chown pi:pi /var/www/html/
$ echo '[]' > /var/www/html/aqi.json

下面就可以执行脚本了:

1
2
3
4
5
6
7
8
9
$ chmod +x aqi.p
$ ./aqi.py
PM2.5:55.3, PM10:47.5
PM2.5:55.5, PM10:47.7
PM2.5:55.7, PM10:47.8
PM2.5:53.9, PM10:47.6
PM2.5:53.6, PM10:47.4
PM2.5:54.2, PM10:47.3
…

自动化执行脚本

只需要使用诸如 crontab 的服务,我们就不需要每次都手动启动脚本了。按照以下命令打开 crontab 文件:

1
$ crontab -e

在文件末尾添加这一行:

1
@reboot cd /home/pi/ && ./aqi.py

现在我们的脚本就会在树莓派每次重启后自动执行了。

展示颗粒物测定值和空气质量指数的 HTML 页面

我们在前面已经安装了一个轻量级的 web 服务器 lighttpd,所以我们需要把 HTML、JavaScript、CSS 文件放置在 /var/www/html 目录中,这样就能通过电脑和智能手机访问到相关数据了。执行下面的三条命令,可以下载到对应的文件:

1
2
3
$ wget -O /var/www/html/index.html https://raw.githubusercontent.com/zefanja/aqi/master/html/index.html
$ wget -O /var/www/html/aqi.js https://raw.githubusercontent.com/zefanja/aqi/master/html/aqi.js
$ wget -O /var/www/html/style.css https://raw.githubusercontent.com/zefanja/aqi/master/html/style.css

在 JavaScript 文件中,实现了打开 JSON 文件、提取数据、计算空气质量指数的过程,随后页面的背景颜色将会根据 EPA 的划分标准而变化。

你只需要用浏览器访问树莓派的地址,就可以看到当前颗粒物浓度值等数据了: http://192.168.1.5:

这个页面比较简单而且可扩展,比如可以添加一个展示过去数小时历史数据的表格等等。

这是Github上的完整源代码。

总结

在资金相对紧张的情况下,树莓派是一种选择。除此以外,还有很多可以用来测定颗粒物的应用,包括室外固定装置、移动测定设备等等。我们学校则同时采用了这两种:固定装置在室外测定全天颗粒物浓度,而移动测定设备在室内检测空调过滤器的效果。

Luftdaten.info 提供了一个如何设计类似的传感器的介绍,其中的软件效果出众,而且因为它没有使用树莓派,所以硬件更是小巧。

对于学生来说,设计一个颗粒物传感器确实算得上是一个优秀的课外项目。

你又打算如何使用你的树莓派呢?


via: https://opensource.com/article/18/3/how-measure-particulate-matter-raspberry-pi

查看 Linux 发行版名称和版本号的 8 种方法

发表于 2018-04-28
字数统计: 1.6k | 阅读时长 ≈ 7

如果你加入了一家新公司,要为开发团队安装所需的软件并重启服务,这个时候首先要弄清楚它们运行在什么发行版以及哪个版本的系统上,你才能正确完成后续的工作。作为系统管理员,充分了解系统信息是首要的任务。

查看 Linux 发行版名称和版本号有很多种方法。你可能会问,为什么要去了解这些基本信息呢?

因为对于诸如 RHEL、Debian、openSUSE、Arch Linux 这几种主流发行版来说,它们各自拥有不同的包管理器来管理系统上的软件包,如果不知道所使用的是哪一个发行版的系统,在软件包安装的时候就会无从下手,而且由于大多数发行版都是用 systemd 命令而不是 SysVinit 脚本,在重启服务的时候也难以执行正确的命令。

下面来看看可以使用那些基本命令来查看 Linux 发行版名称和版本号。

方法总览

  • lsb_release 命令
  • /etc/*-release 文件
  • uname 命令
  • /proc/version 文件
  • dmesg 命令
  • YUM 或 DNF 命令
  • RPM 命令
  • APT-GET 命令

方法 1: lsb_release 命令

LSB(Linux 标准库Linux Standard Base)能够打印发行版的具体信息,包括发行版名称、版本号、代号等。

1
2
3
4
5
6
# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.3 LTS
Release: 16.04
Codename: xenial

方法 2: /etc/*-release 文件

release 文件通常被视为操作系统的标识。在 /etc 目录下放置了很多记录着发行版各种信息的文件,每个发行版都各自有一套这样记录着相关信息的文件。下面是一组在 Ubuntu/Debian 系统上显示出来的文件内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# cat /etc/issue
Ubuntu 16.04.3 LTS \n \l

# cat /etc/issue.net
Ubuntu 16.04.3 LTS

# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS"

# cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.3 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.3 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

# cat /etc/debian_version
9.3

下面这一组是在 RHEL/CentOS/Fedora 系统上显示出来的文件内容。其中 /etc/redhat-release 和 /etc/system-release 文件是指向 /etc/[发行版名称]-release 文件的一个连接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# cat /etc/centos-release
CentOS release 6.9 (Final)

# cat /etc/fedora-release
Fedora release 27 (Twenty Seven)

# cat /etc/os-release
NAME=Fedora
VERSION="27 (Twenty Seven)"
ID=fedora
VERSION_ID=27
PRETTY_NAME="Fedora 27 (Twenty Seven)"
ANSI_COLOR="0;34"
CPE_NAME="cpe:/o:fedoraproject:fedora:27"
HOME_URL="https://fedoraproject.org/"
SUPPORT_URL="https://fedoraproject.org/wiki/Communicating_and_getting_help"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_BUGZILLA_PRODUCT="Fedora"
REDHAT_BUGZILLA_PRODUCT_VERSION=27
REDHAT_SUPPORT_PRODUCT="Fedora"
REDHAT_SUPPORT_PRODUCT_VERSION=27
PRIVACY_POLICY_URL="https://fedoraproject.org/wiki/Legal:PrivacyPolicy"

# cat /etc/redhat-release
Fedora release 27 (Twenty Seven)

# cat /etc/system-release
Fedora release 27 (Twenty Seven)

方法 3: uname 命令

uname(unix name 的意思) 是一个打印系统信息的工具,包括内核名称、版本号、系统详细信息以及所运行的操作系统等等。

  • 建议阅读: 6种查看系统 Linux 内核的方法
1
2
# uname -a
Linux localhost.localdomain 4.12.14-300.fc26.x86_64 #1 SMP Wed Sep 20 16:28:07 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

以上运行结果说明使用的操作系统版本是 Fedora 26。

方法 4: /proc/version 文件

这个文件记录了 Linux 内核的版本、用于编译内核的 gcc 的版本、内核编译的时间,以及内核编译者的用户名。

1
2
# cat /proc/version
Linux version 4.12.14-300.fc26.x86_64 ([email protected]) (gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC) ) #1 SMP Wed Sep 20 16:28:07 UTC 2017

方法 5: dmesg 命令

dmesg(展示信息display message 或驱动程序信息driver message)是大多数类 Unix 操作系统上的一个命令,用于打印内核的消息缓冲区的信息。

1
2
3
4
5
6
7
8
9
10
# dmesg | grep "Linux"
[ 0.000000] Linux version 4.12.14-300.fc26.x86_64 ([email protected]) (gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC) ) #1 SMP Wed Sep 20 16:28:07 UTC 2017
[ 0.001000] SELinux: Initializing.
[ 0.001000] SELinux: Starting in permissive mode
[ 0.470288] SELinux: Registering netfilter hooks
[ 0.616351] Linux agpgart interface v0.103
[ 0.630063] usb usb1: Manufacturer: Linux 4.12.14-300.fc26.x86_64 ehci_hcd
[ 0.688949] usb usb2: Manufacturer: Linux 4.12.14-300.fc26.x86_64 ohci_hcd
[ 2.564554] SELinux: Disabled at runtime.
[ 2.564584] SELinux: Unregistering netfilter hooks

方法 6: Yum/Dnf 命令

Yum(Yellowdog 更新器修改版Yellowdog Updater Modified)是 Linux 操作系统上的一个包管理工具,而 yum 命令被用于一些基于 RedHat 的 Linux 发行版上安装、更新、查找、删除软件包。

  • 建议阅读: 在 RHEL/CentOS 系统上使用 yum 命令管理软件包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# yum info nano
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
* base: centos.zswap.net
* extras: mirror2.evolution-host.com
* updates: centos.zswap.net
Available Packages
Name : nano
Arch : x86_64
Version : 2.3.1
Release : 10.el7
Size : 440 k
Repo : base/7/x86_64
Summary : A small text editor
URL : http://www.nano-editor.org
License : GPLv3+
Description : GNU nano is a small and friendly text editor.

下面的 yum repolist 命令执行后显示了 yum 的基础源仓库、额外源仓库、更新源仓库都来自 CentOS 7 仓库。

1
2
3
4
5
6
7
8
9
10
11
# yum repolist
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
* base: centos.zswap.net
* extras: mirror2.evolution-host.com
* updates: centos.zswap.net
repo id repo name status
base/7/x86_64 CentOS-7 - Base 9591
extras/7/x86_64 CentOS-7 - Extras 388
updates/7/x86_64 CentOS-7 - Updates 1929
repolist: 11908

使用 dnf 命令也同样可以查看发行版名称和版本号。

  • 建议阅读: 在 Fedora 系统上使用 DNF(YUM 的一个分支)命令管理软件包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# dnf info nano
Last metadata expiration check: 0:01:25 ago on Thu Feb 15 01:59:31 2018.
Installed Packages
Name : nano
Version : 2.8.7
Release : 1.fc27
Arch : x86_64
Size : 2.1 M
Source : nano-2.8.7-1.fc27.src.rpm
Repo : @System
From repo : fedora
Summary : A small text editor
URL : https://www.nano-editor.org
License : GPLv3+
Description : GNU nano is a small and friendly text editor.

方法 7: RPM 命令

RPM(红帽包管理器RedHat Package Manager)是在 CentOS、Oracle Linux、Fedora 这些基于 RedHat 的操作系统上的一个强大的命令行包管理工具,同样也可以帮助我们查看系统的版本信息。

  • 建议阅读: 在基于 RHEL 的系统上使用 RPM 命令管理软件包
1
2
# rpm -q nano
nano-2.8.7-1.fc27.x86_64

方法 8: APT-GET 命令

Apt-Get(高级打包工具Advanced Packaging Tool)是一个强大的命令行工具,可以自动下载安装新软件包、更新已有的软件包、更新软件包列表索引,甚至更新整个 Debian 系统。

  • 建议阅读: 在基于 Debian 的系统上使用 Apt-Get 和 Apt-Cache 命令管理软件包
1
2
3
4
5
6
7
8
9
10
# apt-cache policy nano
nano:
Installed: 2.5.3-2ubuntu2
Candidate: 2.5.3-2ubuntu2
Version table:
* 2.5.3-2ubuntu2 500
500 http://nova.clouds.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages
100 /var/lib/dpkg/status
2.5.3-2 500
500 http://nova.clouds.archive.ubuntu.com/ubuntu xenial/main amd64 Packages

via: https://www.2daygeek.com/check-find-linux-distribution-name-and-version/

在树莓派上运行 DOS 系统

发表于 2018-04-14
字数统计: 1.9k | 阅读时长 ≈ 7

不同的 CPU 架构意味着在树莓派上运行 DOS 并非唾手可得,但其实也没多麻烦。

FreeDOS 对大家来说也许并不陌生。它是一个完整、免费并且对 DOS 兼容良好的操作系统,它可以运行一些比较老旧的 DOS 游戏或者商用软件,也可以开发嵌入式的应用。只要在 MS-DOS 上能够运行的程序,在 FreeDOS 上都可以运行。

作为 FreeDOS 的发起者和项目协调人员,很多用户会把我作为内行人士进行发问。而我最常被问到的问题是:“FreeDOS 可以在树莓派上运行吗?”

这个问题并不令人意外。毕竟 Linux 在树莓派上能够很好地运行,而 FreeDOS 和 Linux 相比是一个更古老、占用资源更少的操作系统,那 FreeDOS 为啥不能树莓派上运行呢?

简单来说。由于 CPU 架构的原因,FreeDOS 并不能在树莓派中独立运行。和其它 DOS 类的系统一样,FreeDOS 需要英特尔 x86 架构 CPU 以及 BIOS 来提供基础的运行时服务。而树莓派运行在 ARM 架构的 CPU 上,与英特尔 CPU 二进制不兼容,也没有 BIOS。因此树莓派在硬件层面就不支持 FreeDOS。

不过通过 PC 模拟器还是能在树莓派上运行 FreeDOS 的,虽然这样也许稍有不足,但也不失为一个能在树莓派上运行 FreeDOS 的方法。

DOSBox 怎么样?

有人可能会问:“为什么不用 DOSBox 呢?” DOSBox 是一个开源的跨平台 x86 模拟器,在 Linux 上也能使用,它能够为应用软件尤其是游戏软件提供了一个类 DOS 的运行环境,所以如果你只是想玩 DOS 游戏的话,DOSBox 是一个不错的选择。但在大众眼中,DOSBox 是专为 DOS 游戏而设的,而在运行一些别的 DOS 应用软件方面,DOSBox 只是表现平平。

对多数人来说,这只是个人偏好的问题,我喜欢用 FreeDOS 来运行 DOS 游戏和其它程序,完整的 DOS 系统和 DOSBox 相比能让我体验到更好的灵活性和操控性。我只用 DOSBox 来玩游戏,在其它方面还是选择完整的 FreeDOS。

在树莓派上安装 FreeDOS

QEMU(Quick EMUlator)是一款能在 Linux 系统上运行 DOS 系统的开源的虚拟机软件。很多流行的 Linux 系统都自带 QEMU。QEMU 在我的树莓派上的 Raspbian 系统中也同样能够运行,下文就有一些我在树莓派 Raspbian GNU/Linux 9 (Stretch) 系统中使用 QEMU 的截图。

去年我在写了一篇关于如何在 Linux 系统中运行 DOS 程序的文章的时候就用到了 QEMU,在树莓派上使用 QEMU 来安装运行 FreeDOS 的步骤基本上和在别的基于 GNOME 的系统上没有什么太大的区别。

在 QEMU 中你需要通过添加各种组件来搭建虚拟机。先指定一个用来安装运行 DOS 的虚拟磁盘镜像,通过 qemu-img 命令来创建一个虚拟磁盘镜像,对于 FreeDOS 来说不需要太大的空间,所以我只创建了一个 200MB 的虚拟磁盘:

1
qemu-img create freedos.img 200M

和 VMware 或者 VirtualBox 这些 PC 模拟器不同,使用 QEMU 需要通过添加各种组件来搭建虚拟机,尽管有点麻烦,但是并不困难。我使用了以下这些参数来在树莓派上使用 QEMU 安装 FreeDOS 系统:

1
qemu-system-i386 -m 16 -k en-us -rtc base=localtime -soundhw sb16,adlib -device cirrus-vga -hda freedos.img -cdrom FD12CD.iso -boot order=d

你可以在我其它的文章中找到这些命令的完整介绍。简单来说,上面这条命令指定了一个英特尔 i386 兼容虚拟机,并且分配了 16MB 内存、一个英文输入键盘、一个基于系统时间的实时时钟、一个声卡、一个音乐卡以及一个 VGA 卡。文件 freedos.img 指定为第一个硬盘(C:),FD12CD.iso 镜像作为 CD-ROM (D:)驱动。QEMU 设定为从 D: 的 CD-ROM 启动。

你只需要按照提示就可以轻松安装好 FreeDOS 1.2 了。但是由于 microSD 卡在面对大量的 I/O 时速度比较慢,所以安装操作系统需要花费很长时间。

在树莓派上运行 FreeDOS

你的运行情况取决于使用哪一种 microSD 卡。我用的是 SanDisk Ultra 64GB microSDXC UHS-I U1A1 ,其中 U1 这种型号专用于支持 1080p 的视频录制(例如 GoPro),它的最低串行写速度能够达到 10MB/s。相比之下,V60 型号专用于 4K 视频录制,最低连续写入速度能达到 60MB/s。如果你的树莓派使用的是 V60 的 microSD 卡甚至是 V30(也能达到 30MB/s),你就能明显看到它的 I/O 性能会比我的好。

FreeDOS 安装好之后,你可以直接从 C: 进行启动。只需要按照下面的命令用 -boot order=c 来指定 QEMU 的启动顺序即可:

1
​qemu-system-i386 -m 16 -k en-us -rtc base=localtime -soundhw sb16,adlib -device cirrus-vga -hda freedos.img -cdrom FD12CD.iso -boot order=c​

只要树莓派的 QEMU 上安装了 FreeDOS,就不会出现明显的性能问题。例如游戏通常在每一关开始的时候会加载地图、怪物、声音等一系列的数据,尽管这些内容需要加载一段时间,但在正常玩的时候并没有出现性能不足的现象。

FreeDOS 1.2 自带了很多游戏以及其它应用软件,可以使用 FDIMPLES 包管理程序来安装它们。FreeDOS 1.2 里面我最喜欢的是一款叫 WING 的太空射击游戏,让人想起经典的街机游戏 Galaga(WING 就是 Wing Is Not Galaga 的递归缩写词)。

As-Easy-As 是我最喜欢的一个 DOS 应用程序,作为 20 世纪八九十年代流行的电子表格程序,它和当时的 Lotus 1-2-3 以及现在的 Microsoft Excel、LibreOffice Calc 一样具有强大的威力。As-Easy-As 和 Lotus 1-2-3 都将数据保存为 WKS 文件,现在新版本的 Microsoft Excel 已经无法读取这种文件了,而 LibreOffice Calc 视兼容性而定有可能支持。鉴于 As-Easy-As 的初始版本是一个共享软件,TRIUS 仍然为 As-Easy-As 5.7 免费提供激活码。

我也非常喜欢 GNU Emacs 编辑器,FreeDOS 也自带了一个叫 Freemacs 的类 Emacs 的文本编辑器。它比 FreeDOS 默认的 FreeDOS Edit 编辑器更强大,也能带来 GNU Emacs 的体验。如果你也需要,可以在 FreeDOS 1.2 中通过FDIMPLES包管理程序来安装。

是的,你或许真的可以在树莓派上运行 DOS

即使树莓派在硬件上不支持 DOS,但是在模拟器的帮助下,DOS 还是能够在树莓派上运行。得益于 QEMU PC 模拟器,一些经典的 DOS 游戏和 DOS 应用程序能够运行在树莓派上。在执行磁盘 I/O ,尤其是大量密集操作(例如写入大量数据)的时候,性能可能会受到轻微的影响。当你使用 QEMU 并且在虚拟机里安装好 FreeDOS 之后,你就可以尽情享受经典的 DOS 程序了。


via: https://opensource.com/article/18/3/can-you-run-dos-raspberry-pi

1…111213…17
HankChow

HankChow

84 日志
74 标签
0%
© 2019 HankChow | Site words total count: 111.3k