Loongnix操作系统

Loongnix操作系统

fedora 29 for mips64r2el 的 rpm

jiangtao9999 发表了文章 • 0 个评论 • 219 次浏览 • 2018-11-02 22:41 • 来自相关话题

https://pan.baidu.com/s/1UnUzZFIEwh43doIOQQyibg   里面的 rpms-20181102 就是这些 rpm 的压缩包。 这是基于 fedora 29 的 devel 版本编译的。 ...查看全部
https://pan.baidu.com/s/1UnUzZFIEwh43doIOQQyibg
 
里面的 rpms-20181102 就是这些 rpm 的压缩包。
这是基于 fedora 29 的 devel 版本编译的。
我会用这些 rpm 尝试编译正式版的 fedora 29 。
里面的 java ,版本号 fc29.1 的是龙芯的 mips64el 版,没有这个 .1 的,是 fedora 自己的版本,加上 debian 的 zero 补丁编译出来的 zero 版,也就是完全架构无关无优化的版本。
里面的内核是 4.14 的,因为我没找到能用的 4.18 版,所以只好先用这个替代。(话说 loongnix 的网站还吹 kernel.org 的源代码能跑龙芯呢吧?实际上不能了啊。)
但是 fedora 29 的 firewalld (好像是这个)已经开始依赖 4.18 版了。
其实我曾经编译过 4.18 版的内核,但是不能启动,还引起了 mock 的工作不正常,好像是 libseccomp 没办法正确转换 4.14 和 4.18 的调用。所以只好去掉了。
 
希望龙芯能发布 4.18+ 的内核源代码,能启动的。不要抱着老版本了。尤其是 4.20 提升了 fuse 的性能,这很关键的。其实 4.18 就已经开始增加 fuse 的性能了。这对于龙芯肯定需要的 ntfs-3g 还是很有意义的。另外,内核 4.17 开始可以用 zfsonlinux 的内核模块版了吧?这东西也很好啊。龙芯做服务器,可以先从对 CPU 的需求不高的数据服务器开始啊。
 
欢迎大家用这个系统继续编译,不过编译 rpm 需要禁用 debugsource 的 rpm 生成。我看生成的脚本,似乎是调用 debugedit 输出文件这里失败,导致文件为空。我已经发了另外一个问题,也希望大家帮忙解决。
另外,哪位如果有服务器可以提供 http ,帮忙放个 repo 吧。
谢谢了。

龙芯电脑能玩什么游戏

中国原创 回复了问题 • 3 人关注 • 4 个回复 • 222 次浏览 • 2018-11-02 00:11 • 来自相关话题

loongnix的升级计划是怎样的

wanghonghu 回复了问题 • 2 人关注 • 2 个回复 • 213 次浏览 • 2018-11-01 10:40 • 来自相关话题

qemu 2.7.0 版本模拟龙芯3a芯片,运行龙芯系统出现段错误,请问是什么问题

DaDou13 回复了问题 • 2 人关注 • 1 个回复 • 140 次浏览 • 2018-10-28 21:04 • 来自相关话题

请问有没有qemu上模拟运行龙芯系统的相关文档或者实验过程之类的资料

DaDou13 回复了问题 • 4 人关注 • 4 个回复 • 162 次浏览 • 2018-10-28 21:03 • 来自相关话题

qemu 2.7.0版本的 loongson3a处理器 跑 linux内核

DaDou13 回复了问题 • 3 人关注 • 2 个回复 • 151 次浏览 • 2018-10-28 20:48 • 来自相关话题

请问有没有 使用 qemu-system-mips64el 跑龙芯系统内核的教程

回复

lvruihua111 发起了问题 • 1 人关注 • 0 个回复 • 63 次浏览 • 2018-10-23 18:27 • 来自相关话题

不同的app播放1080P视频时的CPU占用率

DaDou13 回复了问题 • 4 人关注 • 3 个回复 • 197 次浏览 • 2018-10-21 20:49 • 来自相关话题

真搞不懂loongnix为什么不基于Debian来开发

DaDou13 回复了问题 • 7 人关注 • 7 个回复 • 303 次浏览 • 2018-10-21 20:43 • 来自相关话题

条新动态, 点击查看
DaDou13

DaDou13 回答了问题 • 2017-02-22 09:27 • 5 个回复 不感兴趣

fedora21有更好用的输入法吗?

赞同来自:

试一下rime,暂时想不到其它的了。
源里有ibus-rime,使用的是ibus的话可以直接安装。
如果用的是fcitx,源里没有fcitx-rime要自己编译安装
安装依赖后编译
$ cmake .
$ make
$ sudo make install
... 显示全部 »
试一下rime,暂时想不到其它的了。
源里有ibus-rime,使用的是ibus的话可以直接安装。
如果用的是fcitx,源里没有fcitx-rime要自己编译安装
安装依赖后编译
$ cmake .
$ make
$ sudo make install
安装后就可以在fcitx的配置里选择rime了,体验比fcitx-pinyin要好。

另外我有在搜狗输入法主页(底部)看到linux版合作的信息,可以和搜狗联系一下。搜狗已经有linux版了,再移植到龙芯电脑应该不难。
举爪为证

举爪为证 回答了问题 • 2017-02-20 10:37 • 4 个回复 不感兴趣

3A3000处理器性能咨询

赞同来自:

可以给您一个测试数据做对比:
硬件平台:3A3000_780E单路开发板
固件:Loongson-PMON-V3.3.0(2016-09-28)
编译器:gcc-4.9.3
操作系统:loongnix-20161130
SPECcpu2006测试结果:
单线程... 显示全部 »
可以给您一个测试数据做对比:
硬件平台:3A3000_780E单路开发板
固件:Loongson-PMON-V3.3.0(2016-09-28)
编译器:gcc-4.9.3
操作系统:loongnix-20161130
SPECcpu2006测试结果:
单线程:
整点:10.6
浮点:9.56
4线程:
整点:34.9
浮点:30.8


 
loongnix

loongnix 回答了问题 • 2017-03-09 04:22 • 4 个回复 不感兴趣

Fedora21有没有thunderbird?

赞同来自:

已经编译过了Fedora22内置的thunderbird-31.6.0-1.fc22.src.rpm。在龙芯上运行功能正常。
 
原始代码需要针对mips64el平台进行以下的修改才能编译通过:
 
[code]diff --git a/comm-esr31/... 显示全部 »
已经编译过了Fedora22内置的thunderbird-31.6.0-1.fc22.src.rpm。在龙芯上运行功能正常。
 
原始代码需要针对mips64el平台进行以下的修改才能编译通过:
 
[code]diff --git a/comm-esr31/mozilla/ipc/chromium/src/base/atomicops_internals_mips_gcc.h b/comm-esr31/mozilla/ipc/chromium/src/base/atomicops_internals_mips_gcc.h
index e8a1c76..80f5feb 100644
--- a/comm-esr31/mozilla/ipc/chromium/src/base/atomicops_internals_mips_gcc.h
+++ b/comm-esr31/mozilla/ipc/chromium/src/base/atomicops_internals_mips_gcc.h
@@ -1,4 +1,4 @@
-// Copyright 2010 the V8 project authors. All rights reserved.
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
@@ -25,13 +25,13 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-// This file is an internal atomic implementation, use atomicops.h instead.
+// This file is an internal atomic implementation, use base/atomicops.h instead.
+//
+// LinuxKernelCmpxchg and Barrier_AtomicIncrement are from Google Gears.

#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_MIPS_GCC_H_
#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_MIPS_GCC_H_

-#define ATOMICOPS_COMPILER_BARRIER() __asm__ __volatile__("" : : : "memory")
-
namespace base {
namespace subtle {

@@ -61,7 +61,7 @@ inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
"2:\n"
".set pop\n"
: "=&r" (prev), "=m" (*ptr), "=&r" (tmp)
- : "Ir" (old_value), "r" (new_value), "m" (*ptr)
+ : "r" (old_value), "r" (new_value), "m" (*ptr)
: "memory");
return prev;
}
@@ -74,7 +74,7 @@ inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,
__asm__ __volatile__(".set push\n"
".set noreorder\n"
"1:\n"
- "ll %1, %2\n" // old = *ptr
+ "ll %1, %4\n" // old = *ptr
"move %0, %3\n" // temp = new_value
"sc %0, %2\n" // *ptr = temp (with atomic check)
"beqz %0, 1b\n" // start again on atomic error
@@ -96,7 +96,7 @@ inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,
__asm__ __volatile__(".set push\n"
".set noreorder\n"
"1:\n"
- "ll %0, %2\n" // temp = *ptr
+ "ll %0, %4\n" // temp = *ptr
"addu %1, %0, %3\n" // temp2 = temp + increment
"sc %1, %2\n" // *ptr = temp2 (with atomic check)
"beqz %1, 1b\n" // start again on atomic error
@@ -111,9 +111,9 @@ inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,

inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
Atomic32 increment) {
- ATOMICOPS_COMPILER_BARRIER();
+ MemoryBarrier();
Atomic32 res = NoBarrier_AtomicIncrement(ptr, increment);
- ATOMICOPS_COMPILER_BARRIER();
+ MemoryBarrier();
return res;
}

@@ -126,19 +126,16 @@ inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
Atomic32 old_value,
Atomic32 new_value) {
- ATOMICOPS_COMPILER_BARRIER();
Atomic32 res = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
- ATOMICOPS_COMPILER_BARRIER();
+ MemoryBarrier();
return res;
}

inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
Atomic32 old_value,
Atomic32 new_value) {
- ATOMICOPS_COMPILER_BARRIER();
- Atomic32 res = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
- ATOMICOPS_COMPILER_BARRIER();
- return res;
+ MemoryBarrier();
+ return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
}

inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) {
@@ -174,9 +171,133 @@ inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
return *ptr;
}

-} // namespace subtle
-} // namespace base
+#if defined(__LP64__)
+// 64-bit versions of the atomic ops.
+
+inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr,
+ Atomic64 old_value,
+ Atomic64 new_value) {
+ Atomic64 prev, tmp;
+ __asm__ __volatile__(".set push\n"
+ ".set noreorder\n"
+ "1:\n"
+ "lld %0, %5\n" // prev = *ptr
+ "bne %0, %3, 2f\n" // if (prev != old_value) goto 2
+ "move %2, %4\n" // tmp = new_value
+ "scd %2, %1\n" // *ptr = tmp (with atomic check)
+ "beqz %2, 1b\n" // start again on atomic error
+ "nop\n" // delay slot nop
+ "2:\n"
+ ".set pop\n"
+ : "=&r" (prev), "=m" (*ptr), "=&r" (tmp)
+ : "r" (old_value), "r" (new_value), "m" (*ptr)
+ : "memory");
+ return prev;
+}
+
+// Atomically store new_value into *ptr, returning the previous value held in
+// *ptr. This routine implies no memory barriers.
+inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr,
+ Atomic64 new_value) {
+ Atomic64 temp, old;
+ __asm__ __volatile__(".set push\n"
+ ".set noreorder\n"
+ "1:\n"
+ "lld %1, %4\n" // old = *ptr
+ "move %0, %3\n" // temp = new_value
+ "scd %0, %2\n" // *ptr = temp (with atomic check)
+ "beqz %0, 1b\n" // start again on atomic error
+ "nop\n" // delay slot nop
+ ".set pop\n"
+ : "=&r" (temp), "=&r" (old), "=m" (*ptr)
+ : "r" (new_value), "m" (*ptr)
+ : "memory");
+
+ return old;
+}
+
+// Atomically increment *ptr by "increment". Returns the new value of
+// *ptr with the increment applied. This routine implies no memory barriers.
+inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr,
+ Atomic64 increment) {
+ Atomic64 temp, temp2;
+
+ __asm__ __volatile__(".set push\n"
+ ".set noreorder\n"
+ "1:\n"
+ "lld %0, %4\n" // temp = *ptr
+ "daddu %1, %0, %3\n" // temp2 = temp + increment
+ "scd %1, %2\n" // *ptr = temp2 (with atomic check)
+ "beqz %1, 1b\n" // start again on atomic error
+ "daddu %1, %0, %3\n" // temp2 = temp + increment
+ ".set pop\n"
+ : "=&r" (temp), "=&r" (temp2), "=m" (*ptr)
+ : "Ir" (increment), "m" (*ptr)
+ : "memory");
+ // temp2 now holds the final value.
+ return temp2;
+}
+
+inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr,
+ Atomic64 increment) {
+ MemoryBarrier();
+ Atomic64 res = NoBarrier_AtomicIncrement(ptr, increment);
+ MemoryBarrier();
+ return res;
+}
+
+// "Acquire" operations
+// ensure that no later memory access can be reordered ahead of the operation.
+// "Release" operations ensure that no previous memory access can be reordered
+// after the operation. "Barrier" operations have both "Acquire" and "Release"
+// semantics. A MemoryBarrier() has "Barrier" semantics, but does no memory
+// access.
+inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr,
+ Atomic64 old_value,
+ Atomic64 new_value) {
+ Atomic64 res = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
+ MemoryBarrier();
+ return res;
+}
+
+inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr,
+ Atomic64 old_value,
+ Atomic64 new_value) {
+ MemoryBarrier();
+ return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
+}
+
+inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) {
+ *ptr = value;
+}
+
+inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) {
+ *ptr = value;
+ MemoryBarrier();
+}
+
+inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) {
+ MemoryBarrier();
+ *ptr = value;
+}
+
+inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) {
+ return *ptr;
+}
+
+inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) {
+ Atomic64 value = *ptr;
+ MemoryBarrier();
+ return value;
+}
+
+inline Atomic64 Release_Load(volatile const Atomic64* ptr) {
+ MemoryBarrier();
+ return *ptr;
+}
+#endif

-#undef ATOMICOPS_COMPILER_BARRIER
+} // namespace base::subtle
+} // namespace base

#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_MIPS_GCC_H_
diff --git a/comm-esr31/mozilla/ipc/chromium/src/base/port.h b/comm-esr31/mozilla/ipc/chromium/src/base/port.h
index 573f5f0..f30a74c 100644
--- a/comm-esr31/mozilla/ipc/chromium/src/base/port.h
+++ b/comm-esr31/mozilla/ipc/chromium/src/base/port.h
@@ -6,7 +6,7 @@
#define BASE_PORT_H_

#include <stdarg.h>
-#include "build/build_config.h"
+#include "../build/build_config.h"

#ifdef COMPILER_MSVC
#define GG_LONGLONG(x) x##I64
diff --git a/comm-esr31/mozilla/ipc/chromium/src/build/build_config.h b/comm-esr31/mozilla/ipc/chromium/src/build/build_config.h
index e3f4189..2648b1a 100644
--- a/comm-esr31/mozilla/ipc/chromium/src/build/build_config.h
+++ b/comm-esr31/mozilla/ipc/chromium/src/build/build_config.h
@@ -87,6 +87,9 @@
#elif defined(__sparc__)
#define ARCH_CPU_SPARC 1
#define ARCH_CPU_32_BITS 1
+#elif defined(__mips64) && defined(__LP64__)
+#define ARCH_CPU_MIPS 1
+#define ARCH_CPU_64_BITS 1
#elif defined(__mips__)
#define ARCH_CPU_MIPS 1
#define ARCH_CPU_32_BITS 1
@@ -106,7 +109,8 @@
#define ARCH_CPU_ALPHA 1
#define ARCH_CPU_64_BITS 1
#elif defined(__aarch64__)
-#define ARCH_CPU_AARCH64 1
+#define ARCH_CPU_ARM_FAMILY 1
+#define ARCH_CPU_ARM64 1
#define ARCH_CPU_64_BITS 1
#else
#error Please add support for your architecture in build/build_config.h
@@ -120,3 +124,4 @@
#endif

#endif // BUILD_BUILD_CONFIG_H_
+
diff --git a/comm-esr31/mozilla/media/libyuv/include/libyuv/row.h b/comm-esr31/mozilla/media/libyuv/include/libyuv/row.h
index 3e86f28..2436851 100644
--- a/comm-esr31/mozilla/media/libyuv/include/libyuv/row.h
+++ b/comm-esr31/mozilla/media/libyuv/include/libyuv/row.h
@@ -38,7 +38,8 @@ extern "C" {
var = 0

#if defined(__pnacl__) || defined(__CLR_VER) || defined(COVERAGE_ENABLED) || \
- defined(TARGET_IPHONE_SIMULATOR)
+ defined(TARGET_IPHONE_SIMULATOR) || \
+ (defined(_MSC_VER) && defined(__clang__))
#define LIBYUV_DISABLE_X86
#endif
// True if compiling for SSSE3 as a requirement.
@@ -329,7 +330,7 @@ extern "C" {
#endif

// The following are available on Mips platforms:
-#if !defined(LIBYUV_DISABLE_MIPS) && defined(__mips__)
+#if !defined(LIBYUV_DISABLE_MIPS) && defined(__mips__) && (_MIPS_SIM == _ABIO32)
#define HAS_COPYROW_MIPS
#if defined(__mips_dsp) && (__mips_dsp_rev >= 2)
#define HAS_I422TOABGRROW_MIPS_DSPR2
@@ -341,6 +342,10 @@ extern "C" {
#define HAS_SPLITUVROW_MIPS_DSPR2
#endif
#endif
+#if !defined(LIBYUV_DISABLE_MIPS) && defined(__mips__) && \
+ defined(_MIPS_ARCH_LOONGSON3A)
+#define HAS_YUY2TOYROW_MMI
+#endif

#if defined(_MSC_VER) && !defined(__CLR_VER)
#define SIMD_ALIGNED(var) __declspec(align(16)) var
@@ -1383,6 +1388,9 @@ void YUY2ToUV422Row_NEON(const uint8* src_yuy2,
void YUY2ToYRow_C(const uint8* src_yuy2, uint8* dst_y, int pix);
void YUY2ToUVRow_C(const uint8* src_yuy2, int stride_yuy2,
uint8* dst_u, uint8* dst_v, int pix);
+void YUY2ToYRow_MMI(const uint8* src_yuy2, uint8* dst_y, int pix);
+void YUY2ToUVRow_MMI(const uint8* src_yuy2, int stride_yuy2,
+ uint8* dst_u, uint8* dst_v, int pix);
void YUY2ToUV422Row_C(const uint8* src_yuy2,
uint8* dst_u, uint8* dst_v, int pix);
void YUY2ToYRow_Any_AVX2(const uint8* src_yuy2, uint8* dst_y, int pix);
diff --git a/comm-esr31/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_mips64.S b/comm-esr31/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_mips64.S
index ed897f1..eef34de 100644
--- a/comm-esr31/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_mips64.S
+++ b/comm-esr31/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_mips64.S
@@ -51,15 +51,15 @@ NESTED(_NS_InvokeByIndex, FRAMESZ, ra)

# assume full size of 16 bytes per param to be safe
sll v0, 4 # 16 bytes * num params
- subu sp, sp, v0 # make room
+ PTR_SUBU sp, sp, v0 # make room
move a0, sp # a0 - param stack address

# create temporary stack space to write int and fp regs
- subu sp, 64 # 64 = 8 regs of 8 bytes
+ PTR_SUBU sp, 64 # 64 = 8 regs of 8 bytes
move a3, sp

# save the old sp and save the arg stack
- subu sp, sp, 16
+ PTR_SUBU sp, sp, 16
REG_S t0, 0(sp)
REG_S a0, 8(sp)

@@ -78,12 +78,12 @@ NESTED(_NS_InvokeByIndex, FRAMESZ, ra)

# calculate the function we need to jump to,
# which must then be saved in t9
- lw t9, 0(a0)
- addu t9, t9, t1
- lw t9, (t9)
+ PTR_L t9, 0(a0)
+ PTR_ADDU t9, t9, t1
+ PTR_L t9, (t9)

# get register save area from invoke_copy_to_stack
- subu t1, t3, 64
+ PTR_SUBU t1, t3, 64

# a1..a7 and f13..f19 should now be set to what
# invoke_copy_to_stack told us. skip a0 and f12
diff --git a/comm-esr31/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_mips64.cpp b/comm-esr31/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_mips64.cpp
index 08b4616..e5876e2 100644
--- a/comm-esr31/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_mips64.cpp
+++ b/comm-esr31/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_mips64.cpp
@@ -7,8 +7,8 @@

#include "xptcprivate.h"

-#if (_MIPS_SIM != _ABIN32)
-#error "This code is for MIPS N32 only"
+#if (_MIPS_SIM != _ABIN32) && (_MIPS_SIM != _ABI64)
+#error "This code is for MIPS n32/n64 only"
#endif

extern "C" uint32_t
@@ -77,7 +77,9 @@ invoke_copy_to_stack(uint64_t* d, uint32_t paramCount,
break;
case nsXPTType::T_U32:
if (i < N_ARG_REGS)
- regs[i] = s->val.u32;
+ // 32-bit values need to be sign-extended
+ // in register, so use the signed value.
+ regs
这个问题已经解决了。Fedora21正在集成,下一版就发布。
有兴趣的朋友可以先手工试验一下,只需要在系统中生成以下3个文件,都是纯文本文件:

(1)/etc/xdg/autostart/touchpad-notify.desktop[code][Deskt... 显示全部 »
这个问题已经解决了。Fedora21正在集成,下一版就发布。
有兴趣的朋友可以先手工试验一下,只需要在系统中生成以下3个文件,都是纯文本文件:

(1)/etc/xdg/autostart/touchpad-notify.desktop[code][Desktop Entry]
Type=Application
Name=3A3000 Notebook Touchpad Control Tool
Name (2)/usr/lib/udev/rules.d/11-touchpad-notify.rules (3)/usr/bin/touchpad-notify[code]#!/bin/bash

# signal from /usr/lib/udev/rules.d/11-touchpad-notify.rules

trap 'sig_func 0; ' SIGUSR1
trap 'sig_func 1; ' SIGUSR2

#弹出通知
DELAY=3000
DEVICE="PS/2 Logitech Wheel Mouse"

function enable_touchpad()
{
echo "enable_touchpad $1 $DEVICE"
if [ $1 == "0" ]; then
xinput disable "${DEVICE}"
notify-send -t $DELAY "开始使用USB鼠标", "触摸板已经自动关闭"
else
xinput enable "${DEVICE}"
#notify-send -t $DELAY "触摸板已经恢复使用"
fi
}

function init_message()
{
echo "init_message"
count=`grep Handlers /proc/bus/input/devices | grep mouse | wc -l`

if

试验效果:




使用过程中有任何疑问,欢迎反馈!
loongnix

loongnix 回答了问题 • 2017-04-27 11:00 • 1 个回复 不感兴趣

龙芯上能使用手写输入法吗?

赞同来自:

调研了几种开源的手写输入法:

ibus-handwrite(底层使用zinnia):基本上不可用。“一”、“二”能识别,“四”怎么写也识别不出来。界面简陋,操作不方便。
现在开源手写输入法基本没有可用的。
估计还是需要国内手写输入法厂家在龙芯上适配才能解决。
调研了几种开源的手写输入法:

ibus-handwrite(底层使用zinnia):基本上不可用。“一”、“二”能识别,“四”怎么写也识别不出来。界面简陋,操作不方便。
现在开源手写输入法基本没有可用的。
估计还是需要国内手写输入法厂家在龙芯上适配才能解决。
loongnix

loongnix 回答了问题 • 2017-04-28 12:15 • 1 个回复 不感兴趣

龙芯loongnix系统下JAVAWS运行方法

赞同来自:

1. 安装最新的操作系统
Loongson Fedora Linux 21 remix(64位,2017.4.30)
http://www.loongnix.org/index.php/Loongnix

2. 安装最新的JDK
JDK8 64位(rc22) ... 显示全部 »
1. 安装最新的操作系统
Loongson Fedora Linux 21 remix(64位,2017.4.30)
http://www.loongnix.org/index.php/Loongnix

2. 安装最新的JDK
JDK8 64位(rc22)
3. 运行javaws
显示界面正常。
DaDou13

DaDou13 回答了问题 • 2017-04-29 23:26 • 4 个回复 不感兴趣

怎么才能体验loongnix

赞同来自:

loongnix是为龙芯处理器开发的系统,需要龙芯电脑。如果主机是x86的电脑,普通的虚拟机是不行的。
现在loongnix是基于fedora21开发的,默认mate桌面,接下来会替换到fedora25,想体验可以装fedora试用一下。其实linux系统除了... 显示全部 »
loongnix是为龙芯处理器开发的系统,需要龙芯电脑。如果主机是x86的电脑,普通的虚拟机是不行的。
现在loongnix是基于fedora21开发的,默认mate桌面,接下来会替换到fedora25,想体验可以装fedora试用一下。其实linux系统除了不同的桌面环境,基本上都大同小异。试用linux系统的时候,坚持只用linux平台上的开源软件,以后要是用loongnix,就能很快习惯了。
qtwebengine可以编译通过,并正常运行,会在后续版本进行集成
qtwebengine可以编译通过,并正常运行,会在后续版本进行集成
现在已经可以通过rsync同步了,同步方法是

rsync -azH --progress --delete --delay-updates  rsync://ftp.loongnix.org:/loongnix/os/loongnix/1.0/os/ ./
... 显示全部 »
现在已经可以通过rsync同步了,同步方法是

rsync -azH --progress --delete --delay-updates  rsync://ftp.loongnix.org:/loongnix/os/loongnix/1.0/os/ ./
 
该问题已经修正,更新下下面链接中的pmon,链接中其中包含更新方法。
https://pan.baidu.com/s/1hsNBk1Y





  
该问题已经修正,更新下下面链接中的pmon,链接中其中包含更新方法。
https://pan.baidu.com/s/1hsNBk1Y





  

(精品)(Docker系列之十一)龙芯平台kubernetes集群编译及部署方案

jiangxinshang 发表了文章 • 0 个评论 • 1311 次浏览 • 2017-12-25 11:06 • 来自相关话题

   一、环境 操作系统: loongnix 内核: 3.10.84 go版本: go1.9.2 linux/mips64le cfssl(1.2.0) etcd(3.2.12) ...查看全部
timg.jpg

 
 一、环境
操作系统: loongnix
内核: 3.10.84
go版本: go1.9.2 linux/mips64le
cfssl(1.2.0)
etcd(3.2.12)
flannel(0.9.1)
kubernetes(1.9.0)
需自定义go 的环境变量,这里设置的路径为/usr/share/gocode
export GOPATH=/usr/share/gocode

三台机器:
master:10.20.42.17
node:   10.20.42.22
node:   10.20.42.172
 
二、编译cfssl源代码
1.创建代码存放目录
mkdir -p $GOPATH/src/github.com/cloudflare
2.下载并编译源代码
go get -u github.com/cloudflare/cfssl/cmd/cfssl
3.切换至二进制文件生成目录并查看文件
ls $GOPATH/bin
 
三、编译etcd源代码
参考文章(龙芯公有云系列之一)搭建分布式存储服务etcd
链接地址:http://ask.loongnix.org/?/article/93

四、编译flannel源代码
1.创建代码存放目录
 mkdir -p $GOPATH/src/github.com/coreos
2.切换至该目录并下载源代码
cd $GOPATH/src/github.com/coreos
git clone https://github.com/coreos/flannel.git
3.打开flannel文件夹,执行编译过程
cd flannel/
go build
4.查看编译的二进制文件
ls flannel
 
五、编译kubernetes源代码
Kubernetes对golang版本的要求
Kubernetes    requires Go
1.0 - 1.2         1.4.2
1.3, 1.4          1.6
1.5, 1.6          1.7 - 1.7.5
1.7                 1.8.1
1.8                 1.8.3
1.9+               1.9.1
本文档编译的Kubernetes为当前最新版本1.9.0;golang版本为1.9.2
 
Fork
1.访问 https://github.com/kubernetes/kubernetes
2.点击右上角fork按钮,fork一份代码到你的github帐号,方便后续的开发。
 
Clone fork 到本地
working_dir=$GOPATH/src/k8s.io
user=xxxx #你的github账户名
mkdir -p $working_dir
cd $working_dir
git clone https://github.com/$user/kubernetes.git
# 或: git clone git@github.com:$user/kubernetes.git

cd $working_dir/kubernetes
git remote add upstream https://github.com/kubernetes/kubernetes.git
# 或: git remote add upstream git@github.com:kubernetes/kubernetes.git

# 永远不向upstream的master分支进行push操作:
git remote set-url --push upstream no_push

# 确认你的远程配置生效
git remote -v

    origin    https://github.com/bearabby/kubernetes.git (fetch)
    origin    https://github.com/bearabby/kubernetes.git (push)
    upstream    https://github.com/kubernetes/kubernetes.git (fetch)
    upstream    no_push (push)

创建本地分支
cd $working_dir/kubernetes
git fetch upstream
git checkout master
git rebase upstream/master

git checkout -b loongsonfeature
 
Build
cd $working_dir/kubernetes
make

报错信息不多,多为一些函数或变量未对mips64le平台进行支持。修改内容见0001-Build-on-mips64le.patch
注意内存剩余不足会导致编译出错:”signal: killed”,解决办法是通过增加交换分区。
 

六、搭建kubernetes集群
1.拷贝二进制文件至/root/local/bin文件夹下
mkdir -p /root/local/bin
cp  $GOPATH/bin/cfssl  /root/local/bin 
cp  /usr/bin  /root/local/bin
cp $GOPATH/src/k8s.io/kubernetes/_output/local/go/bin/*  /root/local/bin
2.设置环境变量
export PATH=/root/local/bin:$PATH
3.设置部署集群所需参数
cd /root    /local/bin
cat > environment.sh <<EOF 
#!/usr/bin/bash
# TLS Bootstrapping 使用的 Token,可以使用命令 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成
BOOTSTRAP_TOKEN="6c314aea8ff601079617b03df567e478"

# 最好使用 主机未用的网段 来定义服务网段和 Pod 网段
# 服务网段 (Service CIDR),部署前路由不可达,部署后集群内使用IP:Port可达
SERVICE_CIDR="10.254.0.0/16"

# POD 网段 (Cluster CIDR),部署前路由不可达,**部署后**路由可达(flanneld保证)
CLUSTER_CIDR="172.30.0.0/16"

# 服务端口范围 (NodePort Range)
export NODE_PORT_RANGE="8400-9000"

# etcd 集群服务地址列表
export ETCD_ENDPOINTS="https://10.20.42.17:2379,https://10.20.42.22:2379,https://10.20.42.172:2379"

# flanneld 网络配置前缀
export FLANNEL_ETCD_PREFIX="/kubernetes/network"

# kubernetes 服务 IP (一般是 SERVICE_CIDR 中第一个IP)
export CLUSTER_KUBERNETES_SVC_IP="10.254.0.1"

# 集群 DNS 服务 IP (从 SERVICE_CIDR 中预分配)
export CLUSTER_DNS_SVC_IP="10.254.0.2"

# 集群 DNS 域名
export CLUSTER_DNS_DOMAIN="cluster.local."
EOF
 
4.创建 CA 证书和秘钥
(1)创建 CA 配置文件
 cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "8760h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "8760h"
      }
    }
  }
}
EOF
参数说明:
ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
server auth:表示 client 可以用该 CA 对 server 提供的证书进行验证;
client auth:表示 server 可以用该 CA 对 client 提供的证书进行验证
(2)创建 CA 证书签名请求:
cat > ca-csr.json <<EOF
{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048创建 CA 证书和秘钥

  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF
参数说明:
"CN":Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
"O":Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);
(3)生成 CA 证书和私钥
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
(4)分发证书
拷贝证书到所有机器上(manager及node节点)
mkdir -p /etc/kubernetes/ssl
cp ca* /etc/kubernetes/ssl
 
5.部署高可用 etcd 集群
这三个节点复用 kubernetes master 机器,分别命名
etcd-host0:10.20.42.17
etcd-host1:10.20.42.22
etcd-host2:10.20.42.172
(1)设置etcd所需环境变量
export NODE_NAME=etcd-host0 # 当前部署的机器名称(随便定义,只要能区分不同机器即可)
export NODE_IP=10.20.42.17 # 当前部署的机器 IP
export NODE_IPS="10.20.42.17 10.20.42.22 10.20.42.172" # etcd 集群所有机器 IP
# etcd 集群间通信的IP和端口
export ETCD_NODES=etcd-host0=https://10.20.42.17:2380,etcd-host1=https://10.20.42.22:2380,etcd-host2=https://10.20.42.172:2380
# 导入用到的其它全局变量:ETCD_ENDPOINTS、FLANNEL_ETCD_PREFIX、CLUSTER_CIDR
source /root/local/bin/environment.sh
(2)创建 TLS 秘钥和证书
cat > etcd-csr.json <<EOF
{
  "CN": "etcd",
  "hosts": [
    "127.0.0.1",
    "${NODE_IP}"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF
参数说明:hosts 字段指定授权使用该证书的 etcd 节点 IP;
(3)生成 etcd 证书和私钥:
cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
  -ca-key=/etc/kubernetes/ssl/ca-key.pem \
  -config=/etc/kubernetes/ssl/ca-config.json \
  -profile=kubernetes etcd-csr.json | cfssljson -bare etcd
mkdir -p /etc/etcd/ssl
mv etcd*.pem /etc/etcd/ssl
(4)创建 etcd 的 systemd unit 文件
mkdir -p /var/lib/etcd  # 必须先创建工作目录
 cat > etcd.service <<EOF
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://github.com/coreos

[Service]
Environment=ETCD_UNSUPPORTED_ARCH=mips64le
Type=notify
WorkingDirectory=/var/lib/etcd/
ExecStart=/root/local/bin/etcd \\
  --name=${NODE_NAME} \\
  --cert-file=/etc/etcd/ssl/etcd.pem \\
  --key-file=/etc/etcd/ssl/etcd-key.pem \\
  --peer-cert-file=/etc/etcd/ssl/etcd.pem \\
  --peer-key-file=/etc/etcd/ssl/etcd-key.pem \\
  --trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\
  --peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\
  --initial-advertise-peer-urls=https://${NODE_IP}:2380 \\
  --listen-peer-urls=https://${NODE_IP}:2380 \\
  --listen-client-urls=https://${NODE_IP}:2379,http://127.0.0.1:2379 \\
  --advertise-client-urls=https://${NODE_IP}:2379 \\
  --initial-cluster-token=etcd-cluster-0 \\
  --initial-cluster=${ETCD_NODES} \\
  --initial-cluster-state=new \\
  --data-dir=/var/lib/etcd
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF
参数说明:
指定 etcd 的工作目录和数据目录为 /var/lib/etcd,需在启动服务前创建这个目录;
为了保证通信安全,需要指定 etcd 的公私钥(cert-file和key-file)、Peers 通信的公私钥和 CA 证书(peer-cert-file、peer-key-file、peer-trusted-ca-file)、客户端的CA证书(trusted-ca-file);
--initial-cluster-state 值为 new 时,--name 的参数值必须位于 --initial-cluster 列表中;
 
(5)启动etcd服务
mv etcd.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable etcd
systemctl start etcd
在所有的 etcd 节点重复上面的步骤,直到所有机器的 etcd 服务都已启动。
(6)验证服务
部署完 etcd 集群后,在任一 etcd 集群节点上执行如下命令
for ip in ${NODE_IPS}; do
  ETCDCTL_API=3 /root/local/bin/etcdctl \
  --endpoints=https://${ip}:2379  \
  --cacert=/etc/kubernetes/ssl/ca.pem \
  --cert=/etc/etcd/ssl/etcd.pem \
  --key=/etc/etcd/ssl/etcd-key.pem \
  endpoint health; done

预期结果:
https://10.20.42.17:2379 is healthy: successfully committed proposal: took = 1.246915ms
https://10.20.42.22:2379 is healthy: successfully committed proposal: took = 1.509229ms
https://10.20.42.172:2379 is healthy: successfully committed proposal: took = 1.519269ms
三台 etcd 的输出均为 healthy 时表示集群服务正常(忽略 warning 信息)。
 
6.部署 kubectl 命令行工具

kubectl 默认从 ~/.kube/config 配置文件获取访问 kube-apiserver 地址、证书、用户名等信息,如果没有配置该文件,执行命令时出错:
kubectl get pods
The connection to the server localhost:8080 was refused - did you specify the right host or port?
下面介绍配置 kubernetes 集群命令行工具 kubectl 的步骤。
需要将下载的 kubectl 二进制程序和生成的 ~/.kube/config 配置文件拷贝到所有使用 kubectl 命令的机器。
(1)部署 kubectl需要的变量
export MASTER_IP=10.64.3.7 
# 替换为 kubernetes master 集群任一机器 IP
export KUBE_APISERVER="https://${MASTER_IP}:6443"
说明:
变量 KUBE_APISERVER 指定 kubelet 访问的 kube-apiserver 的地址,后续被写入 ~/.kube/config 配置文件;
(2)创建 admin 证书
ubectl 与 kube-apiserver 的安全端口通信,需要为安全通信提供 TLS 证书和秘钥。
创建 admin 证书签名请求
cat > admin-csr.json <<EOF
{
  "CN": "admin",
  "hosts": ,
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}
EOF
参数说明:
后续 kube-apiserver 使用 RBAC 对客户端(如 kubelet、kube-proxy、Pod)请求进行授权;
kube-apiserver 预定义了一些 RBAC 使用的 RoleBindings,如 cluster-admin 将 Group system:masters 与 Role cluster-admin 绑定,该 Role 授予了调用kube-apiserver 所有 API的权限;
O 指定该证书的 Group 为 system:masters,kubelet 使用该证书访问 kube-apiserver 时 ,由于证书被 CA 签名,所以认证通过,同时由于证书用户组为经过预授权的 system:masters,所以被授予访问所有 API 的权限;
hosts 属性值为空列表
(3)生成 admin 证书和私钥:
cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
  -ca-key=/etc/kubernetes/ssl/ca-key.pem \
  -config=/etc/kubernetes/ssl/ca-config.json \
  -profile=kubernetes admin-csr.json | cfssljson -bare admin
mv admin*.pem /etc/kubernetes/ssl/
rm admin.csr admin-csr.json
(4)创建 kubectl kubeconfig 文件
# 设置集群参数
 kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER}
# 设置客户端认证参数
 kubectl config set-credentials admin \
  --client-certificate=/etc/kubernetes/ssl/admin.pem \
  --embed-certs=true \
  --client-key=/etc/kubernetes/ssl/admin-key.pem
 # 设置上下文参数
kubectl config set-context kubernetes \
  --cluster=kubernetes \
  --user=admin
 # 设置默认上下文
 kubectl config use-context kubernetes
参数说明:
admin.pem 证书 O 字段值为 system:masters,kube-apiserver 预定义的 RoleBinding cluster-admin 将 Group system:masters 与 Role cluster-admin 绑定,该 Role 授予了调用kube-apiserver 相关 API 的权限;
生成的 kubeconfig 被保存到 ~/.kube/config 文件;
(5)分发 kubeconfig 文件
将 ~/.kube/config 文件拷贝到运行 kubelet 命令的机器的 ~/.kube/ 目录下。
 
7.部署 Flannel 网络

(1)使用的变量
export NODE_IP=10.20.42.17 # 当前部署节点的 IP
# 导入用到的其它全局变量:ETCD_ENDPOINTS、FLANNEL_ETCD_PREFIX、CLUSTER_CIDR
 source /root/local/bin/environment.sh
(2)创建 TLS 秘钥和证书
  创建 flanneld 证书签名请求
cat > flanneld-csr.json <<EOF
{
  "CN": "flanneld",
  "hosts": ,
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF
参数说明:
hosts 字段为空;
生成 flanneld 证书和私钥
cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
  -ca-key=/etc/kubernetes/ssl/ca-key.pem \
  -config=/etc/kubernetes/ssl/ca-config.json \
  -profile=kubernetes flanneld-csr.json | cfssljson -bare flanneld
mkdir -p /etc/flanneld/ssl
mv flanneld*.pem /etc/flanneld/ssl
rm flanneld.csr  flanneld-csr.json
(3)向 etcd 写入集群 Pod 网段信息
/root/local/bin/etcdctl \
  --endpoints=${ETCD_ENDPOINTS} \
  --ca-file=/etc/kubernetes/ssl/ca.pem \
  --cert-file=/etc/flanneld/ssl/flanneld.pem \
  --key-file=/etc/flanneld/ssl/flanneld-key.pem \
  set ${FLANNEL_ETCD_PREFIX}/config '{"Network":"'${CLUSTER_CIDR}'", "SubnetLen": 24, "Backend": {"Type": "vxlan"}}'
参数说明:
flanneld 目前版本 (v0.7.1) 不支持 etcd v3,故使用 etcd v2 API 写入配置 key 和网段数据;
写入的 Pod 网段(${CLUSTER_CIDR},172.30.0.0/16) 必须与 kube-controller-manager 的 --cluster-cidr 选项值一致;
(4)创建 flanneld 的 systemd unit 文件
cat > flanneld.service << EOF
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service

[Service]
Type=notify
ExecStart=/root/local/bin/flannel \\
  -etcd-cafile=/etc/kubernetes/ssl/ca.pem \\
  -etcd-certfile=/etc/flanneld/ssl/flanneld.pem \\
  -etcd-keyfile=/etc/flanneld/ssl/flanneld-key.pem \\
  -etcd-endpoints=${ETCD_ENDPOINTS} \\
  -etcd-prefix=${FLANNEL_ETCD_PREFIX}
ExecStartPost=/root/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure

[Install]
WantedBy=multi-user.target
RequiredBy=docker.service
EOF
(5)启动 flanneld
 cp flanneld.service /etc/systemd/system/
 systemctl daemon-reload
 systemctl enable flanneld
 systemctl start flanneld
 
出现错误:
I1218 11:00:26.022231 11623 main.go:482] Using interface with name enp5s0 and address 10.20.42.17
I1218 11:00:26.022478 11623 main.go:499] Defaulting external address to interface address (10.20.42.17)
2017-12-18 11:00:26.027271 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
I1218 11:00:26.027501 11623 main.go:234] Created subnet manager: Etcd Local Manager with Previous Subnet: 0.0.0.0/0
I1218 11:00:26.027560 11623 main.go:237] Installing signal handlers
I1218 11:00:26.197651 11623 main.go:347] Found network config - Backend type: vxlan
I1218 11:00:26.197811 11623 vxlan.go:119] VXLAN config: VNI=1 Port=0 GBP=false DirectRouting=false
E1218 11:00:26.200720 11623 main.go:279] Error registering network: operation not supported
I1218 11:00:26.200802 11623 main.go:327] Stopping shutdownHandler...
提示内容:网络注册失败
经查找,原因为:当前loongnix系统内核版本为3.10,而vxlan的最低内核版本为3.14+,所以无法部署flannel,部署工作暂时中止
 
kubernetes源代码及编译后的二进制文件下载地址

《在龙芯上自己编写“壁纸切换器”》

renyafei 发表了文章 • 3 个评论 • 382 次浏览 • 2017-12-13 11:38 • 来自相关话题

为什么要在龙芯平台上编写"壁纸切换器"              因为在Linux上没有找到好的开源软件,例如360壁纸软件、PC机上的动态壁纸软件都没有再龙芯平台上更好的兼容。所以需要编写能在龙芯平台运行的“壁纸切换器”。开发语言:为什么 ...查看全部
  • 为什么要在龙芯平台上编写"壁纸切换器"
              因为在Linux上没有找到好的开源软件,例如360壁纸软件、PC机上的动态壁纸软件都没有再龙芯平台上更好的兼容。所以需要编写能在龙芯平台运行的“壁纸切换器”。
  • 开发语言:为什么要使用Python?
             Python语言的优点:免费、开源、可高层语言、可移植性、解释性、面向对象、可扩展性、丰富的库、规范的代码等,由于Python的开源本质和可移植性的特点,Python已经被移植在许多平台上,这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至还有PocketPC、Symbian以及Google基于linux开发的Android平台!所以Python程序无需修改就可以在上述任何平台上面运行!而且Python语言写的程序不需要编译成二进制代码,可以直接从源代码运行程序。
  • 程序架构
             配置文件:.wallpaper.conf 使用的是json的格式             为什么使用json?             JSON是一种轻量级的数据交换格式,它基于JavaScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。             读取图片文件:一是本机上存放的图片,二是络上的FTP存放的图片              读取本机上的主要任务是,根据配置文件中图片的目录,读取该目录下的所有图片名称,再根据目录加集合里的图片名称用dconf命令更改桌面背景图片,和修改锁定屏幕的背景图片读取FTP上的图片,首先要根据FTP上存放图片的路径,把图片读取到本机上,再根据本机上的目录,读取该目录下的所有图片名称,再根据目录加集合里的图片名称用dconf命令更改桌面背景图片,和修改锁定屏幕的背景图片。                         怎样更新壁纸:手动修改.wallpaper.conf配置文件后,进入终端以root用户执行  
    # python changeconfig.py
               命令,就会重新读取修改后的图片目录。            开机后执行壁纸切换:             向/etc/xdg/autostart/目录下,增加了wallpaper.desktop文件,那么Fedora21操作系统就会开机自启动壁纸切换。             定时运行:            根据配置文件制定的时间,利用sleep()函数来执行定时切换图片的功能。             更新配置:信号机制              在主程序中,我们首先使用signal.signal()函数来预设信号处理函数。等待信号,当信号SIGUSR1被传递给该进程时,进程从暂停中恢复,并根据预设,执行SIGTSTP的信号处理函数myHandler()。我们可以根据自己的需要更改myHandler()中的操作,以针对不同的信号实现个性化的处理。            后台程序,自动运行              在打开终端后,以root用户运行wallpaper-1.0.1.sh后,可以关闭终端,进程会在后台运行,会定时切换壁纸。
  • 网址
               本项目已经开放代码
   https://github.com/renyafei-loongson/wallpaper   
 
  • 总结

            龙芯已经具有自由开发应用的能力,龙芯应用生态必将蓬勃发展。


wallpaper.png


架构图.png


pintu.png


wall.png

 

3A3000开发板上构建发布版本的ISO, 约1600个包,需要多久时间?

wanghonghu 回复了问题 • 3 人关注 • 2 个回复 • 397 次浏览 • 2017-12-12 18:55 • 来自相关话题

portainer 1.14.3 移植

admin 发表了文章 • 0 个评论 • 256 次浏览 • 2017-12-12 15:21 • 来自相关话题

版本号:portainer:1.14.3 简介:Docker 的图形化管理工具,提供状态显示面板、应用模板快速部署、容器 镜像网络数据卷的基本操作、事件日志显示、容器控制台操作、Swarm 集群和服 务等集中管理和操作、登录用户管理和 ...查看全部
版本号:portainer:1.14.3

简介:Docker 的图形化管理工具,提供状态显示面板、应用模板快速部署、容器 镜像网络数据卷的基本操作、事件日志显示、容器控制台操作、Swarm 集群和服 务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足 中小型单位对容器管理的全部需求。

官网地址:git clone -b 1.14.3 https://github.com/portainer/portainer.git 源代码(修改之前)、(修改之后):

集成到 fc21 平台的镜像导出的 tar 包下载 :loongson-portainer.tar 编译文档: 参看 http://ask.loongnix.org/?/article/90

成品二进制: 已经集成到 fc21 平台
测试报告:无
使用说明:
下载 loongson-portainer.tar 包后( 见附件),打开终端,进入这个包所在的目录下: 终端输入命令,

# cat loongson-portainer.tar | docker import - loongson-portainer

# docker run -i -t --name portainer -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock loongson-portainer

打开浏览器,输入网址 http://localhost:9000
 

loongson2f_龙芯灵珑9S2A一体机尝试usb和硬盘两种方式安装debian6成功

linkasm 发表了文章 • 5 个评论 • 573 次浏览 • 2017-11-21 23:18 • 来自相关话题

我的龙芯一体机的配置是:cpu:loongson 2f,内存:换成了1G(注意,亲测,换成2G的内存无法安装) 龙芯debian6系统是下载至 www.anheng.com.cn/loongson/install/lynloong_2f_9003/ ...查看全部
我的龙芯一体机的配置是:cpu:loongson 2f,内存:换成了1G(注意,亲测,换成2G的内存无法安装)
龙芯debian6系统是下载至 www.anheng.com.cn/loongson/install/lynloong_2f_9003/
的   lynloong_debian6_install.tar.gz
将下载的 lynloong_debian6_install.tar.gz 文件解压得到三个文件,分别是:

boot.cfg  ,   install_lyn  ,   lynoong_debian6_20111226.tar.lzma 

安装时分两种情况,一种是usb方式安装,另外一种是硬盘方式安装
 
详细的过程我在 我的博客  http://blog.csdn.net/v80/article/details/78595967  有详细记录,有需要的

朋友可以参考参考,如果有朋友有关于9S2A一体机的更高版本的系统安装方法,或是其它发行版系统的安装方法,请发布出来让大家都看看

 

(精品)(龙芯公有云系列之一)搭建分布式存储服务etcd

renyafei 发表了文章 • 0 个评论 • 614 次浏览 • 2017-11-03 11:21 • 来自相关话题

etcd 是一个应用在分布式环境下的 key/value 存储服务。     由于Kubernetes要使用到etcd,所以第一步就 ...查看全部
etcd 是一个应用在分布式环境下的 key/value 存储服务。
 

timg.jpg

 

由于Kubernetes要使用到etcd,所以第一步就是进行etcd的搭建。
 
etcd是一个Go语言编写的软件。

 搭建环境
 
本文的实验都是在龙芯3A3000机器上。
操作系统是loongnix(Fedora21)20170512版本。
GO版本:go1.7.5 linux/mips64le
 
开始搭建
 
首先打开终端,配置GOPATH
# export GOPATH=/usr/lib/golang
进入GOPATH目录下
# cd $GOPATH
在$GOPATH的src目录下创建嵌套文件夹github.com/coreos
# mkdir -p $GOPATH/src/github.com/coreos
进入创建的文件夹下
# cd $GOPATH/src/github.com/coreos
下载etcd 2.3.6版本
# git clone  -b  v2.3.6 https://github.com/coreos/etcd.git


进入下载的etcd 文件夹下
# cd etcd
开始编译
# ./build
出现如下错误
github.com/coreos/etcd/Godeps/_workspace/src/github.com/boltdb/bolt
Godeps/_workspace/src/github.com/boltdb/bolt/db.go:98: undefined: maxMapSize
Godeps/_workspace/src/github.com/boltdb/bolt/db.go:98: invalid array bound maxMapSize
根据maxMapSize关键字找原因,使用grep "maxMapSize"  ./* -r 找出路径
# grep "maxMapSize" ./* -r
搜索出如下内容
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go:	data     *[maxMapSize]byte
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go: if size > maxMapSize {
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go: if sz > maxMapSize {
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go: sz = maxMapSize
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_windows.go: db.data = ((*[maxMapSize]byte)(unsafe.Pointer(addr)))
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_386.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_386.go:const maxMapSize = 0x7FFFFFFF // 2GB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_amd64.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_amd64.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_ppc64le.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_ppc64le.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_unix_solaris.go: db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0]))
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm64.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm64.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_s390x.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_s390x.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm.go:const maxMapSize = 0x7FFFFFFF // 2GB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_unix.go: db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0]))

 根据错误提示分析,是因为在 ./Godeps/_workspace/src/github.com/boltdb/bolt 文件夹下,
缺少了支持mips64le平台的文件。
进入这个目录下添加bolt_mips64le.go文件:
# cd ./Godeps/_workspace/src/github.com/boltdb/bolt
# cp bolt_arm.go bolt_mips64le.go
重新进入etcd文件夹下,开始编译
# cd $GOPATH/src/github.com/coreos/etcd
# ./build
出现如下错误
2017-11-02 11:58:50.257747 E | etcdmain: etcd on unsupported platform without ETCD_UNSUPPORTED_ARCH=mips64le set.
这是因为没有配置ETCD_UNSUPPORTED_ARCH环境变量
配置环境变量
# export ETCD_UNSUPPORTED_ARCH=mips64le
再次编译
# ./build
执行通过,在etcd文件夹里会生成bin文件夹,进入bin文件夹
# cd bin 
 
把bin文件夹下的etcd、etcdctl两个文件拷贝到/usr/bin文件夹下
# cp etcd  /usr/bin/ 
# cp etcdctl /usr/bin/


 进入/usr/bin下
# cd /usr/bin

 执行测试

 执行etcd文件
# ./etcd
2017-11-02 19:57:52.098590 W | etcdmain: running etcd on unsupported architecture "mips64le" since ETCD_UNSUPPORTED_ARCH is set
2017-11-02 19:57:52.099742 W | flags: unrecognized environment variable ETCD_UNSUPPORTED_ARCH=mips64le
2017-11-02 19:57:52.099870 I | etcdmain: etcd Version: 2.3.6
2017-11-02 19:57:52.099924 I | etcdmain: Git SHA: 128344c
2017-11-02 19:57:52.099974 I | etcdmain: Go Version: go1.7.5
2017-11-02 19:57:52.100021 I | etcdmain: Go OS/Arch: linux/mips64le
2017-11-02 19:57:52.100074 I | etcdmain: setting maximum number of CPUs to 4, total number of available CPUs is 4
2017-11-02 19:57:52.100145 W | etcdmain: no data-dir provided, using default data-dir ./default.etcd
2017-11-02 19:57:52.101051 I | etcdmain: listening for peers on http://localhost:2380
2017-11-02 19:57:52.101273 I | etcdmain: listening for peers on http://localhost:7001
2017-11-02 19:57:52.101483 I | etcdmain: listening for client requests on http://localhost:2379
2017-11-02 19:57:52.101683 I | etcdmain: listening for client requests on http://localhost:4001
2017-11-02 19:57:52.105386 I | etcdserver: name = default
2017-11-02 19:57:52.105674 I | etcdserver: data dir = default.etcd
2017-11-02 19:57:52.105741 I | etcdserver: member dir = default.etcd/member
2017-11-02 19:57:52.105794 I | etcdserver: heartbeat = 100ms
2017-11-02 19:57:52.105845 I | etcdserver: election = 1000ms
2017-11-02 19:57:52.105896 I | etcdserver: snapshot count = 10000
2017-11-02 19:57:52.105968 I | etcdserver: advertise client URLs = http://localhost:2379,http://localhost:4001
2017-11-02 19:57:52.106025 I | etcdserver: initial advertise peer URLs = http://localhost:2380,http://localhost:7001
2017-11-02 19:57:52.106204 I | etcdserver: initial cluster = default=http://localhost:2380,default=http://localhost:7001
2017-11-02 19:57:52.115937 I | etcdserver: starting member ce2a822cea30bfca in cluster 7e27652122e8b2ae
2017-11-02 19:57:52.116104 I | raft: ce2a822cea30bfca became follower at term 0
2017-11-02 19:57:52.116172 I | raft: newRaft ce2a822cea30bfca [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0]
2017-11-02 19:57:52.116223 I | raft: ce2a822cea30bfca became follower at term 1
2017-11-02 19:57:52.116829 I | etcdserver: starting server... [version: 2.3.6, cluster version: to_be_decided]
2017-11-02 19:57:52.118591 E | etcdmain: failed to notify systemd for readiness: No socket
2017-11-02 19:57:52.118642 E | etcdmain: forgot to set Type=notify in systemd service file?
2017-11-02 19:57:52.119456 N | etcdserver: added local member ce2a822cea30bfca [http://localhost:2380 http://localhost:7001] to cluster 7e27652122e8b2ae
2017-11-02 19:57:52.516914 I | raft: ce2a822cea30bfca is starting a new election at term 1
2017-11-02 19:57:52.517204 I | raft: ce2a822cea30bfca became candidate at term 2
2017-11-02 19:57:52.517241 I | raft: ce2a822cea30bfca received vote from ce2a822cea30bfca at term 2
2017-11-02 19:57:52.517327 I | raft: ce2a822cea30bfca became leader at term 2
2017-11-02 19:57:52.517369 I | raft: raft.node: ce2a822cea30bfca elected leader ce2a822cea30bfca at term 2
2017-11-02 19:57:52.518315 I | etcdserver: published {Name:default ClientURLs:[http://localhost:2379 http://localhost:4001]} to cluster 7e27652122e8b2ae
2017-11-02 19:57:52.518664 I | etcdserver: setting up the initial cluster version to 2.3
2017-11-02 19:57:52.525866 N | etcdserver: set the initial cluster version to 2.3

 再另一个终端中测试
# etcdctl set /foo/bar  “hello world”
输出“hello world”说明启动成功。
 
这样,etcd就搭建成功了,整个过程还是很简单的,改动的代码不算多,运行也比较顺利。
 
后面将继续移植Kubernetes,好期待啊!

loongnix的源码和二进制包可以通过rsync同步吗?

jiang_10000 回复了问题 • 2 人关注 • 2 个回复 • 615 次浏览 • 2017-11-27 08:47 • 来自相关话题

(精品)(Docker系列之十)搭建龙芯平台Docker Swarm集群

mangoooo 发表了文章 • 2 个评论 • 1023 次浏览 • 2017-10-16 17:57 • 来自相关话题

本教程将指导完成如下工作: 初始化一个Docker swarm集群;添加节点到swarm;部署swarm服务;管理swarm。 准备工作: 三台Linux系统的主机(可以是物理机、虚拟机或者docker容器,本文选择了三台龙 ...查看全部
本教程将指导完成如下工作:
  1. 初始化一个Docker swarm集群;
  2. 添加节点到swarm;
  3. 部署swarm服务;
  4. 管理swarm。

准备工作:
  1. 三台Linux系统的主机(可以是物理机、虚拟机或者docker容器,本文选择了三台龙芯3A3000+Loongnix(Fedora21-20170927));
  2. 每台主机安装Docker Engine且版本为1.12及以上;
  3. 其中一台主机作为管理节点,需知道其IP地址;
  4. 主机彼此之间开放下面几个端口:

  • TCP 端口2377用于集群管理通信,
  • TCP/UDP端口7946用于节点间通信,
  • UDP端口4789用于overlay网络通信。
         默认情况这些端口都是开放的,如果不确定可以执行下面的命令打开这3个端

iptables -A INPUT -p tcp --dport 2377 -j ACCEPTiptables -A INPUT -p tcp --dport 7946 -j ACCEPTiptables -A INPUT -p udp --dport 7946 -j ACCEPTiptables -A INPUT -p udp --dport 4789 -j ACCEPT

初始化一个Docker swarm集群首先确认各主机的Docker deamon已经启动:
Screenshot.png
如果服务状态不是active(running),执行命令service docker start来启动Docker deamon。接下来就可以正式开始了。1.选择一台主机作为管理节点(manager1),获取到主机IP为10.20.42.45。终端输入命令docker swarm init 初始化swarm。

[root@worker1 ~]# docker swarm init --advertise-addr 10.20.42.45Swarm initialized: current node (892ozqeoeh6fugx5iao3luduk) is now a manager. To add a worker to this swarm, run the following command:     docker swarm join \    --token SWMTKN-1-5vs5ndm8k5idcxeckprr61kg6a7h90dp3uihdhr3kwl1ejwtwg-58jqj86p1nqfh225t51p5h8lp \    10.20.42.45:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

 --advertise-addr 配置管理节点的广播地址为10.20.42.45,其他的节点要想加入集群需要能够访问该地址。输出信息显示了其他节点分别作为管理节点和工作节点加入该集群的方法。2.输入命令docker info查看当前状态的swarm信息,截取部分关键信息如下:

[root@worker1 ~]# docker infoContainers: 10 Running: 0 Paused: 0 Stopped: 10Images: 22Server Version: 1.12.2... ...Swarm: active NodeID: 250tj9l3mnrrtprdd0990b2t3 Is Manager: true ClusterID: atrevada8k0amn83zdiig6qkb Managers: 1 Nodes: 1 Orchestration:  Task History Retention Limit: 5... ...

 3.输入命令docker node ls查看节点信息:

[root@localhost loongson]# docker node lsID                                      HOSTNAME      STATUS    AVAILABILITY    MANAGER STATUS250tj9l3mnrrtprdd0990b2t3 *  manager1        Ready        Active              Leader

*表示你连接到的节点ID。添加两个节点到swarm另外选择一台主机作为工作节点(worker1),第三台主机也作为工作节点(worker2)。1.worker1上打开终端。上文我们在创建swarm时,输出提示信息展示了如何作为工作节点加入swarm:

[root@worker1 ~]# docker swarm join /--token SWMTKN-1-5vs5ndm8k5idcxeckprr61kg6a7h90dp3uihdhr3kwl1ejwtwg-58jqj86p1nqfh225t51p5h8lp /10.20.42.45:2377This node joined a swarm as a worker.

如果你丢失了上面命令的信息,可以在manager1上执行docker swarm join-token worker重新获取。2.worker2上重复worker1的步骤,作为工作节点加入swarm。3.回到管理节点mgnager1,输入命令docker node ls查看swarm内所有节点状态:

[root@manager1 ~]# docker node lsID                                          HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS250tj9l3mnrrtprdd0990b2t3 *   manager1   Ready     Active             Leadera24i9nu2943niy8eq239bbpwv  worker1      Ready     Active         e0lh6c2zb57qg8db7usvg17r6    worker2     Ready     Active         

*显示本机连接到的节点,MANAGERSTATUS一栏为Leader表示该节点为管理节点,空表示为工作节点。 部署一个服务到swarm为了更直观的观察集群的服务编排,我们在管理节点启动portainer,其中swarm visualizer模块能直观地看到每个节点的服务详情。portainer 下载:

[root@manager1 ~]# docker pull jiangxinshang/portainer

启动portainer(9000端口不要被其他应用占用):

[root@manager1 ~]# docker run -t -i -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock docker.io/jiangxinshang/portainer2017/10/13 07:55:28 Starting Portainer 1.14.3 on :9000

浏览器输出127.0.0.1:9000就能看到集群图示了,下图为服务部署之前的情况: 
Screenshot-Portainer_-_Mozilla_Firefox.png
1.manager1上打开终端,输入命令:

[root@manager1 ~]# docker service create  --replicas 1 --name hello 10.20.42.45:5000/fedora /bin/bash -c "ping loongnix.org"an85njt7e5dadfpwcfyr21sfs

docker service create命令是创建服务--name 将该服务命名为hello-- replicas 规定了该服务的期望状态为一个运行示例参数10.20.42.45:5000/fedora /bin/bash -c "ping loongnix.org"定义了服务是用镜像10.20.42.45:5000/fedora(三台主机节点上必须有同一个pull下来的镜像)创建一个容器,并在容器内执行/bin/bash -c "ping loongnix.org"。2.执行如下命令,可以查看当前服务状态:

[root@manager1 ~]# docker service lsID                NAME   REPLICAS  IMAGE                                       COMMANDan85njt7e5da  hello    1/1   10.20.42.45:5000/fedora  /bin/bash -c ping loongnix.org

3. 查看该服务信息

[root@manager1 ~]# docker service ps helloID                                          NAME         IMAGE            NODE     DESIRED STATE  CURRENT STATE      ERRORcwk9d8b67n20lmglhbz7jewne  hello.1  10.20.42.45:5000/fedora  worker2  Running        Running 5 minutes ago  

当前状态是服务运行在worker2上,但也可能运行在worker1或者manager1上,因为管理节点同时作为工作节点也会运行服务。在下面的步骤中你会看到更详细的演示。在swarm visualizer上观察当前三个节点的服务。
Screenshot-Portainer_-_Mozilla_Firefox-6.png
 查看服务的详细信息1.登录manager1,终端执行命令docker service inspect --pretty <SERVICE-ID>,能查看该服务可读性良好的格式化输出:

[root@manager1 ~]# docker service inspect --pretty helloID:        an85njt7e5dadfpwcfyr21sfsName:        helloMode:        Replicated Replicas:    1Placement:UpdateConfig: Parallelism:    1 On failure:    pauseContainerSpec: Image:        10.20.42.45:5000/fedora Args:        /bin/bash -c ping loongnix.orgResources:

2. 如果把--pretty去掉,看到的则是json形式的格式化输出:

[root@manager1 ~]# docker service inspect hello[    {        "ID": "an85njt7e5dadfpwcfyr21sfs",        "Version": {            "Index": 230        },        "CreatedAt": "2017-10-13T02:14:33.706598Z",        "UpdatedAt": "2017-10-13T02:14:33.706598Z",        "Spec": {            "Name": "hello",            "TaskTemplate": {                "ContainerSpec": {                    "Image": "10.20.42.45:5000/fedora",                    "Args": [                        "/bin/bash",                        "-c",                        "ping",                        "loongnix.org"                    ]                },                "Resources": {                    "Limits": {},                    "Reservations": {}                },                "RestartPolicy": {                    "Condition": "any",                    "MaxAttempts": 0                },                "Placement": {}            },            "Mode": {                "Replicated": {                    "Replicas": 1                }            },            "UpdateConfig": {                "Parallelism": 1,                "FailureAction": "pause"            },            "EndpointSpec": {                "Mode": "vip"            }        },        "Endpoint": {            "Spec": {}        },        "UpdateStatus": {            "StartedAt": "0001-01-01T00:00:00Z",            "CompletedAt": "0001-01-01T00:00:00Z"        }    }]

 伸缩服务1.manager1上执行命令docker service scale <SERVICE-ID>=<NUMBER-OF-TASKA>可修改当前运行任务的个数,例如:

[root@manager1 ~]# docker service scale hello=5hello scaled to 5

 2. 通过命令查看当前运行任务个数,REPLICAS变为了5/5。

[root@manager1 ~]# docker service lsID                    NAME   REPLICAS  IMAGE                                     COMMANDan85njt7e5da  hello    5/5    10.20.42.45:5000/fedora   /bin/bash -c ping loongnix.org

3.查看hello服务在各节点分配情况:

[root@manager1 ~]# docker service ps helloID                                              NAME       IMAGE                      NODE         DESIRED STATE     CURRENT STATE                   ERRORcwk9d8b67n20lmglhbz7jewne  hello.1  10.20.42.45:5000/fedora  worker2   Running        Running 7 minutes ago            9wyodmvvf77ucbums23ortuj0  hello.2  10.20.42.45:5000/fedora  worker1   Running        Running 41 seconds ago           19ev4tcj0be2t1xbdkf7evp4f  hello.3  10.20.42.45:5000/fedora  manager1  Running        Running 44 seconds ago           1tm1tc2r8xdgdry2hu0pjilmy  hello.4  10.20.42.45:5000/fedora  manager1  Running        Running less than a second ago   cfqh34h9e6jv7l0iiwau8jhsf  hello.5  10.20.42.45:5000/fedora  worker2   Running        Running less than a second ago   

 通过swarm visualizer查看服务直观图示: 
Screenshot-Portainer_-_Mozilla_Firefox-8.png
swarm会负载均衡地编排服务在各节点的运行。4. 在manager1节点上我们也可以观察到对应的两个容器信息:

[root@manager1 ~]# docker ps  CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                    NAMES2f6be7870988        10.20.42.45:5000/fedora:latest   "/bin/bash -c 'ping l"   5 minutes ago       Up 5 minutes                                 hello.4.1tm1tc2r8xdgdry2hu0pjilmya2da3bb3c4f0        10.20.42.45:5000/fedora:latest   "/bin/bash -c 'ping l"   5 minutes ago       Up 5 minutes                                 hello.3.19ev4tcj0be2t1xbdkf7evp4f

 worker1上通过命令观察到一个对应容器信息:

[root@worker1 ~]# docker psCONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS               NAMES954af2601ac2        10.20.42.45:5000/fedora:latest   "/bin/bash -c 'ping l"   6 minutes ago       Up 6 minutes                            hello.2.9wyodmvvf77ucbums23ortuj0

worker2 略。删除运行的服务1.在管理节点manager1上,删除服务通过命令dockr service rm <SERVICE-ID>实现:

[root@manager1 ~]# docker service rm hellohello

2. 管理节点再查看该服务信息会报错:

[root@manager1 ~]# docker service ps helloError: No such service: hello

3.工作节点查看容器也关闭了

[root@worker1 ~]# docker ps  CONTAINER ID      IMAGE       COMMAND      CREATED      STATUS       PORTS       NAMES

 滚动更新服务在这个环节我们部署一个服务来创建基于fedora:21.0镜像的容器,然后演示滚动更新服务,升级镜像容器到fedora:21.1。1.首先在manager1节点部署服务,并配置swarm的更新间隔时间为10秒:

[root@manager1 ~]# docker service create --replicas 5 --name fedora --update-delay 10s fedora:21.0 ping loongnix.orgdes35b3cu097uelo8n8zv5gez

我们在部署服务时指定滚动更新策略。--update-delay 表示更新服务的一个任务或一组任务之间的时间间隔。时间间隔用数字和单位组成,m 表示分,h 表示时,例如10m30s表示指定了10分30秒的间隔。默认情况下,调度器一次更新一个任务。也可以通过参数 --update-parallelism 配置调度器每次同时更新的最大任务数量。默认情况下,若更新一个任务返回了RUNNING状态,调度器会转去更新下一个,直到所有任务都更新完成;若更新一个任务返回了FAILED,调度器则暂停更新。我们可以在执行docker service create 命令或 docker service update 命令时使用 --update-failure-action 参数来指定更新返回失败之后的行为。2. 查看集群内各节点的服务编排:
Screenshot-5.png
 3.开始更新fedora镜像,swarm管理器将依据update的配置测略实施更新:

[root@manager1 ~]# docker service update --image fedora:21.1 fedorafedora

调度器按照如下步骤实现滚动更新:
  • 停止第一个任务
  • 为已停止的任务调度更新
  • 为已更新的任务开启容器
  • 如果一个任务的更新结果返回RUNNING,等待指定的时间间隔后开始更新下一个任务;如果更新一个任务的任意阶段返回了FAILED,中止更新任务。
4.通过portainer能看到服务的实时更新情况: 
Screenshot-6.png
Screenshot-7.png
Screenshot-8.png
Screenshot-9.png
Screenshot-10.png
 5.输入命令docker service ps <SERVICE-ID>观察滚动更新:

[root@manager1 ~]# docker service ps fedoraID                         NAME          IMAGE        NODE      DESIRED STATE  CURRENT STATE           ERROR6t6p5r9ujrsq0e1kf3k0yta6n  fedora.1      fedora:21.1  worker1   Running        Running 8 minutes ago    2vctv5ay741c7z6vlx2kqdwje   \_ fedora.1  fedora:21.0  worker2   Shutdown       Shutdown 8 minutes ago   8vrfziykhn7ar7b7zyhxlsarr  fedora.2      fedora:21.1  manager1  Running        Running 6 minutes ago    cy0zvhqawk1j9g0jb112sq482   \_ fedora.2  fedora:21.0  worker1   Shutdown       Shutdown 6 minutes ago   0yojbjr1omf46qycc2c6at4b7  fedora.3      fedora:21.1  worker2   Running        Running 7 minutes ago    cisqv46430hy7p3kj5xaefgd8   \_ fedora.3  fedora:21.0  manager1  Shutdown       Shutdown 7 minutes ago   17ailb36wdeg4zvkl9mytoxhu  fedora.4      fedora:21.1  manager1  Running        Running 6 minutes ago    cvpl0svmlyj1ozdb6r0eiovts   \_ fedora.4  fedora:21.0  manager1  Shutdown       Shutdown 6 minutes ago   4lt4ax7ezyqid6ndk89ksngc5  fedora.5      fedora:21.1  worker2   Running        Running 7 minutes ago    8sbzju1llogo7d6s9t4h0e1ia   \_ fedora.5  fedora:21.0  worker2   Shutdown       Shutdown 7 minutes ago   

 输出显示全部任务已经更新完毕。 下线某个节点在前面所有的步骤中,所有节点都是运行状态且可用性为ACTIVE。swarm管理器会向ACTIVE状态的节点分配任务,目前为止各节点都能接收任务。有时,像计划中的维护时段,需要将一个节点可用性设置为DRAIN。DRAIN的节点不能从swarm管理器接收任务。管理器会将DRAIN节点的任务停止掉,分发给其他ACTIVE的节点。1.开始之前,先确认集群内各节点状态都是ACTIVE:

[root@manager1 ~]# docker node lsID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS250tj9l3mnrrtprdd0990b2t3 *  manager1  Ready   Active        Leadera24i9nu2943niy8eq239bbpwv    worker1   Ready   Active         e0lh6c2zb57qg8db7usvg17r6    worker2   Ready   Active         

2.重新执行之前的服务部署,将任务个数设为3,保证每个节点都被分发有任务:

[root@manager1 ~]# docker service create --replicas 3 --name helloagain 10.20.42.45:5000/fedora /bin/bash -c "ping loongnix.org"0rxfbv9fwrs0fv06hfnp8j5je[root@manager1 ~]# docker service ps helloagainID                         NAME          IMAGE                    NODE      DESIRED STATE  CURRENT STATE            ERROR8xszceewi2dj9xhbce53rkq1a  helloagain.1  10.20.42.45:5000/fedora  worker1   Running        Preparing 6 seconds ago   6mwhdnseq3wkkxbc3dmxhwoey  helloagain.2  10.20.42.45:5000/fedora  worker2   Running        Running 1 seconds ago     395a7pk7e4vby3jd1sihv0gic  helloagain.3  10.20.42.45:5000/fedora  manager1  Running        Running 5 seconds ago   

3.执行命令docker node update --availability drain <NODE-ID>将一个存在任务的节点下线:

[root@manager1 ~]# docker node update --availability drain worker1worker1

4.查看下线节点的详细信息,其中Availability显示为Drain:

[root@manager1 ~]# docker node inspect --pretty worker1ID:            a24i9nu2943niy8eq239bbpwvHostname:        worker1Joined at:        2017-10-13 01:16:01.272489 +0000 utcStatus: State:            Ready Availability:        DrainPlatform: Operating System:    linux Architecture:        mips64Resources: CPUs:            4 Memory:        7.598 GiBPlugins:  Network:        bridge, host, null, overlay  Volume:        localEngine Version:        1.12.2

5.查看该服务当前的编排情况:

[root@manager1 ~]# docker service ps helloagainID                         NAME              IMAGE                    NODE      DESIRED STATE  CURRENT STATE           ERRORe6mh01ekb4dcpnnu3yez7qqdx  helloagain.1      10.20.42.45:5000/fedora  worker2   Running        Running 4 minutes ago    8xszceewi2dj9xhbce53rkq1a   \_ helloagain.1  10.20.42.45:5000/fedora  worker1   Shutdown       Shutdown 4 minutes ago   6mwhdnseq3wkkxbc3dmxhwoey  helloagain.2      10.20.42.45:5000/fedora  worker2   Running        Running 10 minutes ago   395a7pk7e4vby3jd1sihv0gic  helloagain.3      10.20.42.45:5000/fedora  manager1  Running        Running 10 minutes ago  

Screenshot-Portainer_-_Mozilla_Firefox-9.png
worker1节点的任务已经关闭,被分发到了worker2上。6.重新将worker1的Availability从DRAIN改回为ACTIVE,再观察:

[root@manager1 ~]# docker node update --availability active worker1worker1[root@manager1 ~]# docker node inspect --pretty worker1ID:            a24i9nu2943niy8eq239bbpwvHostname:        worker1Joined at:        2017-10-13 01:16:01.272489 +0000 utcStatus: State:            Ready Availability:        ActivePlatform: Operating System:    linux Architecture:        mips64Resources: CPUs:            4 Memory:        7.598 GiBPlugins:  Network:        bridge, host, null, overlay  Volume:        localEngine Version:        1.12.2[root@manager1 ~]# docker service ps helloagainID                         NAME              IMAGE                    NODE      DESIRED STATE  CURRENT STATE           ERRORe6mh01ekb4dcpnnu3yez7qqdx  helloagain.1      10.20.42.45:5000/fedora  worker2   Running        Running 8 minutes ago    8xszceewi2dj9xhbce53rkq1a   \_ helloagain.1  10.20.42.45:5000/fedora  worker1   Shutdown       Shutdown 8 minutes ago   6mwhdnseq3wkkxbc3dmxhwoey  helloagain.2      10.20.42.45:5000/fedora  worker2   Running        Running 13 minutes ago   395a7pk7e4vby3jd1sihv0gic  helloagain.3      10.20.42.45:5000/fedora  manager1  Running        Running 13 minutes ago  

可以看到,worker1的Availability状态变回Active,状态为Ready。因为当前没有任务变化还暂时没有被分配任务。一个可用性为Active的节点可以在以下情况接收新的任务:
  • 当伸缩一个服务时
  • 当任务滚动更新时
  • 当其他某个节点被设为Drain时
  • 当某个任务在其他 Active 节点上启动失败时

(精品)(Docker系列之九)龙芯Fedora21平台portainer部署方案

jiangxinshang 发表了文章 • 8 个评论 • 887 次浏览 • 2017-10-15 22:38 • 来自相关话题

一、下载portainer官方镜像   1.在loongnix上下载镜像[root@loongson ~]# docker pull docker.io/portainer/portainer:1.14.3 Using default ...查看全部
一、下载portainer官方镜像
  1.在loongnix上下载镜像
[root@loongson ~]# docker pull docker.io/portainer/portainer:1.14.3
Using default tag: 1.14.3
Trying to pull repository docker.io/portainer/portainer ...
unauthorized: authentication required
  2.根据控制台反馈结果unauthorized: authentication required,提示无权限,因为该镜像不支持       mips64el,所以无法下载镜像到本地,可使用X86机器进行下载该镜像
[root@X86 ~]# docker pull docker.io/portainer/portainer:1.14.3
  3.提示下载成功,查看本地镜像
[root@X86 ~]# docker images
REPOSITORY TAG IMAGE ID
docker.io/portainer/portainer 1.14.3 457fb8fa57b0
  4.确认本地镜像docker.io/portainer/portainer已存在,运行该镜像
[root@X86 ~]# docker run -i -t docker.io/portainer/portainer:1.14.3


  5.使用Docker export命令导出当前镜像创建的容器为tar包
[root@X86 ~]# docker export 36ceef361070 > loongson-portainer.tar
  6.将loongson-portainer.tar包拷贝到loongson机器上,这里使用scp命令进行拷贝
[root@X86 ~]# scp loongson-portainer.tar root@10.20.42.19:/root/portainer/
  7.在loongnix机器上解压loongson-portainer.tar
[root@loongson portainer]# tar xf loongson-portainer.tar
  8.经分析,需要重新编译的二进制文件为portainer
[root@loongson portainer]# file portainer 
portainer: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped


    接下来,从github下载portainer源代码,重新编译portainer
二、从github下载portainer源代码
  1.设置GO语言参数—GOPATH
export GOPATH=/usr/share/gocode
  2.使用go get 从github中下载源代码
[root@loongson portainer]# go get github.com/portainer/portainer

package github.com/portainer/portainer: no buildable Go source files in /usr/share/gocode/src/github.com/portainer/portainer



    这里出现了错误提示,但是没有关系,go get 命令相当于先下载,再安装两个步骤,上面的提示是安装失败,我们需要的是源代码,因此可以忽略此提示
3.打开源代码所在文件夹
[root@loongson portainer]# cd $GOPATH/src/github.com/portainer/portainer
  4.因为只需要编译源代码中的api部分所以将此文件夹下的其他内容全部删除
[root@loongson portainer]# rm -rf app assets bower.json build build.sh codefresh.yml CODE_OF_CONDUCT.md CONTRIBUTING.md gruntfile.js index.html LICENSE package.json README.md test vendor.yml distribution
  5.因为go语言文件中的的目录的相对路径和源代码中的相对路径不同,所以需要对源代码的相对路径做调整
[root@loongson portainer]# cp -rf api/* $GOPATH/src/github.com/portainer/portainer
  6.删除源代码中的api文件夹
[root@loongson portainer]# rm -rf api/
三、编译portainer源代码
  1.打开main.go所在目录
[root@loongson portainer]# cd $GOPATH/src/github.com/portainer/portainer/cmd/portainer
  2.执行go build 命令,开始进行代码编译
[root@loongson portainer]# go build main.go 
../../../../../gopkg.in/alecthomas/kingpin.v2/usage.go:10:2: cannot find package "github.com/alecthomas/template" in any of:
/usr/lib/golang/src/github.com/alecthomas/template (from $GOROOT)


  3.根据提示需要加载github.com/alecthomas/template
[root@loongson portainer]# go get github.com/alecthomas/template
  4.再次执行go build 命令,开始进行代码编译
[root@loongson portainer]# go build main.go 
../../../../../gopkg.in/alecthomas/kingpin.v2/parsers.go:9:2: cannot find package "github.com/alecthomas/units" in any of:
/usr/lib/golang/src/github.com/alecthomas/units (from $GOROOT)
/usr/share/gocode/src/github.com/alecthomas/units (from $GOPATH)


  5.根据提示需要加载github.com/alecthomas/units
[root@loongson portainer]# go get github.com/alecthomas/units
  6.再次执行go build 命令,开始进行代码编译
[root@loongson portainer]# go build main.go 
../../http/handler/auth.go:11:2: cannot find package "github.com/asaskevich/govalidator" in any of:
/usr/lib/golang/src/github.com/asaskevich/govalidator (from $GOROOT)
/usr/share/gocode/src/github.com/asaskevich/govalidator (from $GOPATH)


  7.根据提示需要加载github.com/asaskevich/govalidator
[root@loongson portainer]# go get github.com/asaskevich/govalidator
  8.再次执行go build 命令,开始进行代码编译
[root@loongson  portainer]# go build main.go 
../../bolt/datastore.go:8:2: cannot find package "github.com/boltdb/bolt" in any of:
/usr/lib/golang/src/github.com/boltdb/bolt (from $GOROOT)
/usr/share/gocode/src/github.com/boltdb/bolt (from $GOPATH)


  9.根据提示需要加载github.com/boltdb/bolt
[root@loongson  portainer]# go get github.com/boltdb/bolt
# github.com/boltdb/bolt
../../../../boltdb/bolt/db.go:101: undefined: maxMapSize
../../../../boltdb/bolt/db.go:101: invalid array bound maxMapSize


  10.根据提示缺少变量maxMapSize,那么接下来创建变量,首先打开boltdb所在目录
[root@loongson  portainer]# cd $GOPATH/src/github.com/boltdb/bolt
  11.创建适用于mips64el平台的bolt
[root@loongson  bolt]# cp bolt_amd64.go bolt_mips64el.go
  12.打开main.go所在目录
[root@loongson bolt]# cd $GOPATH/src/github.com/portainer/portainer/cmd/portainer/
  13.再次执行go build 编译文件
[root@loongson portainer]# go build main.go 
../../jwt/jwt.go:9:2: cannot find package "github.com/dgrijalva/jwt-go" in any of:
/usr/lib/golang/src/github.com/dgrijalva/jwt-go (from $GOROOT)
/usr/share/gocode/src/github.com/dgrijalva/jwt-go (from $GOPATH)


  14.根据提示需要加载github.com/dgrijalva/jwt-go
[root@loongson portainer]# go get github.com/dgrijalva/jwt-go
  15.再次执行go build 命令,开始进行代码编译
[root@loongson portainer]# go build main.go 
../../http/handler/auth.go:12:2: cannot find package "github.com/gorilla/mux" in any of:
/usr/lib/golang/src/github.com/gorilla/mux (from $GOROOT)
/usr/share/gocode/src/github.com/gorilla/mux (from $GOPATH)


  16.根据提示需要加载github.com/gorilla/mux
[root@loongson portainer]# go get github.com/gorilla/mux
  17.再次执行go build 命令,开始进行代码编译
[root@loongson portainer]# go build main.go 
../../jwt/jwt.go:10:2: cannot find package "github.com/gorilla/securecookie" in any of:
/usr/lib/golang/src/github.com/gorilla/securecookie (from $GOROOT)
/usr/share/gocode/src/github.com/gorilla/securecookie (from $GOPATH)









  18.根据提示需要加载github.com/gorilla/securecookie
[root@loongson portainer]# go get github.com/gorilla/securecookie
  19.再次执行go build 命令,开始进行代码编译
[root@loongson portainer]# go build main.go 
../../http/proxy/manager.go:7:2: cannot find package "github.com/orcaman/concurrent-map" in any of:
/usr/lib/golang/src/github.com/orcaman/concurrent-map (from $GOROOT)
/usr/share/gocode/src/github.com/orcaman/concurrent-map (from $GOPATH)









  20.根据提示需要加载github.com/orcaman/concurrent-map
[root@loongson portainer]# go get github.com/orcaman/concurrent-map
  21.再次执行go build 命令,开始进行代码编译
[root@loongson portainer]# go build main.go 
../../cron/watcher.go:5:2: cannot find package "github.com/robfig/cron" in any of:
/usr/lib/golang/src/github.com/robfig/cron (from $GOROOT)
/usr/share/gocode/src/github.com/robfig/cron (from $GOPATH)









  22.根据提示需要加载github.com/robfig/cron
[root@loongson portainer]# go get github.com/robfig/cron
  23.再次执行go build 命令,开始进行代码编译
[root@loongson portainer]# go build main.go 
../../crypto/crypto.go:4:2: cannot find package "golang.org/x/crypto/bcrypt" in any of:
/usr/lib/golang/src/golang.org/x/crypto/bcrypt (from $GOROOT)
/usr/share/gocode/src/golang.org/x/crypto/bcrypt (from $GOPATH)
../../http/handler/websocket.go:21:2: cannot find package "golang.org/x/net/websocket" in any of:
/usr/lib/golang/src/golang.org/x/net/websocket (from $GOROOT)
/usr/share/gocode/src/golang.org/x/net/websocket (from $GOPATH)









  24.根据提示需要加载golang.org/x/crypto/bcrypt和golang.org/x/net/websocket
  注意:$GOPATH的路径已经不再是/usr/share/gocode/src/github.com/...
       而是/usr/share/gocode/src/golang.org/x/...
       所以需要先创建文件夹
[root@loongson portainer]# mkdir -p $GOPATH/src/golang.org/x/
  25.切换至该文件夹下
[root@loongson portainer]# cd $GOPATH/src/golang.org/x/
  26.加载golang.org/x/crypto/bcrypt
[root@loongson x]# git clone https://github.com/golang/crypto.git
27.加载golang.org/x/net/websocket
[root@loongson x]# git clone https://github.com/golang/net.git
28.切换至main.go所在目录
[root@loongson x]# cd $GOPATH/src/github.com/portainer/portainer/cmd/portainer/
  29.再次执行go build 命令,开始进行代码编译
[root@loongson portainer]# go build main.go
  30.编译完成,当前目录生成文件名为main的二进制可执行文件,下面需要拷贝到loongson-portainer.tar 解压目录,替换掉二进制文件portainer
 
四、loongson-portainer.tar二进制文件替换
  1.修改编译完成后二进制文件的文件名
[root@loongson portainer]# mv main portainer
  2.拷贝loongson-portainer.tar 解压目录,替换掉二进制文件portainer
[root@loongson portainer]# cp -f portainer /root/portainer/
  3.切换至loongson-portainer.tar 解压目录
[root@loongson portainer]# cd /root/portainer/
  4.运行二进制文件portainer
[root@loongson portainer]# ./portainer
  5.打开浏览器,输入网址http://localhost:9000
1.png

  6.切换至loongson-portainer.tar 解压目录的上级目录
[root@loongson portainer]# cd /root/
  7.压缩整个portainer文件夹
[root@loongson ~]# tar -cvf portainer.tar portainer/
五、制作portainer镜像
  1.在loongnix上下载fedora21-tools基础镜像
[root@loongson ~]# docker pull docker.io/huangxg20171010/feodra21-tools
REPOSITORY TAG
docker.io/huangxg20171010/fedora21-tools latest









  2.运行feodra21-tools基础镜像
[root@loongson ~]# docker run -i -t docker.io/huangxg20171010/fedora21-tools
  3.基础镜像运行成功后,会自动进入镜像控制台,由[root@loongson ~]变成[root@1cb98e167e49 /],说明容器创建成功,下面切换目录至root下
[root@1cb98e167e49 /]# cd /root/
  4.将第四节第7步压缩的portainer.tar拷贝到当前容器的root目录下
[root@1cb98e167e49 ~]# scp root@10.20.42.48:/root/portainer.tar /root/
  5.将portainer.tar解压到当前目录
[root@1cb98e167e49 ~]# tar xvf portainer.tar
  6.删除压缩文件portainer.tar
[root@1cb98e167e49 ~]# rm -f portainer.tar
  7.切换至portainer目录下
[root@1cb98e167e49 ~]# cd /root/portainer
  8.创建执行文件run-portainer.sh
[root@1cb98e167e49 ~]# vi /root/portainer/run-portainer.sh
  9.run-portainer.sh文件内容如下
#!/bin/bash
export LC_ALL=zh_CN.UTF-8
export LANG=zh_CN.UTF-8
cd /root/portainer
./portainer









  10.修改run-portainer.sh文件权限
[root@1cb98e167e49 ~]#chmod +x /root/portainer/run-portainer.sh
  11.创建portainer所需文件夹
[root@1cb98e167e49 ~]#mkdir -p /data/tls
  12.退出当前容器
[root@1cb98e167e49 ~]# exit
  13.展示所有已创建容器
[root@loongson /]# docker ps -a
CONTAINER IMAGE
1cb.... docker.io/huangxg20171010/fedora21-tools









  14.使用Docker commit生成一个新镜像
[root@loongson /]# docker commit --change='CMD ["/root/portainer/run-portainer.sh"]' 1cb98e167e49 portainer









  15.查看制作的新镜像
[root@loongson /]# docker images
REPOSITORY TAG IMAGE ID CREATED
portainer latest 085a675a35d7 12 seconds ago









六、上传portainer镜像
  1.申请docker hub 帐号
    打开 docker hub官网:https://hub.docker.com 进行注册
 

2.png

  2.邮件激活后登录docker hub 点击 Create --> Create repository 创建一个仓库

3.png

  3.本机登录Docker hub帐号
[root@loongson /]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: jiangxinshang
Password:
Login Succeeded









  4.将本机已经存在的镜像名称做格式化,保证和仓库名称:jiangxinshang/portainer 一致,操作如下:
[root@loongson /]# docker tag portainer:latest jiangxinshang/portainer
  5.使用 docker push 将镜像上传至hub上,操作如下:
[root@loongson /]# docker push jiangxinshang/portainer
The push refers to a repository [docker.io/jiangxinshang/portainer]
572868387250: Pushed









  6.查看所上传镜像
[root@loongson /]# docker search jiangxinshang/portainer
  
4.png

 
七、下载并运行portainer镜像
  1.下载portainer镜像
[root@loongson /]# docker pull jiangxinshang/portainer
  2.查看已下载镜像
[root@loongson /]# docker images
REPOSITORY TAG
docker.io/jiangxinshang/portainer latest









  3.运行该镜像
[root@loongson /]# docker run -i -t --name portainer -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock docker.io/jiangxinshang/portainer
  4.打开浏览器,输入网址http://localhost:9000

5.png

==================================================================================
 X86版本的portainer官方镜像docker.io/portainer/portainer 已更新版本,可通过docker pull portainer/portainer:1.14.3来获取镜像,portainer的github源代码请下载版本v1.14.3
                                                                                                           文章更新日期:2017年10月24日

(精品)(Docker系列之八)Fedora21部署Docker registry

mangoooo 发表了文章 • 3 个评论 • 557 次浏览 • 2017-10-11 16:59 • 来自相关话题

1. Docker registry简介 Docker registry作为一个镜像仓库,主要功能是通过网络存储和分发Docker镜像。 在本文中,Docker registry的编译结果是生成一个Docker镜像,可以方便的提供给管理 ...查看全部
1. Docker registry简介
Docker registry作为一个镜像仓库,主要功能是通过网络存储和分发Docker镜像。
在本文中,Docker registry的编译结果是生成一个Docker镜像,可以方便的提供给管理员直接部署使用。

2. 谁需要部署Docker registry?
通常情况下,Docker用户会从Docker公有仓库(hub.docker.com)进行镜像的发行,即开发者提交镜像、使用者拉取镜像,对应于docker的命令push、pull。对于部分用户来说,只需要使用公有仓库上的镜像就完全能够满足需求了,但是很多情况下是不够的,比如用户自己开发的应用、不想公开代码到公有仓库,或者是公司开发的、面向特定用户的镜像,就需要维护一个私有仓库;或者对于一些项目,在开发、测试和持续整合阶段,也需要一个本地镜像仓库。

3. Docker registry部署过程
实验环境:3A3000+Loongnix(Fedora21-20170726);
准备条件:本机已经安装好Docker Engine平台,并且制作好一个 fedora21-base 镜像,
具体过程请参照http://ask.loongnix.org/?/article/81 。

3.1 下载源码
# git clone git://github.com/docker/docker-registry.git

若本机没有安装git命令,请首先执行yum install git。

3.2 编译registry镜像
编译命令如下:
# cd docker-registry
# docker build -t fedora-registry:1 .

上面的命令中,fedora-registry:1为要编译成的镜像名称及tag号。
由于官方的docker-registry是适配X86平台,基础镜像也是X86平台的Ubuntu,因此直接在龙芯上进行编译会出现各种错误。
所以需要对源代码进行修改,按照下面各节的方法进行解决。

3.2.1 默认编译平台为x86_64,修改为mips64el
# cd docker-registry
# grep x86_64 . -r
 
能找到4个文件,需要修改如下3个:
contrib/golang_impl/fixtures/index/images/e0acc43660ac918e0cd7f21f1020ee3078fec7b2c14006603bbc21499799e7d5/json
contrib/golang_impl/fixtures/index/images/0e03f25112cd513ade7c194109217b9381835ac2298bd0ffb61d28fbe47081a8/json
tests/data/511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158/json

将文件中”"architecture":"x86_64"”修改为“"architecture":"mips64el"”。

3.2.2 修改Dockerfile
 问题类型和修改思路:
● 官方代码的Dockerfile中,基础镜像的名称是Ubuntu ,需要改成龙芯镜像的名称,fedora21-base:21(tag号若不是latest,则必须写明);
● docker-registry镜像的制作,需要编译源代码,依赖很多其它软件。这些软件在默认Ubuntu软件源是都能够提供的,但是Loongnix的yum源并不一定都提供。如果Loongnix的yum源没有提供,需要找替代的软件包,比如另一个相同功能、但是名称不同的软件包。如果仍然找不到合适软件包,可以尝试暂时去掉,绕过这个软件包,先保证编译成功。如果在编译或者运行时发现还是存在依赖问题,再回头找到依赖软件包的源代码进行编译以解决问题。
下面我们对修改前的Dockerfile文件进行逐条指令分析。

Step 1:


# Latest Ubuntu LTS
FROM ubuntu:14.04


默认依赖镜像从dockerhub获取Ubuntu,我们制作的镜像依赖于龙芯平台的fedora21-base,需要修改为


# Latest Loongnix
FROM fedora21-base:21


如果你遇到如下报错,那就需要检查你的基础镜像是否能够成功获取。
Trying to pull repository docker.io/library/fedora21-base ...  
Pulling repository docker.io/library/fedora21-base
Network timed out while trying to connect to
https://index.docker.io/v1/repositories/library/fedora21-base/images.
You may want to check your internet connection or if you are behind a proxy

Step 2:


# Update
RUN apt-get update \
# Install pip
    && apt-get install -y \
        swig \
        python-pip \
# Install deps for backports.lzma (python2 requires it)
        python-dev \
        python-mysqldb \
        python-rsa \
        libssl-dev \
        liblzma-dev \
        libevent1-dev \
    && rm -rf /var/lib/apt/lists/*


这条命令比较长,意思是在基础镜像上,进行软件升级以及对registry所依赖却不包含在基础镜像的软件进行下载。
首先Fedora属RedHat系列,常用安装包为rpm包,常见包管理方式为yum,那么apt-get就应该替换为yum。
另外我们在本地对loongnix yum源进行yum search发现python-mysqldb、libssl-dev和liblzma-dev没有找到,暂且先注释掉;而python-dev和libevent1-dev在loongnix yum源中命名为python-devel和libevent-devel,修改好。
这一步的主要错误都是找不到软件包,按照上述修改步骤就不会报该种错误。在后面的其他步骤会出现缺少软件包或缺少头文件的错误,我们再返回来修改step 2。

Step 3, 4:


COPY . /docker-registry
COPY ./config/boto.cfg  /etc/boto.cfg


拷贝命令。

Step 5:


# Install core
RUN pip install /docker-registry/depends/docker-registry-core


安装registry core。这步会暴露出下面的错误:
unable to execute 'gcc': No such file or directory
error: command 'gcc' failed with exit status 1
->这是因为基础镜像缺少gcc,需要在Step 2中的RUN命令行中添加gcc软件包;
Downloading/unpacking boto==2.34.0 (from docker-registry-core==2.0.3)
Cannot fetch index base URL https://pypi.python.org/simple/
Could not find any downloads that satisfy the requirement boto==2.34.0 (from docker-registry-core==2.0.3)
Cleaning up...
No distributions at all found for boto==2.34.0 (from docker-registry-core==2.0.3)
Storing debug log for failure in /root/.pip/pip.log
The command '/bin/sh -c pip install /docker-registry/depends/docker-registry-core' returned a non-zero code: 1
->国外服务器连接不上,这个情况时有发生,最好的解决办法就是修改软件源到国内服务器。解决办法为在docker-registry源码中添加pip配置文件pip.conf,拷贝到镜像中。代码如下:


[global]
 
index-url=http://pypi.douban.com/simple/



Step 6:


# Install registry
RUN pip install file:///docker-registry#egg=docker-registry[bugsnag,newrelic,cors]


安装registry。这步会出现如下错误:
backports/lzma/_lzmamodule.c:115:18: fatal error: lzma.h: No such file or directory

->这个是缺少软件包liblzma,不安装不可行。loongnix源没有liblzma,在yum search lzma结果中搜索头文件为”lzma.h”的软件包,发现xz-devel,Step 2 中install xz_devel后该错误解决;
Running setup.py install for M2Crypto
building 'M2Crypto.__m2crypto' extension
swigging SWIG/_m2crypto.i to SWIG/_m2crypto_wrap.c
swig -python -I/usr/include/python2.7 -I/usr/include -I/usr/include/openssl -includeall -modern -D__x86_64__ -o SWIG/_m2crypto_wrap.c SWIG/_m2crypto.i
SWIG/_m2crypto.i:30: Error: Unable to find 'openssl/opensslv.h'
SWIG/_m2crypto.i:33: Error: Unable to find 'openssl/safestack.h'
SWIG/_evp.i:12: Error: Unable to find 'openssl/opensslconf.h'
SWIG/_ec.i:7: Error: Unable to find 'openssl/opensslconf.h'
error: command 'swig' failed with exit status 1

 -> pip install的m2crypto是x86_64架构的,这里需要修改源码,不使用pip命令对该软件进行下载:requirements/main.txt中删除行M2Crypto==0.22.3,然后Dockerfile在Step 2添加mips64el架构的软件包:install m2crypto。

Step 7:


RUN patch \
 $(python -c 'import boto; import os; print os.path.dirname(boto.__file__)')/connection.py \
 < /docker-registry/contrib/boto_header_patch.diff


这步是打补丁,出现如下错误:
/bin/sh: patch: command not found
->缺少patch命令,说明依赖镜像中不包含该命令软件包。同理,Step 2中install patch。

Step 8, 9, 10, 11:


ENV DOCKER_REGISTRY_CONFIG /docker-registry/config/config_sample.yml
ENV SETTINGS_FLAVOR dev
 
EXPOSE 5000
 
CMD ["docker-registry"]


ENV 配置registry镜像的环境变量。
EXPOSE 指定容器映射到宿主机的端口号为5000。
CMD 指定运行容器时的操作指令。

3.2.3 修改完成的Dockerfile
至此Dockerfile修改完成,代码如下:


# Latest Loongnix
FROM fedora21-base:21
 
# Update
RUN yum update \
# Install pip
    && yum install -y \
        swig \
        python-pip \
        gcc \            
        patch \    
        m2crypto \
# Install deps for backports.lzma (python2 requires it)
        python-devel \
        #python-mysqldb \
        python-rsa \
        #libssl-dev \
        xz-devel \
        libevent-devel \
    && rm -rf /var/lib/apt/lists/*
 
COPY . /docker-registry
COPY ./config/boto.cfg /etc/boto.cfg
 
# Install core
RUN pip install /docker-registry/depends/docker-registry-core
 
# Install registry
RUN pip install
file:///docker-registry#egg=docker-registry[bugsnag,newrelic,cors]
 
RUN patch \
 $(python -c 'import boto; import os; print os.path.dirname(boto.__file__)')/ connection.py \
 < /docker-registry/contrib/boto_header_patch.diff
 
ENV DOCKER_REGISTRY_CONFIG /docker-registry/config/config_sample.yml
ENV SETTINGS_FLAVOR dev  
 
EXPOSE 5000
 
CMD ["docker-registry"]



3.2.4 编译通过
使用前面修改后的Dockerfile,再次进行编译,
# docker build -t fedora-registry:1 .
编译成功后会有提示:Successfully built 46b2003cb477(IMAGE ID)。
为了确认镜像生成的结果,输入命令docker images能看到生成的镜像:
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest 46b2003cb477 2 minutes ago 589.2 MB

3.3 run registry
# docker run -d -p 5000:5000 fedora-registry:1

Screenshot-5.png


-p参数将容器5000端口号与宿主机5000端口号进行映射,-d后台运行该容器。docker ps查看容器是否启动成功,其标志是“STATUS”为“Up”:
 
3.4 push镜像进行验证
搭建好registry服务器之后,就可以使用另外一台机器作为客户端,向服务器进行push、pull操作。
在客户端上,执行下面命令,提交一个新的镜像:
# docker tag fedora21-base:21 10.20.42.45:5000/fedora:latest
# docker push 10.20.42.45:5000/fedora

10.20.42.45:5000为registry服务器的IP和映射后的端口号。
有可能在push过程中出现的下面的错误:
# docker push 10.20.42.45:5000/fedora
The push refers to a repository [10.20.42.45:5000/fedora]
Get https://10.20.42.45:5000/v1/_ping: EOF

此时需要修改客户端上的docker配置文件 /etc/sysconfig/docker


OPTIONS='--selinux-enabled --insecure-registry 10.20.42.45:5000'


这步之后重启docker服务,重新执行步骤3.4(如果客户端就是宿主机重新执行3.3)再push镜像。
push成功显示如下:
 
Screenshot-1.png


浏览器输入如下网址能看到push成功的镜像:

Screenshot.png


3.5 pull镜像进行验证
在客户端进行pull验证,如果客户端上已经有要拉取的同名镜像,要先执行docker rmi命令把镜像删除之后再进行拉取。
#docker pull 10.20.42.45:5000/fedora-registry

pull结果参考下图能看到10.20.42.45:5000/fedora:latest。
 
Screenshot-6.png


并能正确运行该容器:
 
Screenshot-8.png


4.总 结
部署docker registry一定要明确每一步的意义是什么,比如我们为什么需要移植registry而不是直接pull一个registry镜像就能建立这个私有仓库?编译docker镜像必须理解Dockerfile的语法,明确每一条指令的意义,才能更好的理解编译报错的根本原因以及如何解决。

龙芯电脑能玩什么游戏

回复

中国原创 回复了问题 • 3 人关注 • 4 个回复 • 222 次浏览 • 2018-11-02 00:11 • 来自相关话题

loongnix的升级计划是怎样的

回复

wanghonghu 回复了问题 • 2 人关注 • 2 个回复 • 213 次浏览 • 2018-11-01 10:40 • 来自相关话题

qemu 2.7.0 版本模拟龙芯3a芯片,运行龙芯系统出现段错误,请问是什么问题

回复

DaDou13 回复了问题 • 2 人关注 • 1 个回复 • 140 次浏览 • 2018-10-28 21:04 • 来自相关话题

请问有没有qemu上模拟运行龙芯系统的相关文档或者实验过程之类的资料

回复

DaDou13 回复了问题 • 4 人关注 • 4 个回复 • 162 次浏览 • 2018-10-28 21:03 • 来自相关话题

qemu 2.7.0版本的 loongson3a处理器 跑 linux内核

回复

DaDou13 回复了问题 • 3 人关注 • 2 个回复 • 151 次浏览 • 2018-10-28 20:48 • 来自相关话题

请问有没有 使用 qemu-system-mips64el 跑龙芯系统内核的教程

回复

lvruihua111 发起了问题 • 1 人关注 • 0 个回复 • 63 次浏览 • 2018-10-23 18:27 • 来自相关话题

不同的app播放1080P视频时的CPU占用率

回复

DaDou13 回复了问题 • 4 人关注 • 3 个回复 • 197 次浏览 • 2018-10-21 20:49 • 来自相关话题

真搞不懂loongnix为什么不基于Debian来开发

回复

DaDou13 回复了问题 • 7 人关注 • 7 个回复 • 303 次浏览 • 2018-10-21 20:43 • 来自相关话题

loongnix qtcreator没法生成调试版程序

回复

libresoft 发起了问题 • 1 人关注 • 0 个回复 • 66 次浏览 • 2018-10-12 19:42 • 来自相关话题

fedora 29 for mips64r2el 的 rpm

jiangtao9999 发表了文章 • 0 个评论 • 219 次浏览 • 2018-11-02 22:41 • 来自相关话题

https://pan.baidu.com/s/1UnUzZFIEwh43doIOQQyibg   里面的 rpms-20181102 就是这些 rpm 的压缩包。 这是基于 fedora 29 的 devel 版本编译的。 ...查看全部
https://pan.baidu.com/s/1UnUzZFIEwh43doIOQQyibg
 
里面的 rpms-20181102 就是这些 rpm 的压缩包。
这是基于 fedora 29 的 devel 版本编译的。
我会用这些 rpm 尝试编译正式版的 fedora 29 。
里面的 java ,版本号 fc29.1 的是龙芯的 mips64el 版,没有这个 .1 的,是 fedora 自己的版本,加上 debian 的 zero 补丁编译出来的 zero 版,也就是完全架构无关无优化的版本。
里面的内核是 4.14 的,因为我没找到能用的 4.18 版,所以只好先用这个替代。(话说 loongnix 的网站还吹 kernel.org 的源代码能跑龙芯呢吧?实际上不能了啊。)
但是 fedora 29 的 firewalld (好像是这个)已经开始依赖 4.18 版了。
其实我曾经编译过 4.18 版的内核,但是不能启动,还引起了 mock 的工作不正常,好像是 libseccomp 没办法正确转换 4.14 和 4.18 的调用。所以只好去掉了。
 
希望龙芯能发布 4.18+ 的内核源代码,能启动的。不要抱着老版本了。尤其是 4.20 提升了 fuse 的性能,这很关键的。其实 4.18 就已经开始增加 fuse 的性能了。这对于龙芯肯定需要的 ntfs-3g 还是很有意义的。另外,内核 4.17 开始可以用 zfsonlinux 的内核模块版了吧?这东西也很好啊。龙芯做服务器,可以先从对 CPU 的需求不高的数据服务器开始啊。
 
欢迎大家用这个系统继续编译,不过编译 rpm 需要禁用 debugsource 的 rpm 生成。我看生成的脚本,似乎是调用 debugedit 输出文件这里失败,导致文件为空。我已经发了另外一个问题,也希望大家帮忙解决。
另外,哪位如果有服务器可以提供 http ,帮忙放个 repo 吧。
谢谢了。

推荐一个龙芯平台的百度网盘客户端解决方案

DaDou13 发表了文章 • 1 个评论 • 167 次浏览 • 2018-09-25 00:20 • 来自相关话题

BaiduPCS-Go,用Go语言编写的百度网盘命令行客户端 项目地址:https://github.com/iikira/BaiduPCS-Go 在releases里下载编译好的版本就好了,龙芯电脑可以下载“linux-mips64l ...查看全部
BaiduPCS-Go,用Go语言编写的百度网盘命令行客户端
项目地址:https://github.com/iikira/BaiduPCS-Go
在releases里下载编译好的版本就好了,龙芯电脑可以下载“linux-mips64le”的版本。
下载好直接运行程序就行,实测loongnix系统能正常使用,且下载速度不受限制。

FC28 for loongson

water 发表了文章 • 24 个评论 • 428 次浏览 • 2018-09-18 10:09 • 来自相关话题

链接: https://pan.baidu.com/s/1zH7hvH-C48XkNtEk08XSYA 密码: bsiv
链接: https://pan.baidu.com/s/1zH7hvH-C48XkNtEk08XSYA 密码: bsiv

龙芯灵珑9S2A一体机debian5 debian6设置官方源成功

linkasm 发表了文章 • 1 个评论 • 219 次浏览 • 2018-08-19 14:50 • 来自相关话题

有灵珑一体机共创系统的朋友们,如果还没有设置过debian官方源的,无法在线解决依赖问题的 可以参考我的博客 《龙芯灵珑9S2A一体机debian5 debian6设置官方源成功》 网址是:https://blog.csdn.net/v ...查看全部
有灵珑一体机共创系统的朋友们,如果还没有设置过debian官方源的,无法在线解决依赖问题的
可以参考我的博客 《龙芯灵珑9S2A一体机debian5 debian6设置官方源成功》
网址是:https://blog.csdn.net/v80
 

龙芯8089A笔记本2g硬盘空间增加32g的sd卡后利用lvm分区安装debian8

linkasm 发表了文章 • 0 个评论 • 152 次浏览 • 2018-08-18 09:38 • 来自相关话题

有龙芯8089a笔记本的朋友们,我想,肯定还有好多人是没有更换硬盘的,2g的硬盘,使用很不方便。 我现在利用lvm逻辑卷管理分区的方式,重新安装了debian8系统,感觉效果还是可以的。 现在将安装的过程记录了下来备忘,有需要的朋友请访 ...查看全部
有龙芯8089a笔记本的朋友们,我想,肯定还有好多人是没有更换硬盘的,2g的硬盘,使用很不方便。
我现在利用lvm逻辑卷管理分区的方式,重新安装了debian8系统,感觉效果还是可以的。
现在将安装的过程记录了下来备忘,有需要的朋友请访问我的博客,耐心的看看,参考参考。
博客名: 《龙芯8089A扩容硬盘安装debian8(sd卡扩容)》
网址: https://blog.csdn.net/v80

高仿Swing QQ

rogertong 发表了文章 • 0 个评论 • 235 次浏览 • 2018-07-10 21:02 • 来自相关话题

客户端 服务端 https://github.com/xcr1234/socketqq
Screenshot-60.png

客户端
Screenshot-31.png

服务端
Screenshot-63.png

https://github.com/xcr1234/socketqq

Kotlin/Native支持MIPS

rogertong 发表了文章 • 0 个评论 • 393 次浏览 • 2018-06-07 12:39 • 来自相关话题

Kotlin/Native currently supports the following platforms: Linux (x86_64, arm32, MIPS, MIPS little endian) https://kotl ...查看全部
Kotlin/Native currently supports the following platforms:
Linux (x86_64, arm32, MIPS, MIPS little endian)
https://kotlinlang.org/docs/reference/native-overview.html

以下截图是kotlin/JVM
Screenshot-58.png

Screenshot-59.png


 

web项目大功告成

rogertong 发表了文章 • 2 个评论 • 347 次浏览 • 2018-06-04 16:10 • 来自相关话题

chrome效果更好 ...查看全部
Screenshot-5.png


Screenshot-6.png


Screenshot-54.png


chrome效果更好
Screenshot-25.png


Screenshot-23.png


Screenshot-22.png


Screenshot-24.png



 

最近编译的 fc28 的 rpm (20180530)

jiangtao9999 发表了文章 • 2 个评论 • 286 次浏览 • 2018-06-03 18:13 • 来自相关话题

https://pan.baidu.com/s/1759gaxGV92BSLFhPwTabfg   里面有两个文件夹,应该都是 fc28 的。 区别就是 new 里面只有最新版的 rpm,old 是旧版本挪过去的。 ...查看全部
https://pan.baidu.com/s/1759gaxGV92BSLFhPwTabfg
 
里面有两个文件夹,应该都是 fc28 的。
区别就是 new 里面只有最新版的 rpm,old 是旧版本挪过去的。
如何把旧版本包挪走,可以看:https://serverfault.com/questions/327960/best-way-to-clean-up-yum-repository 
肯定有 bug ,所以请勿用于生产环境,出了问题别喷我。
图形界面还有能否启动的,我都没测试,仅仅是 mock 编译出来的。
 
这次没有 rootfs ,懒得做了。
依赖不全的,用 fc28 的 x86 仓库(noarch 都可以这么用),或者用我之前编译的 fc27 的 rpm 吧。
fedora 的更新速度太快,我只有一个 3A3000 编译速度跟不上。有些东西只能偷懒了。
 
求个财主能提供个编译服务器集群用。
当然最好还是能让 fedora 把 mips 架构变成 Primary Architectures 。

人机大战五子棋

rogertong 发表了文章 • 2 个评论 • 271 次浏览 • 2018-05-30 11:16 • 来自相关话题

在龙芯电脑上跑这套AI算法,反应速度瞬时 很赞
在龙芯电脑上跑这套AI算法,反应速度瞬时 很赞

Screenshot-53.png

Screenshot-54.png

Screenshot-7.png

https://github.com/xcr1234/chess