作者: gemcjz

  • smartos教程二:与 Linux 不同点总结

    在SmartOS用户中最常见的问题之一就是,既然说SmartOS和Linux类似,那除了那些看不见的技术细节,在使用时到底有什么不同呢?如果已经熟练操作Linux,那SmartOS能快速上手么?答案是当然能,其实常用的不同之处并不多。这篇文章将回答Linux与SmartOS在操作上的不同之处。

    SmartMachine和其他类Unix系统不同之处主要在于两类:

    • 命令类似,但在SmartOS中用不同的名字
    • 完成类似的任务,但在SmartOS中有不同的实现过程

    这里列出一个命令列表,用来帮助Linux用户找到在SmartOS中与Linux对等的命令。

    • Linux 和 SmartOS 命令对比列表
    • 不同使用语境(Use Context)的例子
      • 检查进程和内存
      • 启动和停止服务

    Linux and SmartOS 命令对比列表

    任务 / 操作系统LinuxSmartOSSmartOS Virtual Instance (zone)
    表中缩写代表的含义
    table key
    (rh) = Red Hat, Mandrake, SUSE,…
    (deb) = Debian, Libranet,…
    (fed) = Fedora
    (gen) = Gentoo
    (md) = Mandrake/Mandriva
    (SUSE) = SUSE
    Joyent SmartOS

    开源版本可访问以下链接http://smartos.org
    Joyent SmartOS zone
    管理用户
    managing users
    useradd
    usermod
    userdel
    adduser
    chage
    getent
    useradd
    userdel
    usermod
    getent
    logins
    groupadd
    useradd
    userdel
    usermod
    getent
    logins
    groupadd
    列举硬件配置信息
    list hardware configuration
    arch
    uname
    dmesg (if you’re lucky)
    cat /var/log/dmesg
    /proc/*
    lshw
    dmidecode
    lspci
    lspnp
    lsscsi
    lsusb
    lsmod
    (SUSE) hwinfo
    /sys/devices/*
    arch
    prtconf [-v]
    prtpicl [-v]
    uname
    psrinfo [-v]
    isainfo [-v]
    dmesg
    iostat -En
    cfgadm -l
    /etc/path_to_inst
    arch
    uname
    psrinfo [-v]
    isainfo [-v]
    dmesg
    iostat -En
    读取磁盘命名
    read a disk label
    fdisk -lfdisk
    prtvtoc
    命名磁盘
    label a disk
    cfdisk
    fdisk
    e2label
    format
    prtvtoc
    fdisk
    磁盘分区
    partition a disk
    parted (if you have it)
    cfdisk
    fdisk
    pdisk (on a Mac)
    (deb) mac-fdisk (on a Mac)_
    (md) _diskdrake
    format
    fmthard
    rmformat
    内核文件
    kernel
    /boot/vmlinuz*
    /boot/bootlx
    (see /etc/lilo.conf or /boot/grub/menu.lst)
    /kernel/genunix
    /platform/`uname -m`/
    kernel/unix
    kernel modules are in /kernel, /usr/kernel, and /platform/`uname -m`/kernel
    Kernel module files not visible within a zone
    显示/配置内核参数
    show/set kernel parameters
    /proc/*
    /proc/sys/*
    sysctl
    /etc/sysctl.conf
    sysdef
    getconf
    cat /etc/system
    ndd
    mdb -k[w]
    sysdef
    getconf
    ndd
    显示已加载的内核模块
    loaded kernel modules
    lsmodmodinfomodinfo
    加载内核模块
    load module
    modprobe
    insmod
    modload
    add_drv
    devfsadm
    卸载内核模块
    unload module
    rmmod
    modprobe -r
    modunload
    启动脚本
    startup scripts
    /etc/rc* (but may vary)
    /etc/init.d/
    SMF(5)
    /etc/rc*
    /etc/init.d/
    svcadm
    svcs
    SMF(5)
    /etc/rc*
    /etc/init.d
    svcadm
    svcs
    启动/停止/配置服务
    start/ stop/ config services
    (rh) _service
    (rh) _chkconfig
    (deb) _sysv-rc-conf
    svcs
    svcadm
    svccfg
    svcs
    svcadm
    svccfg
    关机
    shutdown (& power off if possible)
    shutdown -Ph now
    shutdown -y -g0 -i0
    halt
    poweroff
    shutdown -y -g0 -i5
    halt
    shutdown -y -g0 -i5
    halt
    run levels
    *=normal states
    更多细节参考
    www.phildev.net/runlevels.html
    (set in /etc/inittab)
    0: halt
    s,S,1: vendor-dependent
    1: single-user
    2-5*: multiuser
    6: reboot
    0: firmware monitor
    s,S: single-user
    1: sys admin
    2: multiuser
    3*: share NFS
    4*: user-defined
    5: power-down if possible
    6: reboot
    s,S: single-user
    1: sys admin
    2: multiuser
    3*: share NFS
    4*: user-defined
    5: power-down if possible
    6: reboot
    show runlevel/sbin/runlevelwho -rwho -r
    时区信息
    time zone info
    /usr/share/zoneinfo/
    /etc/localtime
    /usr/share/lib/zoneinfo//usr/share/lib/zoneinfo
    检查交换分区
    check swap space
    swapon -s
    cat /proc/meminfo
    cat /proc/swaps
    free
    swap -s[h]
    swap -l[h]
    Note: in a zone, swap is virtual
    memory size
    swap -s[h]
    swap -l[h]
    bind process to CPUtaskset (sched-utils)pbind
    psrset
    pbind
    psrset
    终止进程
    killing processes
    kill
    killall
    kill
    pkill
    killall <- tries to kill everything, DO NOT USE THIS
    kill
    pkill
    killall <- tries to kill everything, DO NOT USE THIS
    显示CPU信息
    show CPU info
    cat /proc/cpuinfo
    lscpu
    psrinfo -pvpsrinfo -pv
    内存信息
    memory
    freememprtconf | head
    zonememstat
    prtconf | head
    zonememstat
    默认文件系统
    “normal” filesystem
    ext2
    ext3
    ReiserFS
    zfszfs
    开机自动挂载分区配置
    file system
    description
    /etc/fstab/etc/vfstab/etc/vfstab
    创建文件系统
    create filesystem
    mke2fs
    mkreiserfs
    mkdosfs
    mkfs
    zfs
    zpool
    zfs (if zone has delegated dataset)
    文件系统调试和恢复
    file system debugging and recovery
    fsck
    debugfs
    e2undel
    zdb
    创建非空文件
    create non-0-length empty file
    dd if=/dev/zero of=filename
    bs=1024k count=desired
    mkfilemkfile
    创建/挂载ISO镜像
    create/mount ISO image
    mkisofs
    mount -o loop pathToIso
    mountPoint
    mkisofs;DEVICE=`lofiadm -a /absolute_pathname/image.iso` ; mount -F hsfs -o ro
    $DEVICE
    ACL配置
    ACL management
    getfacl
    setfacl
    getfacl
    setfacl
    getfacl
    setfacl
    NFS share definitions/etc/exports/etc/dfs/dfstab
    dfshares
    NFS share command/etc/init.d/nfs-server reload_(rh)__ _exportfs -ashare
    shareall
    NFS informationcat /proc/mountsshowmount
    nfsstat
    nfsstat
    name resolution order/etc/nsswitch.conf
    /etc/resolv.conf
    /etc/nsswitch.conf
    getent
    /etc/nsswitch.conf
    getent
    显示网络接口信息
    show network interface info
    ifconfig
    ethtool
    dladm
    ndd
    ifconfig -a
    netstat -in
    dladm
    ndd
    ifconfig -a
    netstat -in
    更改IP地址
    change IP
    Joyent Public Cloud IP addresses are set in the Cloud Management Portal.
    ifconfig
    ping one packetping -c 1 hostnameping hostname packetsize 1ping hostname packetsize 1
    监听网络
    sniff network
    etherfind
    tcpdump
    wireshark (formerly _ethereal)
    etherape
    snoopsnoop
    tcpdump available from pkgin
    route definitionsroute
    (rh) /etc/sysconfig/network
    (rh) /etc/sysconfig/static-routes
    (deb) /etc/init.d/network
    (deb) /etc/network
    /etc/defaultrouter
    /etc/notrouter
    /etc/gateways
    in.routed
    netstat -r
    route add
    /etc/defaultrouter
    /etc/notrouter
    /etc/gateways
    in.routed
    netstat -r
    route add
    telnetd, ftpd banner/etc/issue.net (telnet)
    (ftp varies; can use tcp wrappers)
    Use nc insteadUse nc instead
    配置日期/时间
    set date/time
    (from net: ntp or other)
    ntpdate
    rdate
    netdate
    ntpdate
    rdate
    ntpdate
    rdate
    auditingauditd
    /var/log/faillog
    audit
    auditd
    auditreduce
    praudit
    audit
    auditd
    auditreduce
    praudit
    用户密码保存位置
    encrypted passwords in
    /etc/shadow (may vary)/etc/shadow/etc/shadow
    最小密码长度
    min password length
    /etc/pam.d/system-auth/etc/default/passwd/etc/default/passwd
    允许/禁止root登陆
    allow/deny root
    logins
    /etc/securetty/etc/default/login/etc/default/login
    防火墙配置
    firewall config
    iptables
    ipchains
    ipfwadm
    (rh) redhat-config-
    securitylevel
    /etc/ipf/ipf.conf/etc/ipf/ipf.conf
    显示已安装的软件
    show installed software
    (rh) _rpm -a -i
    (rh) _rpm -qa
    (rh) yum list installed
    (deb) dselect
    (deb) aptitude
    (deb) dpkg -l
    (gen) _ls /var/db/pkg/*
    (gen) _eix -I
    pkgin list
    pkgin avail <- list available installable software
    安装软件
    add software
    (rh) _rpm -hiv
    (rh) yum install pkg
    (deb) dselect
    (deb) _apt-get install _pkg
    (deb) dpkg -i
    pkgin install
    precompiled binaries* of GPLware and freeware*www.linux.org
    linux.tucows.com
    sourceforge.net
    rpmfind.net
    (deb) ftp.debian.org
    (deb) packages.debian.org
    (gen) packages.gentoo.org
    (gen) gentoo-portage.com;
    (md) easyurpmi.zarb.org
    www.sunfreeware.com
    www.blastwave.org
    http://pkgsrc.joyent.com/
    pkgin
    C编译器
    C compiler
    cc
    gcc
    gcc
    [https://download.joyent.com/pub/build/SunStudio.tar.bz2]
    gcc (may need to be installed via pkgin)
    https://download.joyent.com/pub/build/SunStudio.tar.bz2
    configure/show
    runtime linking
    ldconfig
    ldd
    readelf
    lsmod
    crle
    ldd
    elfdump
    dump
    pldd
    modinfo
    LD_PRELOAD
    crle
    ldd
    elfdump
    dump
    readelf
    pldd
    modinfo
    LD_PRELOAD
    链接库路径
    link library path
    $LD_LIBRARY_PATH
    /etc/ld.so.conf
    $LD_LIBRARY_PATH$LD_LIBRARY_PATH
    跟踪工具
    tracing utility
    strace
    ltrace
    dtrace
    truss
    sotruss
    dtrace
    truss
    sotruss
    define user defaults/etc/profile
    /etc/security/
    /etc/skel/
    /etc/profile.d/*
    /etc/default/login
    /etc/profile
    /etc/security/
    /etc/default/login
    /etc/profile
    /etc/security/
    csh global .login/etc/csh.login/etc/.login/etc/.login
    default syslog and messages/var/log/syslog
    /var/log/messages
    /usr/adm/messages
    /var/log/maillog
    /var/adm/messages
    /var/log/syslog
    softpanorama.org/Logs/solaris_logs.shtml
    /var/adm/messages
    /var/log/syslog
    系统错误报告工具
    system error reporting tool
    dmesg_(deb)_ reportbugfmadm
    fmdump
    prtdiag
    fmadm
    fmdump
    性能检测
    performance monitoring
    vmstat
    procinfo -D
    top
    htop
    pstree
    dtrace
    prstat
    sar
    ostat
    kstat
    mpstat
    netstat
    nfsstat
    vmstat
    lockstat
    plockstat
    ptree
    vfsstat
    intrstat
    dtrace
    prstat
    sar
    ostat
    kstat
    mpstat
    netstat
    nfsstat
    vmstat
    plockstat
    ptree
    vfsstat
    查看进程占用的文件和端口match process to file or portlsof
    netstat -atup
    fuser
    pfiles
    pfiles
    fuser
    lsof
    zones/containerszoneadm
    zonecfg
    zlogin
    zoneadm
    zonename
    虚拟工具
    Virtualization
    kvm/qemukvm/qemu (each instance in a kvm branded zone)
    vmadm
    imgadm
    WikipediaLinuxSmartOS
    Illumos
    SmartOS
    Illumos

    smartos 和linux相同命令不同作用的例子

    下面的例子是一些常用的命令,他们在linux与smartos中的作用不同

    CommandWhat’s different on a Smart Machine
    dfOn most SmartOS image this is set up to use the GNU version. Use /usr/bin/df for the native version.
    lsofSmartMachines use a different collection of tools to examine processes. See [Examining processes and memory|#procmem||||||||||||\||] later in this topic.
    pingReturns whether a host responds or not.
    Use ping -s to get a continuous response.
    toptop is available in /opt/local/bin, but prstat -Z provides more zone aware (and more accurate) information than top.

    Rosetta Stone for Unix 是一个有用的资源,可以帮你看看你经常使用的UNIX版本和其他的UNIX版本(包括Mac)有何不同,并如何对应。

    检查进程和内存

    在旧的SmartOS镜像中,这些命令提供了端口和相关资源的信息,使用root或sudo可运行它们。新的镜像使用的是 SmartMachine 工具包(Tools Package)

    CommandDescriptionExample
    pcpDisplays the ports used by a process, or the processes that use a port./root/bin/pcp -p 80 displays all the processes that use port 80.
    /root/bin/pcp -P 28068 displays all the ports that process 28068 uses.
    /root/bin/pcp -a displays port and process information for all ports.
    jinfDisplays information about how your SmartMachine is using its resources./root/bin/jinf -c displays CPU usage information.
    /root/bin/jinf -m displays memory usage information.
    /root/bin/jinf -s displays swap usage information.

    SmartOS 提供了一个工具套件来检查进程,可以在 proc 的 man page 中学习到更多内容。

    ToolDescription
    prstatThis tool displays the active processes like top does on Linux systems.
    prstat -Z will provide you with a summary of your SmartMachine’s status.
    pgrepReturns a list of process IDs (PIDs) of processes that match a pattern or meet certain conditions.
    pkillKills the processes that match a pattern or meet certain conditions.
    pfilesReturns a list of all the open files that belong to a process.
    pstackDisplays a stack trace of the specified process
    ptreeDisplays a process tree for all processes or a given process
    ls /procLists the process IDs of all running processes.

    你可以将 pgrep 的结果和其他 proc 工具合并显示。比如,显示与 http 进程相关的所有文件,可以使用如下命令来替代 lsof:

    $ sudo pfiles $(pgrep http)

    若要限制 prstat 显示 http 进程,可以使用命令:

    $ prstat $(pgrep -d , http)

    注意:如果 prstat 显示改变了你的终端设置,可以使用 reset 命令返回到正常状态

    对于 vmstat, mpstat 和 psrinfo 命令,主要显示物理机中处理器和内存的统计信息。这些输出一般来说对于SmartMachine的管理员才有用。

    启动和停止服务

    在其他系统中,你也许习惯使用命令在 /etc/init.d 来启动或停止服务。
    SmartMachines 使用 Service Management Facility 来做到这些。

    命令 svcs 和 svcadm 是你经常会使用到的。有些命令把 service identifier 叫做FMRI(Fault Management Resource Identifier)。
    你可以使用 svcs 命令列举一个服务所有的 identifier 。

    CommandDescription
    svcsLists all the enabled services
    svcs -aLists all of the services, even those that are disabled or off line
    svcadm enable apacheEnable all of the processes with an apache FMRI
    svcadm disable apacheDisable all of the processes with an apache FMRI
    svcadm restart apacheRestart all of the processes with an apache FMRI

    例如,如果你想更改 /etc/ssh/sshd_config 后重启SSH,可以这样做:

    $ sudo svcadm restart ssh

    向了解更多关于SMF的信息,可以打开这个网页

  • smartos教程一:smartos入门

    smartos教程一:smartos入门

    概述

    Smartos是一个开源的Unix系列操作系统,从Solaris10分支出来,由Joyent公司开发。Smartos拥有非常强大而简便的虚拟化功能,非常适合用来做云计算。

    Smartos详细资料请参考:https://wiki.smartos.org/display/DOC/Home

    SmartOS入门

    为了方便理解接下来的安装配置过程,先介绍一些Smartos相关的入门知识。

    SmartOS是驻内存的操作系统,它本身不在磁盘上保存任何操作系统运行相关的文件,只将配置、虚拟机等信息持久化到磁盘上。所以每次启动时,整个系统都会被全部加载到内存中运行。而根据加载源的不同,就有两种加载方式:

    1. USB启动。将操作系统写入到U盘中,并让服务器从本地U盘启动。
    2. PXE启动。将操作系统放到某个服务器中并提供PXE启动服务,其他的服务器就可以通过网络启动了。

    因此,操作系统更新时,也从来不用打任何补丁,直接从最新版的系统重新启动即可。

    zfs文件系统

    SmartOS使用zfs作为本地的文件系统,而zfs本身并不是SmartOS独有的,其他Linux发行版也可以使用。zfs和其他的文件系统相比有诸多好处,这里就不一一陈述了,但是简单的介绍下zfs的结构。

    存储池

    zfs首先从物理磁盘开始构建存储池,叫做zpool,服务器的存储空间可以由一个或者多个zpool组成,每个zpool都是独立的存储空间。

    zpool

    disk:操作系统可以直接检测到物理磁盘,也可以检测到硬件raid虚拟化出来的磁盘,但是为了充分利用zfs的性能,应该将硬件raid设置成直连(HBA)模式,直接暴露所有物理磁盘。

    array:将物理磁盘进行任意组合,可以生成一个或多个软件阵列,可以是mirrorraid等模式。一旦阵列生成,组成阵列的磁盘数量将不允许变更,只能对成员磁盘进行脱离、更换等工作。

    zpool:将阵列进行任意的组合,可以生成一个或者多个zpoolzpool可以添加或者删除子阵列,zpool的存储空间就是所有阵列存储空间的叠加。

    文件系统

    有了zpool存储空间后,就可以构建文件系统了。

    zpool

    zfs文件系统以zpool为根,以树形结构进行层级划分和管理,但是文件系统的属性(比如预留空间、权限、配额)可以有继承和依赖关系。zfs文件系统和虚拟机里面的文件系统很像似,但是不一样,zfs文件系统的节点是一个设备,需要挂载到虚拟机文件系统的一个目录树节点上,而虚拟机文件系统中的节点就是目录或者文件。最简洁的判别方法就是zfs文件系统不以/开头。

    SmartOS网络层次

    Smartos作为虚拟化操作系统,必然要实现网络硬件的虚拟化,虚拟化的技术叫做Crossbow,这里只简单的介绍一下。smartos网络层次

    physical nic:一台物理机上可以插多张物理网卡,每个网卡上可以有多个物理网口,每个物理网口都有一个全宇宙唯一的mac地址。

    aggregation:聚合网口由多个物理网口聚合而成,一个物理网口只能加入一个聚合网口或者不聚合,聚合网口通过一个名称来进行标识,物理网口直接用mac进行标识。

    virtual switch:虚拟交换机的名称在Smartos里叫做nic tag,每个虚拟交换机能且只能配置一个聚合网口或者物理网口,一个聚合网口或者物理网口可以属于任意多个虚拟交换机。

    global zonevm:global zone就是物理机的根操作系统,但是应该理解成一个特殊的虚拟机。虚拟机通过给每个虚拟网卡指定nic tag来接入虚拟交换机,每台虚拟机都必须指定一个主要网卡作为默认路由。

    硬件需求

    Smartos对硬件有些需求,并不适用任意硬件,不过也没有太多苛刻的地方,这里简单概括下:

    1.64-bit x86架构,推荐Intel的CPU,开启VT-x功能支持kvm虚拟化。

    2.能够USB启动以及能够PXE启动,第一台机器只可能USB启动,之后的机器可以PXE启动。

    3.只支持本地存储,尽量避免使用硬件RAID,将RAID控制器设置成HBA直连模式。因为要使用zfs文件系统。

    4.推荐Intel的网卡,至少两块网卡。

  • fedora 26 于7月13日正式发布

    fedora 26 于7月13日正式发布

    Fedora 26

    包括Workstation、Server和Atomic Host版本在内,Fedora 26系统镜像已经正式发布上线。用户可以通过命令行或者GNOME Software非常方面的进行升级,整个升级过程大约需要半个小时。继续为程序员和终端用户提供优质服务,Fedora于今天推出了全新升级的开发者软件,其中包括GCC 7,Golang 1.8和Python 3.6等等。

    此外在Fedora安装器中引入了全新的分区工具Anaconda,能够赋予系统爱好者和系统管理员更精细的控制选项。此外在本次升级中对Fedora 26的后台性能进行了诸多优化,例如更好的缓存用户和群组信息,更好的处理调试信息等等。此外在2.5重大版本更新中DNF安装包管理器也新增了很多功能。

    下载地址:

  • Stack Clash提权漏洞曝光

    Stack Clash提权漏洞曝光

    StackClash

    2017年6月19日Unix操作系统(包括Linux、OpenBSD和FreeBSD)爆出存在提权漏洞,该漏洞让攻击者可以通过执行代码提权到root权限。这个问题最早由安全供应商Qualys发现,并根据该漏洞需要和其他的内存区的堆栈进行“碰撞冲突”特性,将其命名为“Stack Clash”(堆栈冲突)。

    具体详情如下:

    漏洞编号:CVE-2017-1000364

    CVE-2017-1000366

    漏洞名称:Linux Kernel Stack Clash安全漏洞

    官方评级:高危

    漏洞描述:该漏洞是由于操作系统内存管理中的一个堆栈冲突漏洞,它影响的Linux,FreeBSD,OpenBSD,NetBSD的,Solaris和I386和AMD64,攻击者可以利用它破坏内存并执行任意代码。

    漏洞利用条件和方式:可以直接远程利用

    受到影响的 Linux 发行版

    • Red Hat Enterprise Linux Server 5.x
    • Red Hat Enterprise Linux Server 6.x
    • Red Hat Enterprise Linux Server 7.x
    • CentOS Linux Server 5.x
    • CentOS Linux Server 6.x
    • CentOS Linux Server 7.x
    • Oracle Enterprise Linux Server 5.x
    • Oracle Enterprise Linux Server 6.x
    • Oracle Enterprise Linux Server 7.x
    • Ubuntu 17.10
    • Ubuntu 17.04
    • Ubuntu 16.10
    • Ubuntu 16.04 LTS
    • Ubuntu 12.04 ESM (Precise Pangolin)
    • Debian 9 stretch
    • Debian 8 jessie
    • Debian 7 wheezy
    • Debian unstable
    • SUSE Linux Enterprise Desktop 12 SP2
    • SUSE Linux Enterprise High Availability 12 SP2
    • SUSE Linux Enterprise Live Patching 12
    • SUSE Linux Enterprise Module for Public Cloud 12
    • SUSE Linux Enterprise Build System Kit 12 SP2
    • SUSE Openstack Cloud Magnum Orchestration 7
    • SUSE Linux Enterprise Server 11 SP3-LTSS
    • SUSE Linux Enterprise Server 11 SP4
    • SUSE Linux Enterprise Server 12 SP1-LTSS
    • SUSE Linux Enterprise Server 12 SP2
    • SUSE Linux Enterprise Server for Raspberry Pi 12 SP2

    包括Red Hat、Debian、Ubuntu和SUSE等很多Linux发行机构已经修复了这个漏洞。更多更详细信息可以访问:

    SUSE
    https://www.novell.com/support/kb/doc.php?id=7020973
    Red Hat
    https://access.redhat.com/security/vulnerabilities/stackguard
    Debian
    https://www.debian.org/security/2017/dsa-3886
    https://www.debian.org/security/2017/dsa-3887
    https://www.debian.org/security/2017/dsa-3888
    https://www.debian.org/security/2017/dsa-3889
    Ubuntu
    https://www.ubuntu.com/usn/
    OpenBSD
    https://ftp.openbsd.org/pub/OpenBSD/patches/6.1/common/008_exec_subr.patch.sig
    Oracle Solaris
    http://www.oracle.com/technetwork/security-advisory/alert-cve-2017-3629-3757403.html

  • Docker 国内Mirror镜像推荐

    前言

    Docker Registry Mirror的原理类似于缓存,如果镜像在Mirror中命中则直接返回给客户端,否则从存放镜像的Registry上拉取并自动缓存在Mirror中。最酷的是,是否使用Mirror对Docker使用者来讲是透明的,也就是说在配置Mirror以后,大家可以仍然输入docker pull ubuntu来拉取Docker Hub镜像,除了速度变快了,和以前没有任何区别。

    了以更便捷的方式对接Docker Hub生态圈,使用Registry Mirror自然成为我的首选。接下来我就和大家一起看看国内有哪些 Mirror镜像。

    1、Docker 官方镜像加速

    这是Docker官方的中国区镜像加速,该镜像托管于中国大陆,速度有保证。使用方法详见:Docker 官方镜像加速

    2、ustc 镜像加速

    ustc是老牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在用。使用方法详见:Docker 镜像使用帮助

    3、网易蜂巢镜像加速

    目前网易镜像已经比较稳定。使用方法详见:DockerHub镜像加速

  • 直播协议hls介绍

    hls 是什么?

    我觉得以直播来说,hls 是一个相当好懂的协定,其实就是透过一个 .m3u8 的播放列表,然后里面有多个 .ts 的档案
    你只要照着播放列表里面给你的档案顺序播放就好了,听起来很容易吧!

    为了让大家更明白,直接附上摘取自某处的播放列表:

    #EXTM3U
    #EXT-X-VERSION:3
    #EXT-X-ALLOW-CACHE:YES
    #EXT-X-MEDIA-SEQUENCE:4454
    #EXT-X-TARGETDURATION:4
    #EXTINF:3.998, no desc
    25133_src/4460.ts
    #EXTINF:3.992, no desc
    25133_src/4461.ts
    #EXTINF:3.985, no desc
    25133_src/4462.ts
    #EXTINF:3.979, no desc
    25133_src/4463.ts
    #EXTINF:3.996, no desc
    25133_src/4464.ts</pre>
    

    就算你没看过这个格式,你大概看一下也可以猜出来它在做什么每一个 ts 就是一个片段,然后 #EXTINF:3.996 代表这个片段的时间长度#EXT-X-TARGETDURATION:4,这边的数字必须比播放清单中的任何一个影片的时间都大代表播放器应该每隔几秒去抓一次新的播放清单

    例如说,下一次抓到的可能会长这样:

    #EXTM3U
    #EXT-X-VERSION:3
    #EXT-X-ALLOW-CACHE:YES
    #EXT-X-MEDIA-SEQUENCE:4455
    #EXT-X-TARGETDURATION:4
    #EXTINF:3.992, no desc
    25133_src/4461.ts
    #EXTINF:3.985, no desc
    25133_src/4462.ts
    #EXTINF:3.979, no desc
    25133_src/4463.ts
    #EXTINF:3.996, no desc
    25133_src/4464.ts
    #EXTINF:3.998, no desc
    25133_src/4465.ts
    

    就是最后面多了一个片段。所以只要一直维持这个规则,就能够不断取到新的片段。那如果很不巧的,server 没有及时产生出播放列表怎么办呢?

    例如说在第 4 秒的时候去拿,发现没更新,server 在第 4.5 秒才把新的播放片段产生出来。如果发生这种「拿了播放清单,但长的一样」的情形,就会把抓取的时间减一半,直到抓到为止。像以上情形,第 4 秒没拿到新的,就会隔 2 秒之后再去抓。

    这个规则可以参考:HTTP Live Streaming draft-pantos-http-live-streaming-20

    When a client loads a Playlist file for the first time or reloads a Playlist file and finds that it has changed since the last time it was loaded, the client MUST wait for at least the target duration before attempting to reload the Playlist file again, measured from the last time the client began loading the Playlist file.
    If the client reloads a Playlist file and finds that it has not changed then it MUST wait for a period of one-half the target duration before retrying.

    至于做直播最关心的延迟问题,也可以直接从这个播放列表直接推测出来。以上面的例子来说,一共有 5 个片段,每一个片段 4 秒,延迟就是 20 秒。Apple 官方建议的是 3 个片段,每个片段 10 秒。

    What duration should media files be? A duration of 10 seconds of media per file seems to strike a reasonable balance for most broadcast content.
    
    How many files should be listed in the index file during a continuous, ongoing session? The normal recommendation is 3, but the optimum number may be larger.

    可参考:Apple: HTTP Live Streaming Overview

    不过依照官方的建议,就会有 30 秒的延迟,当然延迟越久直播的状况会越好,可是体验也会比较差一点。因此,我们可以来看看几个直播网站都是怎么设定的。

    先来看看直播大头:Twitch

    #EXTM3U
    #EXT-X-VERSION:3
    #EXT-X-TARGETDURATION:5
    #ID3-EQUIV-TDTG:2016-11-26T02:40:23
    #EXT-X-MEDIA-SEQUENCE:376
    #EXT-X-TWITCH-ELAPSED-SYSTEM-SECS:1511.137
    #EXT-X-TWITCH-ELAPSED-SECS:1508.980
    #EXT-X-TWITCH-TOTAL-SECS:1535.137
    #EXTINF:4.000,
    index-0000000377-6zCW.ts
    #EXTINF:4.000,
    index-0000000378-vHZS.ts
    #EXTINF:4.000,
    index-0000000379-Gkgv.ts
    #EXTINF:4.000,
    index-0000000380-PNoG.ts
    #EXTINF:4.000,
    index-0000000381-h58g.ts
    #EXTINF:4.000,
    index-0000000382-W88t.ts
    

    6 个片段 * 4 秒 = 24 秒。可是如果你仔细观察(开 chrome devtool 就可以了),实际上 twtich 的播放器在拿到列表以后会直接尝试从「倒数第三个」片段开始载入,所以延迟就缩短为 3*4 = 12 秒了。

    再来看看台湾的 livehouse.in

    #EXTM3U
    #EXT-X-VERSION:3
    #EXT-X-ALLOW-CACHE:NO
    #EXT-X-MEDIA-SEQUENCE:2291
    #EXT-X-TARGETDURATION:6
    
    #EXTINF:5.2090001106262207,
    1480116261segment_v02291.ts
    #EXTINF:5.2080001831054688,
    1480116261segment_v02292.ts
    #EXTINF:5.2080001831054688,
    1480116261segment_v02293.ts
    

    5*3 = 15 秒

    所以一般用 hls 的直播网站,延迟大概都会在 10~20 秒这个区间以内。我猜比这个短的话对 server 压力可能很大,而且网速慢的话,看起来会很卡。比这个长的话虽然很顺,但是使用者体验不太好,延迟太高,所以能找到最好的延迟就是在这个区间内了。

    最后,我们来看看如果要在网页上播放的话,有哪些选择。因为现在已经是个 flash 快死掉的年代了,所以如果可以的话,首选当然是 html5,浏览器支援度不够高的话再 fallback 回去 flash。

    先来介绍一下现成的商业授权播放器,例如说 jwplayer 或是 flowplayer,都是很不错的选项。尤其是当 open source 的方案出现问题你又修不好的时候,就会很希望公司花钱买一个商业播放器,一切问题都搞定。

    open source 的方案大概就是 videojs 一支独秀了,有没有其他的后起之秀我是不知道啦,有的话麻烦推荐一下。

    然后因为 hls 这个格式浏览器本身是没办法播放的,所以要搭配一些 plugin。videojs 官方有一个 videojs-contrib-hls,加上去之后就可以播放了,但我自己用过以后感觉不是很好。

    最后选择了知名的影音网站 dailymotion 提供的开源解决方案 hls.js

  • 树莓派与CoderDojo合并推进青少年的编程教育

    树莓派与CoderDojo合并推进青少年的编程教育

     

    树莓派

    Raspberry Pi(树莓派)自问世以来,就受到众多计算机发烧友和创客的追捧,曾经是一“派”难求,其强大的功能也受到了广大DIY爱好者的青睐。不过,这款信用卡大小的卡片式电脑的初衷是为了学生计算机编程教育而设计,以提升学校计算机科学及相关学科的教育、让计算机变得有趣为宗旨。

    Raspberry Pi基金会通常与教育合作伙伴合作,将其Raspberry Pi电脑提供给适合的组织。今天,Raspberry Pi基金会宣布与CoderDojo合并,形成全球最大的促进编程组织。

    Code Club成立于2013年6月,俱乐部一直在智力与激发9-11岁的儿童对科技的兴趣。目前,英国已经建立了3250个Code Club俱乐部,有超过四万名儿童参与其中,在其他国家和地区还有1000家Code Club在进行儿童计算机教育。

    Raspberry Pi基金会目前提供资源,以帮助支持教授编程的教育工作者,并且还运行儿童编程俱乐部网络,每星期为超过15万名儿童提供服务。Raspberry Pi基金会首席执行官Eben Upton最近表示,该组织将更多地关注软件,提升其慈善工作。今天的公告表明,梦想正在成为现实。Raspberry Pi将与CoderDojo密切合作,推动它们的共同目标,汇集资源和专业知识,让更多的成年志愿者和参与活动的年轻人为儿童少年提供编程培训服务。

    利用微型计算机开展学生编程教育已经屡见不鲜,Arduino、Galileo等微型电脑开发板厂商也都尝试致力于计算机编程教育领域,今年10月份,BBC Micro:bit迷你计算机设备的生产公司向英国六年级的孩子们免费发放了100万台BBC Micro:bit设备,并且提供开源资料,这一切都是鼓励和支持儿童与年轻人学习编程技术。

    在互联网时代,科技迅猛发展,编程似乎不再是专业人士运用的技能,而是成为了一门人人都需要了解的基础学科,Raspberry Pi和Code Club的融合就是为了促进更多人去学习和了解它。双方表示,在未来都会在网上提供免费的编程资源,Code Club的工作也会持续发展,在全球各地建立更多的教育俱乐部,让更多人受益。

  • WordPress后台框架OptionsFramework使用设置

    WordPress后台框架OptionsFramework使用设置

    Options Framework 是一款轻量级的主题后台设置框架, Options Framework 是国外一款非常流行的主题后台开发框架,因为其便捷性与开源免费,许多主题都是采用它作为 WordPress 主题后台。其分为主题版 Options Framework Theme 与插件版 Options Framework Plugin。Options Framework 支持几乎所有的表单(Form),安装与调用非常简单。在 options.php 定义你喜欢的选项,在后台就会自动地显示出来。

    OptionsFramework新特性

    • 轻量级
    • 基于wordpress原生api实现,提供了比较全面的常用选项
    • 界面与wordpress统一,当然也可以自己定制
    • 功能强大,使用简单

    Options Framework其实是一款主题,安装启用,就可以看到效果了,这时候会在后台→外观菜单下面多出来一个“Theme Options”的菜单(如果需要在左侧主菜单中显示该选项,可通过add_menu_page()实现),打开后即可看到所有的设置选项,下图已经修改为“主题选项”了如下图:

    Wordpress Options Framework

     

    框架使用方法

    1. 复制Options Framework主题文件夹下的inc、images文件夹和options.php,放到你的主题根目录下面
    2. 然后在你的主题的funtions.php加入以下代码(该代码在主题版的funtions.php开头):
    if (!function_exists('optionsframework_init')){
        define('OPTIONS_FRAMEWORK_DIRECTORY', get_template_directory_uri().'/inc/');
        require_once dirname(__FILE__).'/inc/options-framework.php';
    }
    

    如果你需要在设置面板中加入javascript代码,在上面代码后面加入以下代码:

    
    add_action('optionsframework_custom_scripts', 'optionsframework_custom_scripts');
        function optionsframework_custom_scripts(){ ?>
            <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%20type%3D%22text%2Fjavascript%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20your%20javascript%20code...%0A%20%20%20%20%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;script&gt;" title="&lt;script&gt;" />
    <?php
    }
    
    

    如果你需要在设置面板后面加入自定义内容,需要在以上代码中加入以下代码:(第三页将说明如何在设置面板后面加入一个自定义面板)

    add_action('optionsframework_after','options_after', 100);
    function options_after() { ?>
        your html code...
    <?php
    }
    

    Options Framework产生的后台选项支持功能

    后台页面是选项卡式的,非常美观大方,支持的功能也很多,包括:

    • 表单按钮(text、checkbox、radio、select)
    •  图片上传
    • 背景图片和背景色
    • 字体选择
    •  图片选择(例如用来选择主题的layout)
    • 帮助信息
    • 复位按钮

    自定义选项

    打开options.php中,模仿以下代码能做出自己的选项。

    <?php /* options.php line 60 */ //初始化存储选项的$options数组 $options = array(); //定义一个选项卡,标题是Basic Settings,注意type是heading $options[] = array("name" => "Basic Settings",
        "type" => "heading");
        //定义一个text类型的input box,type要设置为text,class为mini会让input长度比较短
        $options[] = array("name" => "Input Text Mini",
        "desc" => "A mini text input field.",
        "id" => "example_text_mini",
        "std" => "Default",
        "class" => "mini",
        "type" => "text");
    //同上,但没有设置class mini,input长度较长
    $options[] = array("name" => "Input Text",
        "desc" => "A text input field.",
        "id" => "example_text",
        "std" => "Default Value",
        "type" => "text");
    //输出一个textarea
    $options[] = array("name" => "Textarea",
        "desc" => "Textarea description.",
        "id" => "example_textarea",
        "std" => "Default Text",
        "type" => "textarea");
    //输出select下拉菜单,$test_array存储下拉菜单的选项,“std”表示默认选中的项
    $options[] = array( "name" => "Input Select Small",
     "desc" => "Small Select Box.",
     "id" => "example_select",
     "std" => "three",
     "type" => "select",
     "class" => "mini", //mini, tiny, small
     "options" => $test_array);
    //对应下面最后的代码
    $options[] = array(
        'name' => __('Input Checkbox Name', 'options_framework_theme'),
        'desc' => __('Check to display.'),
        'id' => 'example_checkbox_2',
        'std' => '1',
        'type' => 'checkbox'
    );
    

    其中: name – 选项的label名称

    id – 这个id很重要,区分每个选项,必须是唯一的,存储和获取选项时这个作为键使用

    type – 不同type产生不同的选项

    前台调用举例

    前台调用的话可以看原来主题版的index.php 。这里给出一些示例:

    <?php echo of_get_option('example_checkbox', 'no entry' ); ?>
     
     <?php if ( of_get_option('example_uploader') ) { ?>
                <img src="<?php echo of_get_option('example_uploader'); ?>" />
                <?php } ?>
     
    <?php $multicheck = of_get_option('example_multicheck', 'none' ); ?>
                <?php print_r($multicheck); ?>
     
    <?php if ( is_array($multicheck) ) { foreach ($multicheck as $key => $value) {
                        // If you need the option's name rather than the key you can get that
                        $name = $test_array_jr[$key];
                        // Prints out each of the values
                        echo '
    <li>' . $key . ' (' . $name . ') = ' . $value . '</li>
    
    ';
                    }
                }
                else {
                    echo '
    <li>There are no saved values yet.</li>
    
    ';
                }
                ?>
    

    使用Options Framework详解

    1.入门,Options Framework(下简称框架)的设置选项以如下形式出现:

    $options[] = array(
            "name"    => '',  //选填,选项名称
            "desc"    => '',  //选填,选项说明
            "id"      => '',  //必填,对应表单元素ID,该项作为唯一标识,不可与其他选项重复!
            "std"     => '',  //可选,元素默认值
            "class"   => '',  //可选,该类型元素class
            "type"    => '',  //可选,表单元素类型
            "settings"=> ''   //可选,仅当调用编辑器时使用
        );
    

    比如:

    $options[] = array(
            "name"=>'网站公告:',
            "desc"=>'输入您的网站公告,不要超过50个字符。',
            "id"=>'site_notices',
            "std"=>'输入您的网站公告',
            "class"=>'mini',
            "type"=>"text"
        );
    

    2.添加选项卡,在需要加入的地方加入如下代码:

    $options[] = array(
    		'name' => '新选项卡',
    		'type' => 'heading'
        );
    

    3.调用

    通过以上两步,后台设置部分基本完成,那么主题如何调用这些设置值呢?框架自带的主题中明确说明了每一种类型的调用方法,可参考主题中的调用方法,简单来说通过of_get_option($id,$default)即可调用保存的值,其中$id为必选值,即为需要调用元素的id值,$default为可选值,表示当所调用的元素值不存在时显示的值,如:

    <?php echo of_get_option('site_notices', '暂无公告信息!'); ?>

    注意,of_get_option()只是返回了一个值,需要用echo输出才能在主题中显示,某些情况下,也可能需要使用如下代码:

    <?php if(of_get_option("example_checkbox")){ echo "checkbox is checked"; }else{ echo "checkbox is not checked"; } ?>
    

    通过以上两段代码,应该能较深刻的理解为什么要用echo输出。更详细的内容说明请转至文章底部,下载作者Options Framework中文版,查看更详细的调用方式。

    4.修改输出方式,

    如果想修改以上函数名,找到inc/options-framework.php中478和480两行,将“of_get_option”替换为需要的函数名称即可。如替换为get_opt,则可以通过get_opt($id,$default)调用。

    5.主题本地化,

    如果主题需要支持多种语言,则需要在所有文件中替换“options_framework_theme”为您的主题名称或您想要使用的名称。

    OptionsFramework下载

  • 自动调整网站内嵌Youtube视频大小

    站长在制作网站的时候,常常会需要嵌入Youtube影片,现在移动设备盛行,有各种不同屏幕大小的移动设备来浏览网站,若在网站上要内嵌入Youtube视频,该如何让该影片可以根据浏览设备的屏幕大小自动调整影片嵌入大小呢?

    在请Google一番之后,答案出乎意料的简单。以下是搜索出来的解决方案:

    首先先把下列CSS网站的CSS文件里:

    .video-container {
      position: relative;
      padding-bottom: 56.25%;
      padding-top: 30px;
      height: 0;
      overflow: hidden;
    }
    
    .video-container iframe,
    .video-container object,
    .video-container embed {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
    }
    

    接着把Youtube视频的iframe代码在div里面,并且把这个div的类设成video-container,以下为范例:

    <div class="video-container">
      <iframe width="560" height="315" src="https://www.youtube.com/embed/2KmHtgtEZ1s" frameborder="0" allowfullscreen></iframe>
    </div>
    

    如此一来就内嵌的视频大小就会自动根据屏幕宽度调整了!

  • 在Debian 8.8安装使用zfs文件系统

    引言

    ZFS文件系统的英文名称为ZettabyteFileSystem,也叫动态文件系统(DynamicFileSystem),是第一个128位文件系统。最初是由Sun公司为Solaris10操作系统开发的文件系统。作为OpenSolaris开源计划的一部分,ZFS于2005年11月发布,被Sun称为是终极文件系统,经历了10年的活跃开发,而最新的开发将全面开放,并重新命名为OpenZFS。

    ZFS优势

    1. ZFS是一种先进的、高度可扩展的文件系统,最初是由Sun Microsystems开发的,现在OpenZFS是项目的一部分。有这么多文件系统可用在Linux上,那自然要问ZFS有什么特别之处。不同于其它文件系统,它不仅是一个文件系统逻辑卷管理器。ZFS使其受欢迎的特性是:
    2.  数据完整性——数据一致性和完整性通过即写即拷和校验技术保证。
    3. 存储空间池——可用存储驱动器一起放入称为zpool的单个池。
    4. 软件RAID ——像发出一个命令一样,建立一个raidz数组。
    5. 内置的卷管理器——ZFS充当卷管理器。
    6. Snapshots、克隆、压缩——这些都是一些ZFS提供的高级功能。

    安装ZFS

    在这篇文章中,我们将学习在Debian 8.8上安装、设置和使用ZFS文件系统。

    根据网站www.zfsonlinux.org的信息 ,ZFS仅支持AMD64和Intel 64位架构(amd64)。 让我们开始安装。

    1、更新Debian系统

    在Debian8中,zfs软件包已经加入debian backports源

    首先我们需要在系统中启用backports源,并更新系统

    echo "deb http://ftp.debian.org/debian jessie-backports main contrib" /etc/apt/sources.list.d/backports.list
    aptitiude update
    apititiude upgrade
    
    

    2、安装zfs

    安装kernel headers

    aptitiude install linux-headers-$(uname -r)

    安装 zfs-dkms

    aptitiude install -t jessie-backports zfs-dkms

    如果需要在在根分区使用zfs,你需要安装zfs-initramfs

    aptitiude install -t jessie-backports zfs-initramfs

    3、创建和配置池

    服务器重新启动后,检查zfsonlinux是否安装并运行良好。

    
    # dpkg -l | grep zfs
    ii debian-zfs 7~jessie amd64 Native ZFS filesystem metapackage for Debian.
    ii libzfs2 0.6.5.2-2 amd64 Native ZFS filesystem library for Linux
    ii zfs-dkms 0.6.5.2-2 all Native ZFS filesystem kernel modules for Linux
    ii zfsonlinux 6 all archive.zfsonlinux.org trust package
    ii zfsutils 0.6.5.2-2 amd64 command-line tools to manage ZFS filesystems
    
    

    上面的结果显示,linux上的zfs已经安装好了,所以我们可以继续创建第一个池。

    我已经为这台服务器添加了五个磁盘,每个磁盘的大小为2GB。 我们可以使用以下命令检查可用磁盘:

    
    # ls /dev/sd*
    /dev/sda /dev/sda1 /dev/sda2 /dev/sda5 /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg
    
    

    我们可以看到/ dev / sda直到/ dev / sdg , / dev / sda用于操作系统Debian Linux Jessie 8.1。 我们将使用/ dev / sdb直到/ dev / sdg为ZFS文件系统。

    现在我们可以开始创建池,第一个我会告诉你如何创建一个raid0(条带)。

    
    # zpool list
    no pools available
    
    # zpool create -f pool0 /dev/sdb
    # zpool list
    NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
    pool0 1.98G 64K 1.98G – 0% 0% 1.00x ONLINE –
    
    

    命令“zpool list”表示我们成功创建了一个raid0 zfs池,池名为pool0 ,大小为2GB。

    接下来我们将创建一个raid1(镜像)与其他磁盘。

    
    # zpool create -f pool1 mirror /dev/sdc /dev/sdd
    # zpool list
    NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
    pool0 1.98G 64K 1.98G – 0% 0% 1.00x ONLINE –
    pool1 1.98G 64K 1.98G – 0% 0% 1.00x ONLINE –
    
    

    我们可以看到我们现在有两个池, pool0为raid0, pool1为raid1。

    要检查池的状态,我们可以使用以下命令:

    
    # zpool status
    pool: pool0
    state: ONLINE
    scan: none requested
    config:
    NAME STATE READ WRITE CKSUM
    pool0 ONLINE 0 0 0
    sdb ONLINE 0 0 0
    errors: No known data errors
    pool: pool1
    state: ONLINE
    scan: none requested
    config:
    NAME STATE READ WRITE CKSUM
    pool1 ONLINE 0 0 0
    mirror-0 ONLINE 0 0 0
    sdc ONLINE 0 0 0
    sdd ONLINE 0 0 0
    errors: No known data errors
    
    

    我们可以使用“zpool status”命令检查池状态。 我们可以看到pool0和pool1之间的区别,pool0只有一个磁盘,pool1有两个磁盘,磁盘状态为mirror(mirror-0)。

    接下来,我们将使用RAID-Z创建一个池,RAID-Z是像RAID-5这样的数据/奇偶校验分配方案,但它使用动态条带宽度:每个块都具有自己的RAID条带,无论块大小如何,导致每个RAID-Z写入都是全条带写入。

    RAID-Z需要至少三个硬盘驱动器,并且是RAID 0和RAID 1之间的妥协。在RAID-Z池中:如果池中的单个磁盘死机,则只需替换该磁盘,ZFS将自动重建数据基于来自其他磁盘的奇偶校验信息。 要松开存储池中的所有信息,两个磁盘将不得不死亡。 为了使驱动器设置更加冗余,您可以使用RAID 6(在ZFS情况下为RAID-Z2)获得双重奇偶校验。

    我们先创建一个奇偶校验的RAID-Z池。

    
    # zpool create -f poolz1 raidz sde sdf sdg
    # zpool list poolz1
    NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
    poolz1 5.94G 117K 5.94G – 0% 0% 1.00x ONLINE –
    
    # zpool status poolz1
    pool: poolz1
    state: ONLINE
    scan: none requested
    config:
    NAME STATE READ WRITE CKSUM
    poolz1 ONLINE 0 0 0
    raidz1-0 ONLINE 0 0 0
    sde ONLINE 0 0 0
    sdf ONLINE 0 0 0
    sdg ONLINE 0 0 0
    errors: No known data errors
    
    # df -h /poolz1
    Filesystem Size Used Avail Use% Mounted on
    poolz1 3.9G 0 3.9G 0% /poolz1
    
    

    我们可以看到,df -h显示我们的6GB池已经减少到4GB,2GB被用于保存奇偶校验信息。 使用zpool status命令,我们看到我们的池现在正在使用RAID-Z。

    接下来我们将创建RAID-Z2(raid 6),为此,我们必须删除现有的池,因为没有更多的磁盘可用。 删除池很容易,我们可以使用zpool destroy命令。

    
    # zpool list
    NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
    pool0 1.98G 64K 1.98G – 0% 0% 1.00x ONLINE –
    pool1 1.98G 64K 1.98G – 0% 0% 1.00x ONLINE –
    poolz1 5.94G 117K 5.94G – 0% 0% 1.00x ONLINE –
    
    # zpool destroy pool0
    # zpool destroy pool1
    # zpool destroy poolz1
    # zpool list
    no pools available
    
    

    现在我们所有的zpool都没有了,所以我们可以创建一个RAID-Z2池。

    
    # zpool create poolz2 raidz2 sdb sdc sdd sde
    # zpool list
    NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
    poolz2 7.94G 135K 7.94G – 0% 0% 1.00x ONLINE –
    
    # df -h /poolz2
    Filesystem Size Used Avail Use% Mounted on
    poolz2 3.9G 0 3.9G 0% /poolz2
    
    # zpool status poolz2
    pool: poolz2
    state: ONLINE
    scan: none requested
    config:
    NAME STATE READ WRITE CKSUM
    poolz2 ONLINE 0 0 0
    raidz2-0 ONLINE 0 0 0
    sdb ONLINE 0 0 0
    sdc ONLINE 0 0 0
    sdd ONLINE 0 0 0
    sde ONLINE 0 0 0
    errors: No known data errors
    
    

    我们可以看到,df -h显示,我们的8GB池已经减少到4GB,因为4GB被用于持有奇偶校验信息两次。 使用“zpool status”命令,我们看到我们的池现在使用RAID-Z2。

    4、创建和配置ZFS文件系统

    在下一步中,我们将创建和配置ZFS文件系统。

    
    # zfs list
    NAME USED AVAIL REFER MOUNTPOINT
    poolz2 105K 3.83G 26.1K /poolz2
    
    

    我们已经有一个ZFS文件系统,当我们创建zpool时,这个文件系统会自动添加。 现在我们将创建另一个ZFS文件系统。

    
    # zfs create poolz2/tank
    # zfs list
    NAME USED AVAIL REFER MOUNTPOINT
    poolz2 132K 3.83G 26.1K /poolz2
    poolz2/tank 25.4K 3.83G 25.4K /poolz2/tank
    
    # df -h | grep poolz2
    poolz2 3.9G 128K 3.9G 1% /poolz2
    poolz2/tank 3.9G 128K 3.9G 1% /poolz2/tank
    
    

    我们创建一个名为tank的新的ZFS文件系统,并自动将其安装为/ poolz2 / tank 。

    如何为ZFS文件系统创建自定义安装点? 使用以下命令:

    
    # zfs create poolz2/data -o mountpoint=/data
    # df -h | grep poolz2
    poolz2 3.9G 0 3.9G 0% /poolz2
    poolz2/tank 3.9G 0 3.9G 0% /poolz2/tank
    poolz2/data 3.9G 0 3.9G 0% /data
    
    

    如何修改现有的mountpoint? 我们可以通过以下命令来做到这一点:

    
    # zfs set mountpoint=/tank poolz2/tank
    # df -h | grep poolz2
    poolz2 3.9G 0 3.9G 0% /poolz2
    poolz2/data 3.9G 0 3.9G 0% /data
    poolz2/tank 3.9G 0 3.9G 0% /tank
    
    

    要安装和卸载文件系统,请使用以下命令:

    
    # zfs unmount /data
    # df -h | grep poolz2
    poolz2 3.9G 0 3.9G 0% /poolz2
    poolz2/tank 3.9G 0 3.9G 0% /tank
    
    # zfs mount poolz2/data
    # df -h | grep poolz2
    poolz2 3.9G 0 3.9G 0% /poolz2
    poolz2/tank 3.9G 0 3.9G 0% /tank
    poolz2/data 3.9G 0 3.9G 0% /data
    
    

    删除zfs文件系统非常容易,我们可以使用命令zfs destroy来进行。

    
    # zfs destroy poolz2/data
    # zfs list
    NAME USED AVAIL REFER MOUNTPOINT
    poolz2 152K 3.83G 26.1K /poolz2
    poolz2/tank 25.4K 3.83G 25.4K /tank
    
    

    文件系统/数据已经没了。

    结论

    ZFS文件系统是一个革命性的新文件系统,从根本上改变了在类Unix操作系统上管理文件系统的方式。 ZFS提供了在今天可用的任何其他文件系统中找不到的功能和优点。 ZFS是强大的,可扩展的,易于管理。