通知设置 新通知
(精品)(Docker系列之二)龙芯Fedora21平台制作docker镜像,并且解决vi乱码问题
huangxg 发表了文章 • 0 个评论 • 1792 次浏览 • 2017-09-25 15:32
本文的实验都是在龙芯3A3000机器上。
操作系统是loongnix(Fedora21)20170726版本,
docker是1.12.2版本。
安装docker工具
loongnix已经编译好docker的安装包,通过网络源即可安装:
# yum install docker
# service docker restart
制作docker镜像
制作镜像有很多种方法,本文使用了网络上提供的一个脚本文件,可以使制作镜像的过程简单、自动化的完成。
具体步骤如下:
- 下载脚本:使用wget命令下载这个文件
# wget https://raw.githubusercontent.com/docker/docker/master/contrib/mkimage-yum.sh2017-09-25 14:59:53 - 已保存 “mkimage-yum.sh”
- 为脚本增加可执行权限
# chmod a+x ./mkimage-yum.sh
- 使用脚本制作龙芯的Docker镜像
# ./mkimage-yum.sh -y /etc/yum.conf fedora21-base脚本执行结束后,通过docker images的输出可见,已经正常生成了一个镜像,名称为“fedora21-base”:
+ yum -c /etc/yum.conf --installroot=/tmp/mkimage-yum.sh.iDuoUP -y clean all
+ tar --numeric-owner -c -C /tmp/mkimage-yum.sh.iDuoUP .
+ docker import - fedora21-base:21
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
fedora21-base 21 25bca293a55c 3 minutes ago 206.9 MB
创建docker容器并运行容器
有了fedora21-base镜像,现在就可以创建一个运行的容器了。使用docker run命令:
[root@localhost /]# docker run -i -t fedora21-base:21 /bin/bashdocker run命令中,-i 代表容器可以接收键盘上的输入(主要用于在容器的命令上运行程序);-t 和 -i 配合使用。
[root@f38d097e3d72 /]#
容器运行成功后可以看见一个明显的变化,就是命令行提示符已经由本机的机器名称(localhost)变成了容器的ID(f38d097e3d72)。
至此,第一个龙芯容器创建成功,并且开始正常运行了!
现在可以在容器的命令行上输入任何命令了。注意,这样命令都是在容器的虚拟机中运行,不会对本机的文件系统造成任何破坏。
vi的乱码问题
通过上述方法创建的镜像,虽然可以正确的运行命令行,但是存在一个小问题,vi编辑器中不能正常显示中文。
为了演示这个问题,创建一个文本文件,其中包含中文(可以通过本机的输入法切换到中文进行输入“龙芯中科”四个字):
# echo 龙芯中科 > 1.txt使用 vi 打开
# vi 1.txt这样就显示出了问题:vi中打开的文本文件,原来的四个中文字符,现在都是乱码:
~Y~J�中~Q
解决方法
通过分析发现,问题原因是使用前文的脚本制作的镜像,缺少一些必要的文件,
具体来说:没有安装 glibc-common, LC_ALL 和 LANG 两项中编码格式不正确,在 /etc 目录下缺少 locale.conf 文件。对于一般用户,不需要具体了解这几个文件的含义。
解决方法是,再使用yum命令安装这些文件。具体步骤为:
# cd /usr/lib除此之外,每次进入容器或重启容器以后,还需在命令行执行如下两条命令:
# mkdir locale
# cd locale
# yum reinstall glibc-common -y
# echo zh_CN.UTF-8 > /etc/locale.conf
export LC_ALL=zh_CN.UTF-8
export LANG=zh_CN.UTF-8
验证效果
经过上面的配置后,再使用 vi 打开文件,可以看到已经能够正常显示中文了。
# vi /1.txt
龙芯中科
~
~
上面的操作,对于容器重新启动后仍然有效。
总 结
本文描述在龙芯平台上搭建docker环境、制作基本镜像的方法,并成功运行容器。
并且解决了在容器中 vi 不能正常显示中文的问题。
可供开发者和部署服务器应用的管理员参考。
参考文献:
[1] 《 Docker 从零开始制作基础镜像[centos]》
http://www.cnblogs.com/2018/p/4633940.html
这个脚本自动的制作镜像,并且导入到本机的镜像仓库中。
原理仍然是 yum groupinstall "Core" --installroot="target"
自动到源上去下载包,保证是一个干净的环境。
然后自动打tar包,执行docker import操作。
(精品)(Docker系列之一)龙芯Fedora21平台上解决docker 1.12.2退出问题
loongnix 发表了文章 • 0 个评论 • 2161 次浏览 • 2017-09-22 15:59
操作系统版本
loongnix(Fedora21) 20170726及以前版本,安装docker 1.12.2后,创建容器正常,但是docker stop容器会阻塞住,容器无法正常退出。
解决方法
此问题是Docker官方版本缺少对MIPS平台的epoll支持。
现在龙芯已经修正这个问题,loongnix.org上已经提交了功能正常的docker包。
执行以下命令即可自动安装新版本的包。
# yum update docker
# service docker restart
注意:测试的时候发现,只做service docker restart,并不能把所有docker进程都重新启动,需要手工kill所有的docker进程,才能保证新安装的文件得到运行。
具体步骤如下:
# ps aux | grep docker
loongson 7477 0.0 0.0 107488 1728 pts/5 S+ 16:44 0:00 grep --color=auto dockerps 命令输出的每一行是一个docker进程,第2列是进程号,对所有这些进程号执行kill命令,例如:
root 17693 0.0 0.2 492960 8560 ? Ssl 9月21 0:54 /usr/libexec/docker/docker-containerd-current --listen unix:///run/containerd.sock --shim /usr/libexec/docker/docker-containerd-shim-current
root 17719 0.3 0.8 826192 35920 ? Ssl 9月21 5:16 /usr/bin/dockerd-current --add-runtime oci=/usr/libexec/docker/docker-runc-current --default-runtime=oci --containerd /run/containerd.sock --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --selinux-enabled --log-driver=journald
root 17902 0.0 0.0 196512 2544 ? Sl 9月21 0:00 /usr/libexec/docker/docker-containerd-shim-current fac1ee0c5de07257e5d65215abae4728bd08ec245026693d2b0444fe3f9d0745 /var/run/docker/libcontainerd/fac1ee0c5de07257e5d65215abae4728bd08ec245026693d2b0444fe3f9d0745 /usr/libexec/docker/docker-runc-current
root 17986 0.0 0.2 351472 11776 pts/2 Sl+ 9月21 0:00 /usr/bin/docker-current attach fac1
# kill -9 17693 17719 17902 17986
执行kill命令后,务必再次执行ps命令,保证所有docker进程都已经被kill掉。
最后,再重新启动docker服务:
# service docker restart这样才能确保运行的docker是新版本。
如果觉得上面的步骤实在太费事,有一个简单的方法,重新启动整个机器。
附:源码包链接
http://ftp.loongnix.org/os/loongnix/1.0/SRPMS/d/docker-1.12.2-5.git8f1975c.2.fc21.loongson.src.rpm
原始patch
From 57de5faf811e68fea1828faba6cc5ac2bb60474d Mon Sep 17 00:00:00 2001
Date: Thu, 21 Sep 2017 20:46:26 +0800
Subject: [PATCH] docker 1.12.2 fix stop failed on mips64le
---
.../archutils/epoll.go | 2 +-
.../archutils/epoll_mips64le.go | 73 ++++++++++++++++++++++
2 files changed, 74 insertions(+), 1 deletion(-)
create mode 100644 containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll_mips64le.go
diff --git a/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll.go b/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll.go
index 3f08d8f..bca5015 100644
--- a/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll.go
+++ b/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll.go
@@ -1,4 +1,4 @@
-// +build linux,!arm64
+// +build linux,!arm64,!mips64le
package archutils
diff --git a/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll_mips64le.go b/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll_mips64le.go
new file mode 100644
index 0000000..524f0cc
--- /dev/null
+++ b/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll_mips64le.go
@@ -0,0 +1,73 @@
+// +build linux,mips64le
+
+package archutils
+
+// #include <sys/epoll.h>
+/*
+int EpollCreate1(int flag) {
+ return epoll_create1(flag);
+}
+
+int EpollCtl(int efd, int op,int sfd, int events, int fd) {
+ struct epoll_event event;
+ event.events = events;
+ event.data.fd = fd;
+
+ return epoll_ctl(efd, op, sfd, &event);
+}
+
+struct event_t {
+ uint32_t events;
+ int fd;
+};
+
+struct epoll_event events[128];
+int run_epoll_wait(int fd, struct event_t *event) {
+ int n, i;
+ n = epoll_wait(fd, events, 128, -1);
+ for (i = 0; i < n; i++) {
+ event[i].events = events[/i].events;
+ event.fd = events.data.fd;
+ }
+ return n;
+}
+*/
+import "C"
+
+import (
+ "fmt"
+ "syscall"
+ "unsafe"
+)
+
+// EpollCreate1 calls a C implementation
+func EpollCreate1(flag int) (int, error) {
+ fd := int(C.EpollCreate1(C.int(flag)))
+ if fd < 0 {
+ return fd, fmt.Errorf("failed to create epoll, errno is %d", fd)
+ }
+ return fd, nil
+}
+
+// EpollCtl calls a C implementation
+func EpollCtl(epfd int, op int, fd int, event *syscall.EpollEvent) error {
+ errno := C.EpollCtl(C.int(epfd), C.int(syscall.EPOLL_CTL_ADD), C.int(fd), C.int(event.Events), C.int(event.Fd))
+ if errno < 0 {
+ return fmt.Errorf("Failed to ctl epoll")
+ }
+ return nil
+}
+
+// EpollWait calls a C implementation
+func EpollWait(epfd int, events syscall.EpollEvent, msec int) (int, error) {
+ var c_events [128]C.struct_event_t
+ n := int(C.run_epoll_wait(C.int(epfd), (*C.struct_event_t)(unsafe.Pointer(&c_events))))
+ if n < 0 {
+ return int(n), fmt.Errorf("Failed to wait epoll")
+ }
+ for i := 0; i < n; i++ {
+ events.Fd = int32(c_events.fd)
+ events.Events = uint32(c_events[i].events)
+ }
+ return int(n), nil
+}
--
2.1.0[/i]
龙芯开发者计划★《第一期龙芯主板优惠购活动》
loongnix 发表了文章 • 66 个评论 • 5535 次浏览 • 2017-08-16 16:55
原价3499元的龙芯3A2000开发板,开发者优惠价1999元,并赠送2条2G内存。
原价3999元的龙芯3A3000开发板,开发者优惠价2399元,并赠送2条4G内存。
本次龙芯主板优惠购的活动时间为:8月20日—9月15日,
详细购买方法请点击访问:龙芯公司官网的活动页面
龙芯俱乐部电脑群217352005 有问题可以在群里咨询 加群请说明“龙芯开发者计划”
咨询QQ 2262727630 加QQ 请说明“龙芯开发者计划”
怎么才能体验loongnix
zzz19760225 回复了问题 • 4 人关注 • 4 个回复 • 1175 次浏览 • 2017-08-08 03:54
龙芯3A2000移植RethinkDB指南
RayWang 发表了文章 • 0 个评论 • 895 次浏览 • 2017-03-14 11:23
- 用于构建实时Web应用程序的开源数据库
- NoSQL数据库,存储无模式JSON文档
- 易于扩展的分布式数据库
- 具有自动故障转移和稳健容错的高可用性数据库
其核心是一个高度并行的B树实现。
二、移植环境
软件环境:
(1)loongnix1.0系统。下载地址:www.loongnix.org
(2)内核版本:3.10.84
硬件环境:
(1)开发板类型:Loongson-3A2000-780E-4w-V0.1-demo
(2)固件版本:loongson-PMON-V3.3.0
三、移植过程
安装依赖软件:
sudo yum install gcc-c++ protobuf-devel ncurses-devel jemalloc-devel \下载源码及patch文件:
boost-static wget protobuf-compiler which zlib-devel \
openssl-devel libcurl-devel make m4
wget http://ftp.loongnix.org/others/server/RethinkDB/jemalloc-4.2.1-1.fc21.loongson.mips64el.rpm
wget http://ftp.loongnix.org/others/server/RethinkDB/jemalloc-devel-4.2.1-1.fc21.loongson.mips64el.rpm
sudo rpm -Uvh jemalloc-4.2.1-1.fc21.loongson.mips64el.rpm jemalloc-devel-4.2.1-1.fc21.loongson.mips64el.rpm
本例中使用的rethinkdb的版本为官方2.3.5版本
wget https://download.rethinkdb.com/dist/rethinkdb-2.3.5.tgz编译安装RethinkDB:
tar xf rethink-2.3.5.tgz
wget http://ftp.loongnix.org/others/server/RethinkDB/sources/0001-rethinkdb-2.3.5-add-mips64el-support.patch
cd rethinkdb-2.3.5
patch –p1 < ../ 0001-rethinkdb-2.3.5-add-mips64el-support.patch
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --dynamic jemalloc配置RethinkDB(root用户):
make THREADED_COROUTINES=1 -j4
sudo make THREADED_COROUTINES=1 install
groupadd –r rethinkdb启动服务:
useradd --system --no-create-home --gid %{name} --shell /sbin/nologin --comment "RethinkDB Daemon" rethinkdb
cp /etc/rethinkdb/default.conf.sample /etc/rethinkdb/instances.d/default.conf(可根据需求进行修改)
/etc/init.d/rethinkdb start运行后可在浏览器中访问数据库:
启动过程可能出现Permission错误,解决方法见FAQ。
http://localhost:8080
四、二进制rpm包的使用
如果觉得重新编译麻烦,可直接使用编译好的二进制rpm包:
sudo wget http://ftp.loongnix.org/others/server/RethinkDB/rethinkdb.repo -O /etc/yum.repos.d/rethinkdb.repoFAQ:
sudo yum install rethinkdb
sudo cp /etc/rethinkdb/default.conf.sample /etc/rethinkdb/instances.d/default.conf
sudo /etc/init.d/rethinkdb start
注:如启动过程出现Permission错误,见FAQ。
(1)启动提示permission错误
需要修正目录权限
chown rethinkdb:rethinkdb /var/lib/rethinkdb –R
chown rethinkdb:rethinkdb /run/rethinkdb –R
然后重新执行启动命令。
/etc/init.d/rethinkdb start
fedora21对3A3000笔记本能否增加连接鼠标就自动关闭触摸屏功能选项
loongnix 回复了问题 • 2 人关注 • 3 个回复 • 697 次浏览 • 2017-03-15 15:23
3A3000处理器性能咨询
赤子之心 回复了问题 • 5 人关注 • 4 个回复 • 4330 次浏览 • 2018-06-23 11:04
请教一下一下 龙芯的固件 pmon 或者昆仑 支持gpt分区吗?
loongson_BIOS 回复了问题 • 2 人关注 • 1 个回复 • 824 次浏览 • 2017-03-14 17:27