分类 技术 下的文章

2022 年已至,是时候期待一些激动人心的发行版更新了!这里我们挑选了一些值得关注的发行版选择。

是时候和 2021 年说再见了。

如果你错过了 2021 年的 Linux 大事件,现在你也可以去回顾一下。

不过,考虑到 2021 年已有许多令人印象深刻的发行版推出,2022 年,对于较新的 Linux 发行版以及现有版本的更新,人们的期待值已经直达顶峰。

与十年前相比,Linux 发行版如今更加注重用户体验。这不仅仅关乎资源占用,更关系到发行版的外观及对现代桌面硬件的兼容性。

先来简单回顾一下 —— elementary OS 6.1Zorin OS 16Pop!\_OS 21.10 和 Linux Mint 20.3 都是于 2021 年推出的大型 Linux 发行版的更新版。这些发行版都专注于改善用户体验、改进视觉、优化生产力。

毫无疑问,你可以选择上述发行版并感受前所未有的桌面体验,也可以获取 最佳 Linux 发行版 的最新更新。

所以,到了 2022 年,你又应该期待什么?是否会有一个能让用户体验更上一层楼的发行版呢?

答案是肯定的,这里就有一些你值得关注的发行版。在此我列出了清单,重点强调 2022 年这些发行版的计划更新内容。

2022 年最值得期待的发行版

请注意:这里列出的大部分发行版的官方信息暂时缺失,不过本文章将定期更新以补充最新消息。

1、Slackware 15

Slackware 是至今为止 最长寿的活跃发行版。Slackware 15 Beta 版已在去年发布,稳定版将于 2022 年初发布。

对于新手级桌面用户来说,这并不那么吸引人,不过如果你想要一款支持旧硬件,或者能够有效利用资源的发行版,Slackware 可以成为你的候选方案。

再次强调一下,Slackware 15 将是时隔六年后的一个大版本更新,所以这是一件大事。

不过,这款发行版会更适合有经验的 Linux 用户。

因此,如果你对此不感兴趣的话,你可以去看看 最轻量级的 Linux 发行版列表

2、Ubuntu 22.04 LTS

Ubuntu 的下一个 LTS 版本 22.04(代号 Jammy Jellyfish)将于 2022 年 4 月 21 日发布。

在 Ubuntu 22.04 LTS 中,你将可以体验到 GNOME 42 桌面环境、全新的安装器,以及默认使用 Wayland 的桌面会话。

Ubuntu 21.10 的一系列改进也将在 Ubuntu 22.04 LTS 中一并出现。

3、Zorin OS 17

Zorin OS 16

Zorin OS 16 凭借其新增的许多功能及用户体验改进,让我们留下了极其深刻的印象。

我认为 Zorin OS 16 是一次极大地增强了桌面体验的更新。

考虑到 Zorin OS 16 中已经有了大幅改进,我们应该转投于下一个大版本更新 —— 将于 2022 年发布的 Zorin OS 17。当然,它应该会基于 Ubuntu 22.04 LTS,不过你更应该期待一下视觉方面的改进。

4、Pop!\_OS 22.04

Pop!\_OS 是一款开箱即用的稳定发行版。与其他发行版不同, Pop!\_OS 并不意在于“更棒的视觉体验”,而是专注于增强工作流环境,同时提供独特的桌面体验。

System76 将仓库从 Launchpad 转移出去 和计划 使用 Rust 从头构建桌面环境 这几件激动人心的举措,使我更有意愿去关注他们的发展动态。

毫无疑问,Pop!\_OS 能够成为我的主力系统

此外,Pop!\_OS 22.04 将会是 System76 对其操作系统后续规划的有力支撑,所以,拭目以待吧。

5、Linux Mint 21

Linux Mint 团队可能不会推出很多变化,但从 Linux Mint 20.3 开始,他们开始专注于改善视觉了。

我并不希望有任何破坏性变更。不过,Linux Mint 21 仍旧有值得期待的重大视觉优化,毕竟他们确实需要向更现代的桌面环境发展了。

6、CutefishOS

CutefishOS 目前仍处于早期开发阶段(虽然已经到了 Beta 测试阶段),尚未进入稳定阶段。

根据我对其 Beta 测试版本的体验,CutefishOS 在用户体验上 可以与深度操作系统相媲美。当然我仍旧持谨慎态度,毕竟它还没到达稳定阶段。

不过,CutefishOS 确实是款值得关注的项目,毕竟,更多的发行版将开始意识到改进用户体验的重要性,并试图与现有的 最美 Linux 发行版 一决高下,这么“卷”起来总归是好事。

7、Fedora 36

Fedora 团队已经从 Linus Tech Tip 的 Linux 日用挑战系列视频 中认真地听取了用户反馈。

事实上,红帽公司已经捐赠了 1 万美元 来帮助 OBS 构建 Flatpak 官方包。

即便 Fedora 并非 Linux 游戏玩家的理想发行版,Fedora 团队也在努力使 Workstation 版本兼顾稳定性和最新功能。

Fedora 35 正是一个优秀案例,它带来了 GNOME 41 和全新的 KDE 变体版本。

我并不敢保证 Fedora 36 能更适合游戏玩家,但有一些预期的变化,比如 Wayland 默认使用 NVIDIA 专有驱动,以及新的 GNOME 42 桌面环境。如果你想关注开发动态,你可以查阅 官方的更新内容列表

额外:Nitrux Linux

我本来没有计划在这里介绍 Nitrux 的,但 Nitrux 几天前突然 推出了 Maui Shell 项目

Maui Shell 是一款跨终端的桌面环境,支持电脑、平板、手机。听起来是不是有点像当年 Ubuntu 的 Unity 呢?Nitrux 项目在设计方面一直很出色,所以我对这款新的桌面环境的期待值已经拉满了。

Maui Shell 项目仍在大力开发中。它将在接下来的几个月里添加新功能,以确保其基本可用。我们可以期待 2022 年它会变成什么样子。

结束语

即便我们列出了这么多发行版,谁知道哪个发行版又会突然出现,并拿下头条呢?

也许是 EndeavourOSGaruda Linux 的重量级更新,又或者是别的?

2022 年,你又会期待哪款发行版呢?不要介意,欢迎在评论区分享你的想法。


via: https://news.itsfoss.com/linux-distro-releases-2022/

作者:Ankush Das 选题:lujun9972 译者:imgradeone 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

探索 Kubernetes 中不同容器日志记录模式的工作原理。

 title=

服务器和应用程序日志记录是开发人员、运维人员和安全团队了解应用程序在其生产环境中运行状态的重要工具。

日志记录使运维人员能够确定应用程序和所需组件是否运行平稳,并检测是否发生了异常情况,以便他们能够对这种情况做出反应。

对于开发人员,日志记录提供了在开发期间和之后对代码进行故障排除的可见性。在生产环境中,开发人员通常依赖于没有调试工具的日志记录工具。在加上系统的日志记录,开发人员可以与运维人员携手合作,有效地解决问题。

日志记录工具最重要的受益者是安全团队,尤其是在云原生的环境中。能够从应用程序和系统日志中收集信息使得安全团队能够分析来自身份验证、应用程序访问恶意软件活动的数据,并在需要时进行响应。

Kubernetes 是领先的容器平台,越来越多的应用程序通过 Kubernetes 部署到生产环境。我相信了解 Kubernetes 的日志架构是一项非常重要的工作,每个开发、运维和安全团队都需要认真对待。

在本文中,我将讨论 Kubernetes 中不同容器日志记录模式的工作原理。

系统日志记录和应用日志记录

在深入研究 Kubernetes 日志记录架构之前,我想探索不同的日志记录方法以及这两种功能如何成为 Kubernetes 日志记录的关键特性。

有两种类型的系统组件:在容器中运行的组件和不在容器中运行的组件。例如:

  • Kubernetes 调度者和 kube-proxy 运行在容器中。
  • kubelet 和容器运行时不在容器中运行。

与容器日志类似,系统容器日志存储在 /var/log 目录中,你应该定期轮换它们。

在这里,我研究的是容器日志记录。首先,我看一下集群级别的日志记录以及为什么它对集群运维人员很重要。集群日志提供有关集群如何执行的信息。诸如为什么 吊舱 Pod 被下线或节点死亡之类的信息。集群日志记录还可以捕获诸如集群和应用程序访问以及应用程序如何利用计算资源等信息。总体而言,集群日志记录工具为集群运维人员提供操作集群和安全有用的信息。

捕获容器日志的另一种方法是通过应用程序的本机日志记录工具。现代应用程序设计很可能具有日志记录机制,可帮助开发人员通过标准输出 (stdout) 和错误流 (stderr) 解决应用程序性能问题。

为了拥有有效的日志记录工具,Kubernetes 实现需要应用程序和系统日志记录组件。

Kubernetes 容器日志的 3 种类型

如今,在大多数的 Kubernetes 实现中,你可以看到三种主要的集群级日志记录方法。

  1. 节点级日志代理
  2. 用于日志记录的 挎斗 Sidecar 容器应用程序
  3. 将应用程序日志直接暴露给日志后端

节点级日志代理

我想考虑节点级日志代理。你通常使用 DaemonSet 作为部署策略来实现这些,以便在所有 Kubernetes 节点中部署一个吊舱(充当日志代理)。然后,该日志代理被配置为从所有 Kubernetes 节点读取日志。你通常将代理配置为读取节点 /var/logs 目录捕获 stdout/stderr 流并将其发送到日志记录后端存储。

下图显示了在所有节点中作为代理运行的节点级日志记录。

 title=

以使用 fluentd 方法为例设置节点级日志记录,你需要执行以下操作:

1、首先,你需要创建一个名为 fluentdd 的服务账户。Fluentd 吊舱使用此服务账户来访问 Kubernetes API,你需要在日志命名空间中使用标签 app: fluentd 创建它们:

#fluentd-SA.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: fluentd
  namespace: logging
  labels:
    app: fluentd  

你可以在此 仓库 中查看完整示例。

2、接着,你需要创建一个名称为 fluentd-configmap 的 ConfigMap。这为 fluentd daemonset 提供了一个配置文件,其中包含所有必需的属性。

#fluentd-daemonset.yaml
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: logging
  labels:
    app: fluentd
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    matchLabels:
      app: fluentd
      kubernetes.io/cluster-service: "true"
  template:
    metadata:
      labels:
        app: fluentd
        kubernetes.io/cluster-service: "true"
    spec:
      serviceAccount: fluentd
      containers:
      - name: fluentd
        image: fluent/fluentd-kubernetes-daemonset:v1.7.3-debian-elasticsearch7-1.0
        env:
          - name: FLUENT_ELASTICSEARCH_HOST
            value: "elasticsearch.logging.svc.cluster.local"
          - name: FLUENT_ELASTICSEARCH_PORT
            value: "9200"
          - name: FLUENT_ELASTICSEARCH_SCHEME
            value: "http"
          - name: FLUENT_ELASTICSEARCH_USER
            value: "elastic"
          - name: FLUENT_ELASTICSEARCH_PASSWORD
            valueFrom:
              secretKeyRef:
                name: efk-pw-elastic
                key: password
          - name: FLUENT_ELASTICSEARCH_SED_DISABLE
            value: "true"
        resources:
          limits:
            memory: 512Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
        - name: fluentconfig
          mountPath: /fluentd/etc/fluent.conf
          subPath: fluent.conf
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
      - name: fluentconfig
        configMap:
          name: fluentdconf

你可以在此 仓库 中查看完整示例。

现在,我们来看看如何将 fluentd daemonset 部署为日志代理的代码。

#fluentd-daemonset.yaml
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: logging
  labels:
    app: fluentd
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    matchLabels:
      app: fluentd
      kubernetes.io/cluster-service: "true"
  template:
    metadata:
      labels:
        app: fluentd
        kubernetes.io/cluster-service: "true"
    spec:
      serviceAccount: fluentd
      containers:
      - name: fluentd
        image: fluent/fluentd-kubernetes-daemonset:v1.7.3-debian-elasticsearch7-1.0
        env:
          - name: FLUENT_ELASTICSEARCH_HOST
            value: "elasticsearch.logging.svc.cluster.local"
          - name: FLUENT_ELASTICSEARCH_PORT
            value: "9200"
          - name: FLUENT_ELASTICSEARCH_SCHEME
            value: "http"
          - name: FLUENT_ELASTICSEARCH_USER
            value: "elastic"
          - name: FLUENT_ELASTICSEARCH_PASSWORD
            valueFrom:
              secretKeyRef:
                name: efk-pw-elastic
                key: password
          - name: FLUENT_ELASTICSEARCH_SED_DISABLE
            value: "true"
        resources:
          limits:
            memory: 512Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
        - name: fluentconfig
          mountPath: /fluentd/etc/fluent.conf
          subPath: fluent.conf
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
      - name: fluentconfig
        configMap:
          name: fluentdconf

将这些放在一起执行:

kubectl apply -f fluentd-SA.yaml \
              -f fluentd-configmap.yaml \
              -f fluentd-daemonset.yaml

用于日志记录的挎斗容器应用程序

另一种方法是使用带有日志代理的专用挎斗容器。容器最常见的实现是使用 Fluentd 作为日志收集器。在企业部署中(你无需担心一点计算资源开销),使用 fluentd(或类似)实现的挎斗容器提供了集群级日志记录的灵活性。这是因为你可以根据需要捕获的日志类型、频率和其它可能的调整来调整和配置收集器代理。

下图展示了作为日志代理的挎斗容器。

 title=

例如,一个吊舱运行单个容器,容器使用两种不同的格式写入两个不同的日志文件。吊舱的配置文件如下:

#log-sidecar.yaml
apiVersion: v1
kind: Pod
metadata:
  name: counter
spec:
  containers:
  - name: count
    image: busybox
    args:
   - /bin/sh
    - -c
    - >
     i=0;
      while true;
      do
        echo "$i: $(date)" >> /var/log/1.log;
        echo "$(date) INFO $i" >> /var/log/2.log;
        i=$((i+1));
        sleep 1;
      done
    volumeMounts:
    - name: varlog
      mountPath: /var/log
  - name: count-log
    image: busybox
    args: [/bin/sh, -c, 'tail -n+1 -f /var/log/1.log']
    volumeMounts:
    - name: varlog
      mountPath: /var/log
  volumes:
  - name: varlog
    emptyDir: {}

把它们放在一起,你可以运行这个吊舱:

$ kubectl apply -f log-sidecar.yaml

要验证挎斗容器是否用作日志代理,你可以执行以下操作:

$ kubectl logs counter count-log

预期的输出如下所示:

$ kubectl logs counter count-log-1

Thu 04 Nov 2021 09:23:21 NZDT
Thu 04 Nov 2021 09:23:22 NZDT
Thu 04 Nov 2021 09:23:23 NZDT
Thu 04 Nov 2021 09:23:24 NZDT

将应用程序日志直接暴露给日志后端

第三种方法(在我看来)是 Kubernetes 容器和应用程序日志最灵活的日志记录解决方案,是将日志直接推送到日志记录后端解决方案。尽管此模式不依赖于原生 Kubernetes 功能,但它提供了大多数企业需要的灵活性,例如:

  1. 扩展对网络协议和输出格式的更广泛支持。
  2. 提供负载均衡能力并提高性能。
  3. 可配置为通过上游聚合接受复杂的日志记录要求。

因为这第三种方法通过直接从每个应用程序推送日志来依赖非 Kubernetes 功能,所以它超出了 Kubernetes 的范围。

结论

Kubernetes 日志记录工具是企业部署 Kubernetes 集群的一个非常重要的组件。我讨论了三种可能的可用模式。你需要找到适合你需求的模式。

如上所述,使用 daemonset 的节点级日志记录是最容易使用的部署模式,但它也有一些限制,可能不适合你的组织的需要。另一方面,挎斗 模式提供了灵活性和自定义,允许你自定义要捕获的日志类型,但是会提高计算机的资源开销。最后,将应用程序日志直接暴露给后端日志工具是另一种允许进一步定制的诱人方法。

选择在你,你只需要找到适合你组织要求的方法。


via: https://opensource.com/article/21/11/cluster-logging-kubernetes

作者:Mike Calizo 选题:lujun9972 译者:perfiffer 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如果你最开始使用的是 Windows 电脑,你很可能会使用“ 文件夹 folder ”这个术语。

但当你换到 Linux 时,你会发现文件夹通常被称为“ 目录 directory ”。

这可能使一些新的 Linux 用户感到困惑。你应该叫它文件夹还是目录?它们有区别吗?

事情是这样的。如果你愿意,你可以叫它文件夹,如果你喜欢,也可以叫它目录。这没有什么区别。

但是,如果你想知道为什么文件夹在 Linux 中被称为目录,这里有一些解释。

为什么在 Linux 中文件夹被称为目录?

在我解释之前,让我们回顾一下文件夹和目录在现实世界中的用途。

在现实中,文件夹(封套)可以用来保存几个文件(或其他项目)。而目录则可以用来维护项目的索引,这样你就可以找到哪个项目位于哪里。

文件夹和目录的示意

现在,让我们回到目录。这个词甚至在 Linux 存在之前就已经存在了。它来自 UNIX 时代。Linux 继承了 UNIX 的很多东西,这只是其中的一个。

现在让我告诉你一些可能让你吃惊的事情。目录并不是真的把文件放在里面。目录是一个“特殊的文件”,它知道文件在存储中的位置(通过 inode)。

这就说明了为什么它被称为目录。目录用来保存项目的索引,而不用保存项目本身。Linux 和 UNIX 中的目录并不保存它里面的文件。它们只是记录文件位置的信息。

如果你想了解更多关于它的信息,我这篇关于 硬链接 的文章应该可以帮助你。

那么,为什么它被称为文件夹呢?依我看,这是视角的原因。当你在一个图形环境中时,你会将事物可视化。在这里,文件可以像页面一样被可视化,这些文件页面被存储在一个封套(文件夹)中。

当操作系统开始使用图形元素时,我认为一些术语也相应地发生了变化,目录 -> 文件夹就是其中之一。

你应该叫它文件夹还是目录?

这完全取决于你。你可以按你的习惯使用这两个术语。

然而,如果你正在学习 Linux 命令行或经常使用它,使用目录这个术语可能会有一点帮助。

有一些 Linux 命令,如 mkdirrmdir 等,术语 “dir” 给出了一个提示,即这些命令与目录有关。

同样,许多 Linux 命令和 bash 脚本会使用选项 -d 表示目录,-f 表示文件。

甚至终端中的文件属性也会通过在目录前面加上字母 “d” 来区分文件和文件夹(目录)。

拿这个例子来说,我有一个名为 some 的文件和一个名为 something 的文件夹/目录。请注意各种 Linux 命令是如何用 “dir” 或 “d” 来区分文件和目录的。

显示文件和目录操作之间区别的例子

所有这些让我觉得,在使用 Linux 命令时,使用 “目录” 这个术语会有好处。你的潜意识会更容易将 “dir” 和 “d” 与目录联系起来。

再说一次,你想叫它文件夹或目录这完全取决于你。人们会明白你指的是什么。

我刚刚对目录一词的历史渊源做了一些分析,这应该会给你一些提示,为什么人们说 “在 Linux/UNIX 中,所有东西都是一个文件”。

现在我结束了我的胡言乱语,我请你对它进行评论。如果你发现任何技术上的不准确之处,请告诉我。


via: https://itsfoss.com/folder-directory-linux/

作者:Abhishek Prakash 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如标题所示,本文将涵盖面向初学者的 Bash Shell 脚本知识。虽然本文没有回顾 Bash 的历史,但是有很多资源能够便于读者了解相关内容,读者也可以直接访问 https://www.gnu.org/software/bash/ 上的 GNU 项目。我们会从了解一些非常基本的概念开始,然后再将相关知识综合起来。

创建脚本文件

首先来创建一个脚本文件。我们要确保当前目录为家目录。

cd ~

在主目录中创建示例文件。文件名可以是任意名称,本文使用 learnToScript.sh 作为文件名。

touch learnToScript.sh

此时家目录中就生成了一个名为 learnToScript.sh 的文件。输入以下命令以检验该文件是否存在,还可以注意到其权限是 -rw-rw-r–

[zexcon@trinity ~]$ ls -l
total 7
drwxr-xr-x. 1 zexcon zexcon   90 Aug 30 13:08 Desktop
drwxr-xr-x. 1 zexcon zexcon   80 Sep 16 08:53 Documents
drwxr-xr-x. 1 zexcon zexcon 1222 Sep 16 08:53 Downloads
-rw-rw-r--. 1 zexcon zexcon   70 Sep 17 10:10 learnToScript.sh
drwxr-xr-x. 1 zexcon zexcon    0 Jul  7 16:04 Music
drwxr-xr-x. 1 zexcon zexcon  318 Sep 15 13:53 Pictures
drwxr-xr-x. 1 zexcon zexcon    0 Jul  7 16:04 Public
drwxr-xr-x. 1 zexcon zexcon    0 Jul  7 16:04 Videos
[zexcon@trinity ~]$

正式开始之前还有一件事要做。可以试一下在没有写入任何内容的情况下执行脚本,命令行输入以下内容:

./learnToScript.sh
[zexcon ~]$ ./learnToScript.sh
bash: ./learnToScript.sh: Permission denied

提示权限被拒绝,因为该文件没有执行权限。所以你需要更改文件的权限才能执行脚本。如果你不熟悉权限相关知识,建议阅读 Paul W. Frields 写的 Fedora 杂志文章。

假定我们已经了解了权限相关知识,回到终端更改 learnToScript.sh 文件,增加执行权限。输入以下内容:

chmod 755 learnToScript.sh
[zexcon@trinity ~]$ ls -l
total 7
drwxr-xr-x. 1 zexcon zexcon   90 Aug 30 13:08 Desktop
drwxr-xr-x. 1 zexcon zexcon   80 Sep 16 08:53 Documents
drwxr-xr-x. 1 zexcon zexcon 1222 Sep 16 08:53 Downloads
-rwxr-xr-x. 1 zexcon zexcon   70 Sep 17 10:10 learnToScript.sh
drwxr-xr-x. 1 zexcon zexcon    0 Jul  7 16:04 Music
drwxr-xr-x. 1 zexcon zexcon  318 Sep 15 13:53 Pictures
drwxr-xr-x. 1 zexcon zexcon    0 Jul  7 16:04 Public
drwxr-xr-x. 1 zexcon zexcon    0 Jul  7 16:04 Videos
[zexcon@trinity ~]$

好的,现在一切准备就绪,你已经获得了 learnToScript.sh 命令的读取、写入和执行权限 (-rwxr-xr-x)。

编辑脚本文件

下面的内容需要你熟悉 vim 或其他类似的文本编辑器,本文选用 vim。在命令提示符下输入以下内容:

vim learnToScript.sh

这会打开一个空的文本文件,里面有一堆波浪号。键盘输入 i 将进入插入模式。通过查看终端窗口的左下角,你可以确认它处于该模式。(友情推荐,nano 编辑器也很不错。)

接下来我们要确保文件被正确的解释器识别。因此,输入 #! 和 bash 的目录 /bin/bash

#!/bin/bash

本文教程步骤的最后一件事是保存文档。按 Esc 退出输入模式,然后按 Shift+:。在冒号处输入 wq,按下回车键,就会写入(w)文件并退出(qvim 编辑器。

使用 vim 时要记住,要想写入文档,就需要输入 i,此时你会在底部看到 –INSERT–。要保存文档,就需要按 Esc 退出输入模式,然后按 Shift+:,输入 w 写入文件;或者按 Esc,然后 Shift+: 输入 q,实现退出而不保存;或者将 wq 连在一起,可以实现写入并关闭文件。Esc 本身就只是退出插入模式。你可以在其 官方网站教程网站 上找到更多关于 vim 的信息。

开始正式写脚本

echo 命令

echo 命令用于向终端返回一些信息,可以使用单引号、双引号或不使用引号。那么让我们用一个传统的 Hello World 来试试它!

#!/bin/bash

echo Hello World!
echo 'Hello World!'
echo "Hello World!"
[zexcon ~]$ ./learnToScript.sh
Hello World!
Hello World!
Hello World!
[zexcon ~]$

注意,上述三行得到了相同的结果。使用单引号、双引号或不使用引号的结果不是一定相同的,但在这个基本脚本中确实得到了同样的结果。在某些情况下,引号的类型不同会导致结果差异。至此恭喜你编写了第一个 Bash 脚本。当你继续创建更多脚本并放飞你的想法时,可能会需要了解以下更多的知识。

命令替换 $( ) 和

命令替换可以实现以下效果:获取在命令行执行命令的结果,并将该结果写入变量。例如,如果在命令提示符下输入 ls,可以获得当前工作目录的列表。我们用这个命令来实践一下。命令替换选项有两个,请注意:第一个选项使用键盘左侧 Tab 键上方的反引号。它与波浪号 ~ 在一个键位上。第二个选项使用 shell 变量。

#!/bin/bash

command1=`ls`
echo $command1

command2=$(ls)
echo $command2
[zexcon ~]$ ./learnToScript.sh
Desktop Documents Downloads learnToScript.sh Music Pictures Public snap Videos
Desktop Documents Downloads learnToScript.sh Music Pictures Public snap Videos
[zexcon ~]$

注意变量、等号和命令开头之间不要有空格。使用这两个选项得到的结果是完全相同的。请注意,变量需要以美元符号开头。如果你忘记了,并且回显了不带美元符号的命令变量,会只输出命令的名称,如下所示:

#!/bin/bash

command1=`ls`
echo command1

command2=$(ls)
echo command2
[zexcon ~]$ ./learnToScript.sh
command1
command2
[zexcon ~]$

双括号 (())

那么双括号有什么用呢? 很简单,双括号用于数学方程式。

#!/bin/bash

echo $((5+3))
echo $((5-3))
echo $((5*3))
echo $((5/3))
[zexcon ~]$ ./learnToScript.sh
8
2
15
1
[zexcon ~]$

结语

至此,我们已经创建了第一个脚本。我们知道了如何执行多个命令:将它们放在一个脚本中并运行,就可以获得结果。下一篇文章会继续讨论,了解输入和输出的重定向、管道命令、使用双括号或者添加注释等知识。


via: https://fedoramagazine.org/bash-shell-scripting-for-beginners-part-1/

作者:zexcon 选题:lujun9972 译者:unigeorge 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

用一个带有虚拟化软件的系统(CentOS ISO),花费一个小时左右来设置一套自给自足的基本 Linux 服务器。

 title=

当学习新的 Linux 技能时(或像我一样学习 Linux 认证),在笔记本电脑上有一些可用的虚拟机(VM)是很有帮助的,这样你就可以在上面学习。

但是,如果在没有良好互联网连接的地方,你却想在一个 Web 服务器上工作,该怎么办? 想要使用没有安装过的其他软件,该怎么办? 如果需要从发行版的存储库中下载它,那么你可能会碰壁。只要做一点准备,你就可以设置一个 家庭实验室,你就在任何地方安装所需的任何东西,无论是否有网络连接。

要求如下:

  • 一个你打算使用的已下载的 Linux 发行版(例如,CentOS、Red Hat 等)ISO 文件
  • 一台具有虚拟化功能的主机。这里使用带有 KVMvirt-managerFedora,但其它 Linux 也可以类似工作。你甚至可以使用 Windows 或 Mac 进行虚拟化,但在实现方面存在一些差异
  • 大约一个小时

1、为存储主机创建一个虚拟机

使用 virt-manager 创建一个中等规格的虚拟机:1GB RAM、一个 CPU 和 16GB 磁盘空间就足够。

在虚拟机上安装 CentOS 7

 title=

选择你的语言并继续。

单击 “ 安装位置 Installation Destination ”,选择本地磁盘,勾选 “ 自动配置分区 Automatically Configure Partitioning ” 复选框,然后单击左上角的 “ 完成 Done ”。

在 “ 软件选择 Software Selection ” 下,选中 “ 基础设施服务器 Infrastructure Server ” ,选中 “ FTP 服务器 FTP Server ” 复选框,然后单击 “ 完成 Done ”。

 title=

选择 “ 网络和主机名 Network and Host Name ”,启用右上方的 “ 以太网 Ethernet ” ,然后单击左上角的 “ 完成 Done ”。

单击 “ 开始安装 Begin Installation ” 开始安装操作系统。

在安装时务必设置一个 root 密码,就可以创建一个带有密码的用户。

2、启动 FTP 服务

下一步是启动并设置 FTP 服务以运行并允许它通过防火墙。

用 root 密码登录,然后启动 FTP 服务器:

systemctl start vsftpd

允许它在每次启动时都能工作:

systemctl enable vsftpd

设置防火墙允许通过的端口:

firewall-cmd --add-service=ftp --perm

立即启用此更改:

firewall-cmd --reload

获取你的 IP 地址:

ip a

(可能是 eth0),在之后会用到。

3、复制本地存储库中的文件

通过虚拟化软件将安装 CD 挂载到虚拟机。

创建待挂载光盘的临时目录:

mkdir /root/temp

挂载安装 CD:

mount /dev/cdrom /root/temp

将所有文件复制到 FTP 服务器目录下:

rsync -avhP /root/temp/ /var/ftp/pub/

4、将服务器指向本地存储库

基于 Red hat 的系统使用以 repo 结尾的文件来确定从哪里获得软件更新和新的软件。这些文件在以下路径

cd /etc/yum.repos.d

你需要摆脱那些使你的服务器在互联网上寻找 CentOS 存储库的存储库文件。可以把它们复制到根目录下保存起来:

mv * ~

然后创建一个新的存储库文件来指向你的服务器。使用常用的文本编辑器创建一个名为 network.repo 文件,输入以下内容(将 <your IP> 替换为在步骤 2 中获得的 IP 地址),然后保存:

[network]
name=network
baseurl=ftp://192.168.122.<your ip>/pub
gpgcheck=0

完成后,可以用下面的命令来测试:

yum clean all; yum install ftp

如果 FTP 客户端按照预期从 “network” 存储库安装,那么本地仓库就已经设置好了!

 title=

5、使用你设置的存储库安装一个新的虚拟机

回到虚拟机管理器,并创建另一个虚拟机。但这一次,选择 “ 网络安装 Network Install ”, URL 为:

ftp://192.168.122.<your IP>/pub

如果你使用的是不同的宿主机操作系统或虚拟管理器,像前面一样安装虚拟机,并进行下一步。

6、将新的虚拟机设置为使用现有的“network”存储库

你可以从现有服务器复制存储库文件到这里使用。

和第一个服务器示例一样,输入:

cd /etc/yum.repos.d
mv * ~

然后:

scp [email protected].<your IP>:/etc/yum.repos.d/network.repo /etc/yum.repos.d

现在可以使用新的虚拟机并从本地存储库获取所有软件了。

再测试一遍:

yum clean all; yum install screen

这将从本地存储服务器安装软件。

这种设置,让你能够脱离网络安装软件,创建一个更可靠的环境,扩展你的技能。


via: https://opensource.com/article/19/6/create-centos-homelab-hour

作者:Bob Murphy 选题:lujun9972 译者:JaphiaChen 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

下面是我如何通过访问虚拟 Linux 服务器,在大型机上编译和玩我最喜欢的游戏。

 title=

可以 在现代大型机上运行 Linux 的能力为在该平台上做各种事情打开了大门。一个 Apache HTTP 服务器?很简单!一个数据库?你想用 SQL 还是 NoSQL?Kubernetes?当然没问题!正如我在 大型机上的 Linux:过去和现在 中总结的那样,今天所有最流行的服务器 Linux 发行版都有大型机的版本。

这对那些在大型机上运行关键任务基础设施的公司来说是个好消息,但如果你只是想玩玩大型机呢?我第一次在 IBM LinuxONE 上使用 bash shell 时,安装了 irssi 聊天客户端,向 IRC 上的所有朋友展示了 /proc/cpuinfo 的输出,以炫耀这是一个 s390x 架构的系统。

一开始,我对下一步该做什么感到茫然。然后我想,用这台巨大的计算机来玩游戏会很有趣。我首先想到的是 NetHack,但事实证明,我可以用简单的 apt install nethack-console 来安装它。不,我应该编译一些东西才好玩!对于每一种计算机架构,你都需要为其编写的编译器和解释器。Linux 在大型机上已有 20 多年的历史,你通常期望的大多数编译器和解释器都已经被移植了。

在我的成长过程中,我最喜欢的游戏之一是俄罗斯方块,所以它是我进行实验的合理选择。我找到了一个用 C 语言编写的开源俄罗斯方块游戏,叫做 vitetris,并试了试。这就像在任何其他 Linux 服务器上编译一个 C 语言程序一样。

首先,我需要安装一些依赖项。这台主机运行的是 Linux,所以我可以用我的包管理器来 安装构建需求,然后我就顺利完成了。

接下来,就是获取代码和构建的问题了:

curl -LO https://github.com/vicgeralds/vitetris/archive/v0.58.0.tar.gz
tar xvf v0.58.0.tar.gz
cd vitetris-0.58.0/
./configure
make

不一会儿,我就开始玩我最喜欢的游戏了!

./tetris

 title=

正如我所说,这与在 Linux 服务器上构建其他 C 程序完全一样,但你是在大型机上做的。

不幸的是,我的车库里还没有一台大型机。相反,我是在马里斯特学院通过 IBM LinuxONE 社区云 计划托管的虚拟服务器上完成了这一切。它让你免费访问一个 s390x 架构的 Linux 服务器,你可以选择最流行的发行版。通过这个虚拟服务器,你可以在 120 天内进行实验。

如果你是一个开源项目的代表,正在考虑在 s390x 上为 Linux 构建你的应用,也有一个项目适合你。当我不玩俄罗斯方块的时候,我在 IBM 的实际工作就是与开源社区合作来做这件事。你可以请求一个永久的 Linux 虚拟服务器供你的社区用于开发,无论是进行手动测试以查看你的应用是否会构建,或正式将其添加到项目的持续集成系统中都行。我建议从社区云开始做一些实验,然后你可以填写 这个表格 来启动获得永久虚拟服务器的流程。


via: https://opensource.com/article/21/12/mainframe-tetris

作者:Elizabeth K. Joseph 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出