0%

GitHub已经是全球开源代码的大本营了,通过以下统计你可以看到仅仅javascript在github就有超过32万个活动的repo。很多开发人员都会把自己的一部分代码分享到github上进行开源,一方面可以提高自己在编程领域的知名度,也可以吸引其他的开发人员帮助你一起改进,当然还可以认识更多的朋友,要不怎么说github其实是个交友网站呢。

github-code-stats

但是github上免费的repo只能是公开的,对于一些我们不希望完全开源的项目,就没有办法免费分享了,当然你可以付费升级到专业版,这样就可以托管私有repo了。

Visual Studio Team System是微软提供的免费的企业级软件开发Saas服务,提供免费的私有git repo服务。我周围的很多朋友都将自己或者公司的项目托管在VSTS上,其中也有一部分是开源的。

结合GitHub免费的公有repo和VSTS上免费的私有repo,我们可以搭建一套内外结合的开源代码开发平台,让我们可以控制哪些代码开源,同时接受社区对开源代码的贡献。常见场景主要有:

  • 将私有的repo的master分支与公有repo的master分支进行双向同步,支持主要发行版与社区的分享,接受PR。
  • 将私有repo的特定分支与公有repo的master分支进行双向同步,支持特定发行版与社区的分享,接受PR;在内部经过新一轮PR后并入私有master分支。
  • 支持私有发行版与公有发行版的差异化发布。
  • 支持自动和手动同步。

在VSTS上创建CI来完成同步配置

VSTS上的CI引擎内置对GitHub和VSTS本身自带的git的支持,借助这个功能我们可以很容易的建立同步机制。

1. 建立从VSTS到GitHub的同步作业

建立一个构建定义,使用Empty的模版,选择VSTS上的repo作为代码来源

build-def-from-vsts

在里面添加2个Command line的任务,分别配置成以下命令

Git pull https://github.com/ups216/vsalm-hols.git master
Git push https://$(githubtoken)@github.com/ups216/vsalm-hols.git head:master

build-def-vsts-cmd1

build-def-vsts-cmd2

你会注意到在第二个命令中我使用了一个叫做$(githubtoken)的参数。你可以通过GitHub生成这样一个Personal Access Token,并使用以下页面绑定到构建定义,这样在运行的时候用户是看不到这个token的具体内容的。

build-def-vsts-pat

注意图中箭头所指向的加锁标注,VSTS会采用加密的方式存储密钥,确保用户看不到具体内容。

2. 建立从GitHub到VSTS的同步作业

这里的配置过程相反,在第一步我们创建一个从GitHub上获取代码的构建定义

build-def-from-github

然后运行以下两个命令

Git pull https://$(vststoken)@almnetworks.visualstudio.com/DefaultCollection/_git/vsalm-hols master
Git push https://$(vststoken)@almnetworks.visualstudio.com/DefaultCollection/_git/vsalm-hols head:master

你会注意到这里在pull和push的命令上都用了$(vststoken)参数,这是因为我们所操作的vsts上的repo是一个私有的repo,读取和写入都需要认证。

建立好以上配置我们就可以测试这个双向同步过程了,以下是测试视频:

以上是最简单的真对master分支的双向同步配置,如果需要同步特定分之,我们只需要对git命令进行简单修改即可。


请关注微信公众号 【devopshub】,获取更多关于DevOps研发运维一体化的信息

qrcode_for_gh_b7c158df1fd1_430

目录


1. 持续集成介绍

1.1 概念

1.2 持续集成的好处

2. GitLab持续集成(CI)

2.1 简介

2.2 GitLab简单原理图

2.3 GitLab持续集成所需环境

2.4 需要了解知识

3. 搭建GitLab持续集成环境(NET版)

3.1 环境搭建

3.1.1 基础环境搭建

3.1.2 Git安装

3.1.3 NuGet安装

3.2 相关配置

3.2.1 Git环境变量配置

3.2.2 PowerShell调用测试

3.2.3 GitLab-Runner下载

3.3 GitLab查看项目的Runners

3.4 构建GitLab-Runner服务

3.4.1 介绍

3.4.2 下载软件(没下载的请下载)

3.4.3 注册信息

3.4.4 开启gitlab-runner服务

3.4.5 修改协议config.toml文件(重要)

3.5 构建.gitlab-ci.yml脚本

3.6 完成配置

4. 常见问题解决

4.1 GitLab出现Pending卡住

4.2 GitLab CI乱码问题

4.3 明明错误,但Build成功

4.4 .gitlab-ci.yml脚本错误


1. 持续集成介绍


1.1 概念

持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

image

1.2 持续集成的好处

1)快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。

2)防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。

2. GitLab****持续集成(CI)


2.1 简介

在GitLab 8.0+提供了持续集成的功能,在GitLab中有个Runners的概念。

Runner一共有三种类型

  1. 本地Runner

  2. 普通的服务器上的Runner

  3. 基于Docker的Runner

2.2 GitLab****简单原理图

image 

本文只介绍GitLab对NET进行持续集成

2.3 GitLab****持续集成所需环境

开发环境:VS2015、Git

GitLab****服务器环境:GitLab 8.0+

Runner-CI****服务器:window、Git、Msbuild、Nuget、PowerShell、GitLab-Runner

2.4 需要了解知识

Git操作、GitLab、Msbuild&Nuget命令行、Powershell命令行

3. 搭建GitLab持续集成环境(NET版)


3.1 环境搭建

image

3.1.1 基础环境****搭建

找一台电脑(服务器最好)系统安装为window 7(x64,改成英文版最好),并且机子安装了.net framework4.0运行环境(里面要有MsBuild)

3.1.2 Git****安装

安装Git,下载地址 https://git-scm.com/download/win

image005

3.1.3 NuGet****安装

安装NuGet.exe,下载地址:http://nuget.codeplex.com/downloads/get/669083

3.2 相关配置

3.2.1 Git****环境变量配置

计算机右键—>属性里单击选择—>环境变量

image010

Git 目录下的 bin(如 C:\Program Files (x86)\Git\bin)添加到 PATH 环境变量。

如下图:选择 PATH编辑,将 bin 的路径(C:\Program Files (x86)\Git\bin)添加到变量值

image012

详细配置参考方法(二选一即可)

【手动配置环境变量】

http://jingyan.baidu.com/article/fec4bce271601ff2618d8be3.html

【Git安装自动配置环境变量】

http://jingyan.baidu.com/article/9f7e7ec0b17cac6f2815548d.html

3.2.2 PowerShell****调用测试

PowerShell是调用方式(GitLab提供很多种方式),本文只针对PowerShell方式进行演示。PowerShell可以理解为就是cmd的升级版。

打开PowerShell,测试Git、MsBuild、NuGet命令行能否在PowerShell中使用(如果不想测试,请继续往下看)。

image014

举例:

测试Git

image017

3.2.3 GitLab-Runner****下载

首先,下载gitlab-ci-multi-runner-windows-amd64,并将其放到C:\CI

下载地址:

https://gitlab-ci-multi-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-ci-multi-runner-windows-amd64.exe

3.3 GitLab****查看项目的Runners

点击一个项目->Settings->Runners, 得到Url****地址①registration token****②

image018

image020

image022

3.4 构建GitLab-Runner服务

3.4.1 介绍

基础环境已经搭建完成,如何将这台计算机真正变成一台Runner-CI服务器,我们需要详细介绍一下。

image

3.4.2 下载软件(没下载的请下载)

首先,下载gitlab-ci-multi-runner-windows-amd64,并将其放到 D:\CI_Test

下载地址:

https://gitlab-ci-multi-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-ci-multi-runner-windows-amd64.exe

3.4.3 注册信息

运行cmd命令(以管理员身份打开cmd)

image026

输入命令为:

cd \

cd ci

gitlab-ci-multi-runner-windows-amd64.exe register

根据提示,填写

  1. GitLab->Runners的Url地址①

  2. GitLab->Runners的registration token②

  3. runner名称,这个随便写

  4. 分支名,master

  5. 协议方式,shell

如下图填写信息红色部分

image028

3.4.4 开启gitlab-runner服务

输入开启命令,并检查window服务中和GitLab->Runners中是否开启成功

gitlab-ci-multi-runner-windows-amd64.exe install

gitlab-ci-multi-runner-windows-amd64.exe start

 image030

 image032

image034

3.4.5 修改协议config.toml文件(重要)

注册成功后,在文件夹中找到config.toml,在[[runners]]后面添加**shell = “powershell”**节点

image036

 image038

3.5 构建.gitlab-ci.yml脚本

【.gitlab-ci.yml内容为】

复制代码

stages: - build

job:

stage: build

script: - echo “Restoring NuGet Packages…”

  • C:\test\nuget.exe restore “ConsoleApplication1.sln”

  • echo “Solution Build…”

  • C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe /p:Configuration=Debug /p:Platform=”Any CPU” /consoleloggerparameters:ErrorsOnly /maxcpucount /nologo /property:Configuration=Release /verbosity:quiet “ConsoleApplication1.sln” tags:

except: - tags

复制代码

下图红框中的命令,只要将路径修改为”ConsoleApplication1.sln”的实际路径就能直接从Powershell中运行。注意:如果报错”ConsoleApplication1.sln”找不到可以尝试变为”src/ConsoleApplication1.sln”

image040

3.6 完成配置

提交代码测试

成功:image042点击查看成功日志

失败:image044点击查看错误日志

编译中:image046点击查看编译中的日志

.gitlab-ci.yml脚本错误:image048,点击跳转到.gitlab-ci.yml验证页面

image050

4. 常见问题解决


4.1 GitLab****出现Pending卡住

请检查Runner-CI服务器的GitLab-Runner服务是否安装成功,Runners中的Url地址①是否正确。

image052

4.2 GitLab CI****乱码问题

GitLab返回信息乱码,一般是因为GitLab不能识别中文,一般乱码是PowerShell返回的中文,把PowerShell脚本独立运行看看是否报错。所以推荐window搞成英文版的,要是哪位大侠知道GitLab怎么识别中文麻烦分享下哈。

4.3 明明错误,但Build成功

错误截图如下,请检查Git环境变量是否配置,PowerShell脚本是否独立为一个文件

image

4.4 .gitlab-ci.yml****脚本错误

点击Lint,进行脚本验证,参考资料http://docs.gitlab.com/ee/ci/yaml/README.html

注意

image056

image058

 image060

感谢


劈荆斩棘:Gitlab 部署 CI 持续集成  感谢这篇文章让我少走了很多弯路

一、持续集成(Continuous Integration)

要了解GitLab-CI与GitLab Runner,我们得先了解持续集成是什么。

持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。

看完这段话,估计还是有点懵。怎么理解呢?我是这样理解的:

软件集成是软件开发过程中的一个环节,这个环节的工作一般会包括以下流程:_合并代码—->安装依赖—->编译—->测试—->发布_。软件集成的工作一般会比较细碎繁琐,为了不影响开发效率,以前软件集成这个环节一般不会经常进行或者只会等到项目后期再进行。但是有些问题,如果等到后期才发现,解决问题的代价很大,有可能导致项目延期或者失败。因此,为了尽早发现软件集成错误,鼓励团队成员应该经常集成他们的工作,通常每个成员每天应该至少集成一次。这就是所说的持续集成。所以说,持续集成是一种软件开发实践。

软件集成的工作细碎繁琐,以前是由人工完成的。但是现在鼓励持续集成,那岂不是要累死人,还影响开发效率。所以,应该考虑将软件集成这个工作自动化,这就出现了所谓的持续集成系统。

持续集成详情见百度百科-持续集成

二、GitLab-CI

GitLab-CI就是一套配合GitLab使用的持续集成系统(当然,还有其它的持续集成系统,同样可以配合GitLab使用,比如Jenkins)。而且GitLab8.0以后的版本是默认集成了GitLab-CI并且默认启用的。

三、GitLab-Runner

那GitLab-Runner又是什么东东呢?与GitLab-CI有什么关系呢?

GitLab-Runner是配合GitLab-CI进行使用的。一般地,GitLab里面的每一个工程都会定义一个属于这个工程的软件集成脚本,用来自动化地完成一些软件集成工作。当这个工程的仓库代码发生变动时,比如有人push了代码,GitLab就会将这个变动通知GitLab-CI。这时GitLab-CI会找出与这个工程相关联的Runner,并通知这些Runner把代码更新到本地并执行预定义好的执行脚本。

所以,GitLab-Runner就是一个用来执行软件集成脚本的东西。你可以想象一下:Runner就像一个个的工人,而GitLab-CI就是这些工人的一个管理中心,所有工人都要在GitLab-CI里面登记注册,并且表明自己是为哪个工程服务的。当相应的工程发生变化时,GitLab-CI就会通知相应的工人执行软件集成脚本。如下图所示:

GitLab-CI与GitLab-Runner关系示意图

Runner可以分布在不同的主机上,同一个主机上也可以有多个Runner。

Runner类型

GitLab-Runner可以分类两种类型:Shared Runner(共享型)和Specific Runner(指定型)。

Shared Runner:这种Runner(工人)是所有工程都能够用的。只有系统管理员能够创建Shared Runner。

Specific Runner:这种Runner(工人)只能为指定的工程服务。拥有该工程访问权限的人都能够为该工程创建Shared Runner。

四、GitLab-Runner的安装与使用

我的操作系统是:Centos 7.0 64位

安装gitlab-ci-multi-runner

  • 添加yum源

    1
    curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
  • 安装

    1
    yum install gitlab-ci-multi-runner

    这里是官网的安装教程,其它操作系统的请参考
    https://gitlab.com/gitlab-org/gitlab-ci-multi-runner

使用gitlab-ci-multi-runner注册Runner

安装好gitlab-ci-multi-runner这个软件之后,我们就可以用它向GitLab-CI注册Runner了。

向GitLab-CI注册一个Runner需要两样东西:GitLab-CI的url和注册token。
其中,token是为了确定你这个Runner是所有工程都能够使用的Shared Runner还是具体某一个工程才能使用的Specific Runner。

如果要注册Shared Runner,你需要到管理界面的Runners页面里面去找注册token。如下图所示:

Shared Runner

如果要注册Specific Runner,你需要到项目的设置的Runner页面里面去找注册token。如下图所示:

Specific Runner

找到token之后,运行下面这条命令注册Runner(当然,除了url和token之外,还需要其他的信息,比如执行器executor、构建目录builds_dir等)。
gitlab-ci-multi-runner register
注册完成之后,GitLab-CI就会多出一条Runner记录,如下图所示:

GitLab-CI Runner

GitLab-CI会为这个Runner生成一个唯一的token,以后Runner就通过这个token与GitLab-CI进行通信。

那么,问题来了。注册好了的Runner的信息存放在哪儿了呢?
原来,Runner的信息是存放在一个配置文件里面的,配置文件的格式一般是.toml。这个配置文件的存放位置有以下几种情况:

  • 在类Unix操作系统下(0.5.0之后版本)
    1. 如果是以root用户身份运行gitlab-ci-multi-runner register,那么配置文件默认是/etc/gitlab-runner/config.toml
    2. 如果是以非root用户身份运行gitlab-ci-multi-runner register,那么配置文件默认是~/.gitlab-runner/config.toml
  • 在其他操作系统下以及0.5.0之前版本
    配置文件默认在当前工作目录下./config.toml

一般情况下,使用默认的配置文件存放Runner的配置信息就可以了。当然,如果你有更细化的分类需求,你也可以在注册的时候通过-c--config选项指定配置文件的位置。具体查看register命令的使用方法:gitlab-ci-multi-runner register --help

问题:如果不运行gitlab-ci-multi-runner register命令,直接在配置文件里面添加Runner的配置信息可以吗?
回答:当然不可以。因为gitlab-ci-multi-runner register的作用除了把Runner的信息保存到配置文件以外,还有一个很重要的作用,那就是向GitLab-CI发出请求,在GitLab-CI中登记这个Runner的信息并且获取后续通信所需要的token。

让注册好的Runner运行起来

Runner注册完成之后还不行,还必须让它运行起来,否则它无法接收到GitLab-CI的通知并且执行软件集成脚本。怎么让Runner运行起来呢?gitlab-ci-multi-runner提供了这样一条命令gitlab-ci-multi-runner run-single,详情如下:

复制代码

[root@iZ25bjcxoq5Z ~]# gitlab-ci-multi-runner run-single –help
NAME:
run-single - start single runner

USAGE:
command run-single [command options] [arguments…]

OPTIONS: --name, –description Runner name [$RUNNER_NAME] --limit Maximum number of builds processed by this runner [$RUNNER_LIMIT] --ouput-limit Maximum build trace size [$RUNNER_OUTPUT_LIMIT] -u, –url Runner URL [$CI_SERVER_URL] -t, –token Runner token [$CI_SERVER_TOKEN] --tls-ca-file File containing the certificates to verify the peer when using HTTPS [$CI_SERVER_TLS_CA_FILE] --executor Select executor, eg. shell, docker, etc. [$RUNNER_EXECUTOR] --builds-dir Directory where builds are stored [$RUNNER_BUILDS_DIR] --cache-dir Directory where build cache is stored [$RUNNER_CACHE_DIR] --env Custom environment variables injected to build environment [$RUNNER_ENV] --shell Select bash, cmd or powershell [$RUNNER_SHELL] --ssh-user User name [$SSH_USER] --ssh-password User password [$SSH_PASSWORD] --ssh-host Remote host [$SSH_HOST] --ssh-port Remote host port [$SSH_PORT] --ssh-identity-file Identity file to be used [$SSH_IDENTITY_FILE] --docker-host Docker daemon address [$DOCKER_HOST] --docker-cert-path Certificate path [$DOCKER_CERT_PATH] --docker-tlsverify Use TLS and verify the remote [$DOCKER_TLS_VERIFY] --docker-hostname Custom container hostname [$DOCKER_HOSTNAME] --docker-image Docker image to be used [$DOCKER_IMAGE] --docker-privileged Give extended privileges to container [$DOCKER_PRIVILEGED] --docker-disable-cache Disable all container caching [$DOCKER_DISABLE_CACHE] --docker-volumes Bind mount a volumes [$DOCKER_VOLUMES] --docker-cache-dir Directory where to store caches [$DOCKER_CACHE_DIR] --docker-extra-hosts Add a custom host-to-IP mapping [$DOCKER_EXTRA_HOSTS] --docker-links Add link to another container [$DOCKER_LINKS] --docker-services Add service that is started with container [$DOCKER_SERVICES] --docker-wait-for-services-timeout How long to wait for service startup [$DOCKER_WAIT_FOR_SERVICES_TIMEOUT] --docker-allowed-images Whitelist allowed images [$DOCKER_ALLOWED_IMAGES] --docker-allowed-services Whitelist allowed services [$DOCKER_ALLOWED_SERVICES] --docker-image-ttl [$DOCKER_IMAGE_TTL] --parallels-base-name VM name to be used [$PARALLELS_BASE_NAME] --parallels-template-name VM template to be created [$PARALLELS_TEMPLATE_NAME] --parallels-disable-snapshots Disable snapshoting to speedup VM creation [$PARALLELS_DISABLE_SNAPSHOTS] --virtualbox-base-name VM name to be used [$VIRTUALBOX_BASE_NAME] --virtualbox-disable-snapshots Disable snapshoting to speedup VM creation [$VIRTUALBOX_DISABLE_SNAPSHOTS]

复制代码

要让一个Runner运行起来,--url--token--executor选项是必要的。其他选项可根据具体情况和需求进行设置。我们可以看出来,这个命令里面的选项跟配置文件中Runner的配置项基本上是一样的。那这个命令的运行和配置文件有没有什么关系呢?从我的试验和思考来看,应该是没有什么关系的。因为:

  1. 这个命令里面并没有指定配置文件位置的选项,如果读取配置文件难道去读取默认位置吗?但是配置文件的位置是可以指定的,不一定在默认位置,这不符合逻辑,所以它应该不会去读配置文件。
  2. 我删掉配置文件,这个命令依然能够运行

所以,这个命令应该只是一个能让Runner运行起来的基础命令。但这个命令运行起来的前提是,GitLab-CI中必须事先注册有这个Runner。

那配置文件有毛用?配置文件的作用在后面,但是从这里我们知道一点:配置文件里面有Runner运行时所需要的信息。

可能你还有一个问题:我用root的用户注册Runner时,注册完Runner就可以用了,并没有手动地去运行Runner啊?这个后面讲。

批量地运行Runner

正常情况下,如果我有多个Runner,我并不想手动一个个地运行,要是能一次运行多个Runner多爽啊!嗯哼,gitlab-ci-multi-runner就提供了这样一个命令gitlab-ci-multi-runner run,详情如下:

复制代码

[root@iZ25bjcxoq5Z gitlab-runner]# gitlab-ci-multi-runner run –help
NAME:
run - run multi runner service

USAGE:
command run [command options] [arguments…]

OPTIONS: -c, –config “/etc/gitlab-runner/config.toml” Config file [$CONFIG_FILE] -n, –service “gitlab-runner” Use different names for different services -d, –working-directory Specify custom working directory -u, –user Use specific user to execute shell scripts --syslog Log to syslog

复制代码

这个命令总共有5个选项,让我们从选项来理解一下这个命令:

  • -c, --config选项
    这个选项是用来指定配置文件路径的。如果你想同时运行多个Runner,你必须得知道你要运行哪些Runner以及这些Runner运行时所需要的信息。而前面我们说过,配置文件里面就存放着Runner运行时所需要的信息。而且一个配置文件是可以存放多个Runner的信息的。如果不指定这个选项,就会使用默认的配置文件。
  • -n, --service选项
    这个选项是用来指定服务的别名的。为什么要有这个选项呢?指定别名有什么意义呢?我们从上一个选项可以看出来,一次只能运行一批Runner,因为一次只能指定一个配置文件。那如果我有多个配置文件,我要运行多批Runner,那是不是给每一次批量运行服务取不同的别名来区分更好一点呢。
  • -d, --working-directory选项
    这个选项是用来指定此次批量运行服务的工作目录的。如果自己没有指定builds_dir的话,此次运行起来的Runner会把builds_dir放到这个目录里面。
  • -u, --user选项
    这个选项很重要,它指定了该以什么用户权限来运行Runner。为了安全,我认为不应该给运行Runner的用户过高的权限,更不应该以root用户来运行Runner。
  • --syslog选项
    如果指定了这个选项,则把日志记录到系统日志。

使用服务

能够批量地运行Runner已经很好了,但是还不够好,为什么呢?

首先,gitlab-ci-multi-runner run默认是前台运行的,使用体验不好;
其次,当gitlab-ci-multi-runner run在后台运行的时候,要查看其运行状态不方便,而且也没有提供停止gitlab-ci-multi-runner run的命令。
所以,要是能将批量运行Runner这个功能安装为一项服务,就更爽了!

gitlab-ci-multi-runner确实就提供了这样的功能。
installuninstallstartstoprestartstatus这6个命令就是和服务相关的。
我一开始对gitlab-ci-multi-runner的服务概念感觉比较懵,让我们来看看安装服务install这个命令到底干了一件什么事情。

复制代码

[root@iZ25bjcxoq5Z ~]# gitlab-ci-multi-runner install –help
NAME:
install - install service

USAGE:
command install [command options] [arguments…]

OPTIONS: --service, -n “gitlab-runner” Specify service name to use --working-directory, -d “/root” Specify custom root directory where all data are stored --config, -c “/etc/gitlab-runner/config.toml” Specify custom config file --user, -u Specify user-name to secure the runner

复制代码

从选项可以看出,一项服务的信息有4个:服务名、工作目录、配置文件和用户。这个命令的选项和gitlab-ci-multi-runner run的选项基本一样。可见,批量运行Runner和服务之间的关系暧昧。至于是什么关系,往下看gitlab-ci-multi-runner start这个命令。

1
2
3
4
5
6
7
8
9
[root@iZ25bjcxoq5Z ~]
NAME:
start - start service

USAGE:
command start [command options] [arguments...]

OPTIONS:

启动一项服务,只要指定服务的名称就行了(默认服务名称是gitlab-runner)。启动服务后,运行命令ps -aux | grep gitlab-runner查看后台程序,发现启动服务其实就是在后台执行了一个批量运行Runner的任务,所以服务安装命令的选项才会和批量运行Runner命令的选项基本一样。

还有stop命令用于停止服务,restart命令用于重启服务,status用于查看服务状态。这三个命令的使用方法和start类似,就不一一介绍了。

五、其他一些思考

  1. 什么情况下需要注册Shared Runner?
    比如,GitLab上面所有的工程都有可能需要在公司的服务器上进行编译、测试、部署等工作,这个时候注册一个Shared Runner供所有工程使用就很合适。

  2. 什么情况下需要注册Specific Runner?
    比如,我可能需要在我个人的电脑或者服务器上自动构建我参与的某个工程,这个时候注册一个Specific Runner就很合适。

  3. 什么情况下需要在同一台机器上注册多个Runner?
    比如,我是GitLab的普通用户,没有管理员权限,我同时参与多个项目,那我就需要为我的所有项目都注册一个Specific Runner,这个时候就需要在同一台机器上注册多个Runner。

六、最后

啰啰嗦嗦写了一堆,大体上也算把自己对GitLab-Runner的理解过程写清楚了。为了把GitLab-Runner的用法了解清楚,自己做了很多的测试,但也难全面,中间有一些内容也只是个人理解,未必准确,欢迎批评指正。

Gitea+Drone+Rancher CI/CD持续集成解决方案Gitea 关于Gitea Gitea 是一个自己托管 - 掘金

Excerpt

Gitea 关于Gitea Gitea 是一个自己托管的Git服务程序。他和GitHub, Bitbucket or Gitlab等比较类似。他是从 Gogs 发展而来,Gitea 是一个开源社区驱动


关于Gitea

Gitea 是一个自己托管的Git服务程序。他和GitHub, Bitbucket or Gitlab等比较类似。他是从 Gogs 发展而来,Gitea 是一个开源社区驱动的轻量级代码托管解决方案,采用 MIT 许可证。极易安装,运行非常快速,安装和使用体验良好的自建 Git 服务。并且他还支持跨平台,支持 Linux, macOS 和 Windows 以及各种架构,除了x86,amd64,还包括 ARM 和 PowerPC。

系统要求

  • 最低的系统硬件要求为一个廉价的树莓派
  • 如果用于团队项目,建议使用 2 核 CPU 及 1GB 内存

功能特性

  • 支持活动时间线
  • 支持 SSH 以及 HTTP/HTTPS 协议
  • 支持 SMTP、LDAP 和反向代理的用户认证
  • 支持反向代理子路径
  • 支持用户、组织和仓库管理系统
  • 支持添加和删除仓库协作者
  • 支持仓库和组织级别 Web 钩子(包括 Slack 集成)
  • 支持仓库 Git 钩子和部署密钥
  • 支持仓库工单(Issue)、合并请求(Pull Request)以及 Wiki
  • 支持迁移和镜像仓库以及它的 Wiki
  • 支持在线编辑仓库文件和 Wiki
  • 支持自定义源的 Gravatar 和 Federated Avatar
  • 支持邮件服务
  • 支持后台管理面板
  • 支持 MySQL、PostgreSQL、SQLite3、MSSQL 和 TiDB(MySQL) 数据库
  • 支持多语言本地化(21 种语言)
  • 支持软件包注册中心(Composer/Conan/Container/Generic/Helm/Maven/NPM/Nuget/PyPI/RubyGems)

安装

安装环境依赖

gitea 依赖于docker和docker-compose

安装docker

安装所需的安装包yum-utils:

1
yum install -y yum-utils

添加yum源

1
yum -y update #设置镜像仓库地址 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #更新yum软件包索引 yum makecache fase

查看可用版本

1
yum list docker-ce --showduplicates | sort -r

安装docker社区版和社区办对应的cli工具已经依赖

1
yum install -y docker-ce docker-ce-cli containerd.io

启动 Docker 并设置开机自启

1
systemctl start docker systemctl enable docker

添加镜像源地址

1
tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://uyah70su.mirror.aliyuncs.com"] } EOF

重新启动 Docker 服务

1
<span data-line-num="1">systemctl daemon-reload &amp;&amp; sudo systemctl restart docker</span>

验证配置是否生效

1
docker info | grep Mirrors -A1

安装docker-compose

安装epel源

1
yum install -y epel-release

安装docker-compose

1
<span data-line-num="1">yum install -y docker-compose</span>

安装gitea

安装参考链接:使用 Docker 安装 - Docs

最简单的设置只是创建一个卷和一个网络,然后将 gitea/gitea:latest 镜像作为服务启动。由于没有可用的数据库,因此可以使用 SQLite3 初始化数据库。创建一个类似 gitea 的目录,并将以下内容粘贴到名为 docker-compose.yml 的文件中。

1
version: "3" networks: gitea: external: false services: server: image: gitea/gitea:1.16.7 container_name: gitea environment: - USER_UID=1000 - USER_GID=1000 restart: always networks: - gitea volumes: - /home/data:/data # /home/data可以替换成你想要的挂载目录 - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro ports: - "3030:3000" # 3030可以替换成你想要的端口 - "322:22" # 322可以替换成22

在后台启动

1
<span data-line-num="1">docker-compose up -d</span>

配置gitea

访问 访问:http://server-ip:3030

设置域名访问地址等信息 Snipaste_2022-08-07_13-45-57.png 设置管理员账号密码 Snipaste_2022-08-07_13-49-05.png 点击安装后,系统安装完毕会自动登录

创建测试仓库

创建组织 Snipaste_2022-08-07_14-00-45.png 创建仓库 Snipaste_2022-08-07_13-49-05.png Snipaste_2022-08-07_14-04-35.png 创建一个SpringBoot项目 Snipaste_2022-08-07_14-15-20.png HelloController.java

1
@Slf4j @RestController @RequestMapping("/v1") public class HelloController { @GetMapping("hello") public String SayHello() { log.info("SayHello: hello world!"); return "hello world!"; } }

Dockerfile

1
FROM openjdk:8u332-jdk ENV SERVICE_PORTS=8080 RUN mkdir -p /app/ WORKDIR /app COPY ./start.sh /app/ COPY ./.dockerignore /app/ COPY ./claydemo-0.0.1.jar /app/ RUN chmod 755 -R /app/ ENTRYPOINT ["/app/start.sh"]

start.sh

1
#!/bin/sh java -Xms128m -Xmx128m -jar /app/claydemo*.jar --spring.profiles.active=dev if [ $? != 0 ]; then echo Failed to start java >&2 exit 1 fi

application-dev.properties

1
server.port=8080

Drone

关于Drone

Dron是一个现代化的持续集成平台,它使用强大的云原生pipeline引擎自动化构建、测试和发布工作流。Drone 与多个源代码管理系统无缝集成,包括 GitHub、GitHubEnterprise、Bitbucket、GitLab和Gitea;它的每个构建都在一个隔离的 Docker 容器中运行;另外它也支持插件,可以使用你熟知的语言轻松的扩展它们。

安装

依赖安装

需要安装docker和docker-compose,参照上方安装方式即可

安装Drone

安装参考: Gitea | Drone

此处同样采用docker-compose.yml的方式安装

1
version: '3' services: drone-server: restart: always image: drone/drone:2 ports: - "映射宿主机端口:80" volumes: - 宿主机挂载目录:/var/lib/drone/ - 宿主机挂载目录:/data/ environment: - DRONE_GITEA_SERVER=http://gitea服务器地址 # 支持http, https - DRONE_GITEA_CLIENT_ID=gitea生成的OAuth2客户端ID - DRONE_GITEA_CLIENT_SECRET=gitea生成的OAuth2客户端密钥 - DRONE_SERVER_HOST=drone服务器地址 - DRONE_SERVER_PROTO=http # 支持http, https - DRONE_RPC_SECRET=自定义的Drone与runner通信密钥 - DRONE_GIT_ALWAYS_AUTH=true - DRONE_GIT_USERNAME=部署账户的用户名 - DRONE_GIT_PASSWORD=部署账户的密码 - DRONE_USER_CREATE=username:你的管理员账户名,admin:true # 开启管理员账户 drone-runner-docker: restart: always image: drone/drone-runner-docker:1 ports: - "3000:3000" volumes: - /var/run/docker.sock:/var/run/docker.sock environment: - DRONE_RPC_PROTO=http # 支持http, https - DRONE_RPC_HOST=drone-server - DRONE_RPC_SECRET=自定义的Drone与runner通信密钥 - DRONE_RUNNER_NAME=drone-runner-docker - DRONE_RUNNER_CAPACITY=2

其中需要将gitea的授权信息填写到上方yml文件中

Gitea个人中心的应用设置创建Gitea OAuth application Snipaste_2022-08-07_14-26-05.png 点击创建后将秘钥妥善保管并替换到上面的docker-compose.yml

1
- DRONE_GITEA_CLIENT_ID=gitea生成的OAuth2客户端ID - DRONE_GITEA_CLIENT_SECRET=gitea生成的OAuth2客户端密钥 - DRONE_GIT_USERNAME=令牌名称 - DRONE_GIT_PASSWORD=令牌秘钥

生成Drone与runner通信密钥,并替换上面docker-compose.yml对应的字段

1
openssl rand -hex 16 93b722f581830b9abf11345536b9ecfb

启动drone

1
<span data-line-num="1">docker-compose up -d</span>

访问drone

访问:http://drone-server-domain Snipaste_2022-08-07_14-40-12.png 授权 Snipaste_2022-08-07_15-46-05.png 填写登录信息 7e22dd46559947ada73cb5605487610e.png 登录之后就可以看到刚刚我们gitea中的项目 Snipaste_2022-08-07_15-46-05.png 在设置中激活 1659858792624.png 激活保存 1659858832731.png

使用pipeline

在gitea项目增加.drone.yml文件,内容如下 1659859004218.png drone立马就收到提交事件,并及时构建 1659859026243.png 1659859080002.png

编写一个完整的## pipeline

.drone.yml

1
kind: pipeline type: docker name: claydemo steps: - name: build-jar # 流水线名称 image: maven:3.8.5-openjdk-8 # 定义创建容器的Docker镜像 volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置 - name: maven-cache path: /root/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载 - name: maven-build path: /app/build # 将应用打包好的Jar和执行脚本挂载出来 commands: # 定义在Docker容器中执行的shell命令 - mvn clean package -DskipTests=true # 应用打包命 - cp target/claydemo-1.0-SNAPSHOT.jar /app/build/claydemo-0.0.1.jar - cp start.sh /app/build/ - cp Dockerfile /app/build/ - cp .dockerignore /app/build/ - cp docker.sh /app/build/ - name: build-docker image: docker volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置 - name: maven-build path: /app/build # 将应用打包好的Jar和执行脚本挂载出来 - name: docker path: /var/run/docker.sock # 挂载宿主机的docker settings: dockerfile: /app/build/Dockerfile commands: # 定义在Docker容器中执行的shell命令 - cd /app/build - chmod +x docker.sh - sh docker.sh - docker ps volumes: # 定义流水线挂载目录,用于共享数据 - name: maven-build host: path: /home/data/maven/build # 从宿主机中挂载的目录 - name: maven-cache host: path: /home/data/maven/cache - name: docker host: path: /var/run/docker.sock

docker.sh

1
#!/bin/sh # 定义应用组名 group_name='clay' # 定义应用名称 app_name=${DRONE_REPO_NAME} # 定义应用版本 app_version='latest' echo '----copy jar----' docker stop ${app_name} echo '----stop container----' docker rm ${app_name} echo '----rm container----' docker rmi ${group_name}/${app_name}:${app_version} echo '----rm image----' # 打包编译docker镜像 docker build -t ${group_name}/${app_name}:${app_version} . echo '----build image----' docker run -p 8080:8080 --name ${app_name} \ -e TZ="Asia/Shanghai" \ -v /etc/localtime:/etc/localtime \ -d ${group_name}/${app_name}:${app_version} echo '----start container----'

运行结果 1659860404135.png 1659860484624.png

Rancher

Rancher 是供采用容器的团队使用的完整软件堆栈。它解决了管理多个Kubernetes集群的运营和安全挑战,并为DevOps团队提供用于运行容器化工作负载的集成工具。简单来说是一个k8s的管理软件!

安装

rancher的latest版本是2.6以上,本次安装v2.4.15

1
docker run -d --privileged --restart=unless-stopped -p 80:80 -p 443:443 --privileged rancher/rancher:v2.4.15

访问(注意是https) https://ip-server 输入admin 的密码 1659861472908.png 点击下一步,设置rancher的访问url,如果有域名则填写域名 1659861565669.png 进入管理页面 1659861619139.png

添加集群

点击右上角的添加集群 1659861716608.png 选择自定义 1659861756287.png 配置集训信息 1659861839152.png 点击下一步进入添加节点页面,由于当前集群还没有节点,所以主机选项中的每一个角色都需要选择 1659861949108.png 复制下方的命令到装有docker的主机中运行即可,注意rancher安装的主机和其他节点主机的ip都必须为静态ip,不然主机重启后集群就失效了,原因为主机重启后ip变更,k8s不能够通过ip找到对应的节点 1659862145815.png 集群正在添加节点(等待时间很漫长) 1659862165132.png 添加完成 1659862423973.png 1659862458725.png

完成gitea+drone+rancher ci/cd的全链路打通

在此之前已经实现gitea+drone的部署,现在需要完成drone+rancher的对接

drone+rancher

因为drone的pipeline每一个环节都是基于docker运行的,所以现在需要使用一个包含kubectl的命令行工具的docker进行,可以使用下面的命令拉取

1
docker pull registry.cn-hangzhou.aliyuncs.com/claywang/kubectl

将rancher中的Kubeconfig 文件 复制到drone所在的主机中,后边在运行的时候将改文件挂载到运行的docker容器中

创建命名空间 1659863657133.png 1659863691233.png 1659863714803.png 1659863739334.png 1659863763359.png 1659863782708.png 添加docker镜像的秘钥 1659865181637.png 1659865592171.png 1659865521711.png

修改对应的文件

添加 deployment.yml

1
apiVersion: v1 kind: Service metadata: name: $DRONE_REPO_NAME spec: type: ClusterIP ports: - protocol: TCP port: 8080 targetPort: 8080 selector: app: $DRONE_REPO_NAME --- apiVersion: apps/v1 kind: Deployment metadata: name: $DRONE_REPO_NAME spec: replicas: 1 selector: matchLabels: app: $DRONE_REPO_NAME template: metadata: labels: app: $DRONE_REPO_NAME spec: imagePullSecrets: - name: aliyun-docker-registry containers: - image: $REGISTRY/$REGISTRY_NAMESPACE/$DRONE_REPO_NAME:$DRONE_COMMIT name: $DRONE_REPO_NAME imagePullPolicy: Always env: - name: TIME_ZONE value: Asia/Shanghai - name: REF_NAME value: $DRONE_COMMIT_BRANCH resources: requests: memory: 0.1Gi cpu: 0.1 limits: memory: 2Gi cpu: 2 ports: - containerPort: 8080 name: app-port

更改.drone.yml文件

1
kind: pipeline type: docker name: claydemo steps: - name: build-jar image: maven:3.8.5-openjdk-8 # 定义创建容器的Docker镜像,maven:3.8.5-openjdk-8用于对java进行打包使用 volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置 - name: maven-cache path: /root/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载 - name: maven-build path: /app/build # 将应用打包好的Jar和执行脚本挂载出来 commands: # 定义在Docker容器中执行的shell命令 - mvn clean package -DskipTests=true # 应用打包命 - cp target/claydemo*.jar /app/build/claydemo-0.0.1.jar # 将打包后的内容复制到挂载目录下 - cp start.sh /app/build/ # java包的启动脚本 - cp Dockerfile /app/build/ # docker镜像打包时的文件 - cp deployment.yml /app/build/ # k8s部署文件 - cp .dockerignore /app/build/ # docker镜像打包时过滤文件 - cp docker.sh /app/build/ # docker 镜像打包脚本 - name: build-docker # 制作docker镜像 image: docker # 使用官方docker镜像 volumes: # 将容器内目录挂载到宿主机 - name: maven-build path: /app/build # 将应用打包好的Jar和执行脚本挂载出来 - name: docker path: /var/run/docker.sock # 挂载宿主机的docker environment: # 获取到密文的docker用户名和密码 DOCKER_USERNAME: from_secret: docker_username DOCKER_PASSWORD: from_secret: docker_password REGISTRY: from_secret: registry REGISTRY_NAMESPACE: from_secret: registry_namespace commands: # 定义在Docker容器中执行的shell命令 - cd /app/build - sed -i 's/$REGISTRY/'"$REGISTRY"'/' deployment.yml - sed -i 's/$REGISTRY_NAMESPACE/'"$REGISTRY_NAMESPACE"'/' deployment.yml - echo $DOCKER_PASSWORD | docker login $REGISTRY --username $DOCKER_USERNAME --password-stdin - chmod +x docker.sh - sh docker.sh - docker rmi -f $(docker images | grep $DRONE_REPO_NAME | awk '{print $3}') - name: drone-rancher # rancher运行 image: registry.cn-hangzhou.aliyuncs.com/claywang/kubectl #阿里云的kubectl镜像,里面包含kubectl命令行工具 volumes: # 将容器内目录挂载到宿主机 - name: maven-build path: /app/build # 将应用打包好的Jar和执行脚本挂载出来 - name: config path: /app/config # 将kubectl 配置文件挂载出来 commands: # 定义在Docker容器中执行的shell命令 - cd /app/build - sed -i 's/$DRONE_COMMIT/'"$DRONE_COMMIT"'/' deployment.yml - sed -i 's/$DRONE_REPO_NAME/'"$DRONE_REPO_NAME"'/' deployment.yml - sed -i 's/$DRONE_COMMIT_BRANCH/'"$DRONE_COMMIT_BRANCH"'/' deployment.yml - kubectl apply -f deployment.yml -n demo --kubeconfig=/app/config/rancher的kubectl配置文件 volumes: # 定义流水线挂载目录,用于共享数据 - name: maven-build # maven打包后的文件 host: path: 从宿主机中挂载的目录 - name: config # k8s对接的配置文件 host: path: rancher对接目录 - name: maven-cache # maven的缓存文件 host: path: /home/data/maven/cache - name: docker # 宿主机中的docker host: path: /var/run/docker.sock

修改docker.sh

1
#!/bin/sh # 定义应用组名 group_name='clay' # 定义应用名称 app_name=${DRONE_REPO_NAME} # 定义应用版本 app_version=${DRONE_COMMIT} echo ${app_version} # 打包编译docker镜像 echo '----build image start----' docker build -t ${group_name}/${app_name} . echo '----build image success----' docker tag ${group_name}/${app_name} $REGISTRY/$REGISTRY_NAMESPACE/${app_name}:${app_version} docker push $REGISTRY/$REGISTRY_NAMESPACE/${app_name}:${app_version} echo 'push success'

提交更改 drone流程运行成功 1659864009668.png rancher结果 1659863957040.png 1659864874393.png

总结

drone的ci/cd配置的每一个环节是基于docker镜像运行的,所以可操作性空间非常的大,并且官方也提供了不少的插件可以使用,但本次ci/cd都是基于自定义的docker镜像进行持续集成。

只要你能够写好对应的sh,不管是java还是其他语言的项目,都可以使用这一套配置。

写在最后

drone由于中文文档少,摸索的过程中难免会出现踩坑现象,希望此篇文档对你有所帮助 文中的源码地址

其他开源项目

ebts 代码生成系统

个人博客地址Clay

在同一个局域网上的计算机是直接连通的,但是不同的网络上的计算机并没有直接相连,只能通过一台特殊的专用计算机 -路由器来完成连通。路由器连接有多个网络界面,每一个网络界面连接到一个相应的网络上,具有一个这个网络上的IP地址,因此,网络内部的计算机可以和路 由器本身相互通信。

当网络内部的计算机要向外连接的时候,数据包实际是交给路由器的,路由器再将数据包从连接外部网络的网络界面上转发出去,数据包经过这 样一个一个的转发过程,直到到达目的地。对于网络内部的计算机来讲,没有必要了解数据包的整个转发的路径和经过的所有路由器的信息,只需要知道第一步需要 将数据包交给哪一个路由器就可以了。因此,计算机必须知道与它直接相连接的路由器的有关信息,这个过程就是路由配置的过程。

进行路由配置有两种途径,一种是由管理员设置所有的路由信息,由于数据是手工设置,因此称为静态路由设置。另一个是启动一个支持路由交换协议的进程,自动侦测网络上的所有路由器及其相关信息,这称为动态路由设置。

在 FreeBSD系统不用做专门路由器的情况下,一般地说使用静态路由设置足够满足网络通信的需要。

  1. 缺省网关

在最简单的情况下,一个网络向外通过一个路由器完成向外连接,这个路由器被称为缺省网关,它负责几乎所有的向外连接任务。假设缺省网关的地址为 192.168.1.254,则设置缺省网关的命令为:

# route add default 192.168.1.254

add net default: gateway 192.168.1.254

在 route指令中,使用default来代表全部网络,那么通向全部网络的路由器就是缺省网关,而 ” 0.0.0.0 ” 和 default有同样的含义。

如果系统已经设置了缺省网关,那么系统会报告错误,如果要改变缺省网关的设置,就需要首先清除原有配置数据。

# route add default 192.168.1.254

rotue: writing to routing socket: File exists

add net default: gateway 192.168.1.254: File exists

# route delete default

delete net default

显然 ” delete ” 参数的意思和 ” add ” 参数的意思相反,用于清除已经设置的路由数据。除了使用 ” delete ” 一个一个的删除路由之外,如果所有的静态路由设置都不再需要,可以使用 ” flush ” 清除所有设置。

# route flush

default 192.168.1.254 done

上述命令执行之后立即生效,因此,可能会影响已经建立的连接。为了保存缺省网关的配置,同样也需要将配置写入系统配置文件 rc.conf。

defaultrouter= “ 192.168.1.254 ”

仅仅配置缺省网关的大部分情况是在计算机处于整个互联网的边缘,网络中仅仅需要一个路由器接入互联网就可以了。

  1. 其他静态路由设置

更复杂的情况下,计算机所处的网络与多个网络相连接,网络中存在多个路由器,每个路由器负责到一些网络的转发任务,而不负责到全部网络的转 发任务。这种情况下,如果将所有的数据都发给一个路由器,那么原则上它只能正确转发目的是它自己负责的网络的数据。实际使用当中,路由器将使用 ICMP协议,向发送数据的主机报告路由错误。

因此,应该在计算机中配置这个网络上所有路由器及这些路由器负责的相应网络的路由数据,以便计算机选择正确的路由器转发数据包。同样,也必须使用 route命令增加到各个网络的静态路由数据。 [page]

# route add 192.168.10.0/24 192.168.1.253

# route add 192.168.20.0 192.168.1.253

# route add 192.168.30.0/25 192.168.1.253

# route add 192.168.30.128 192.168.1.253

# route add 192.168.40.0 -netmask 255.255.255.0 192.168.1.253

上面指令给出了几种不同的情况, IP地址之后的 ‘ /24 ‘ 指明子网掩码的长度是 24位,它代表二进制方式的网络掩码前面非0位的长度,24个非0位的掩码等价于255.255.255.0,也可以忽略这个部分,系统使用网络地址的缺 省掩码,例如192.168.20.0属于一个C类地址,因此网络掩码是255.255.255.0。但是,如果不是标准的A、B、C类地址,而是一个被 划分过的子网,就必须指明子网掩码,例如192.168.30.0/25,必须指明掩码长度是25位,否则系统使用缺省的掩码。如果不使用掩码长度的形 式,则可以使用 ‘ -netmask ‘ 参数的形式指明网络掩码。

即便如此,上面的指令也不是没有问题。对于标准的网络地址, route指令能确定网络地址和掩码,但是对于象192.168.30.128这样的地址,在通常情况下,它属于一个计算机的普通IP地址,route指 令也能设置通向单独计算机的路由,因此上面的命令将设置一个通向192.168.30.128这一个主机的路由。系统将返回:

# route add 192.168.30.128 192.168.1.253

add host 192.168.30.128: gateway 192.168.1.253

而其他情况下将返回 ” add net …” ,表明地址代表一个网络而不是一个单独的计算机。然而,很多情况下,这个地址被用作一个网络地址,是一个代表从 192.168.30.128到192.168.30.255整个网络的网络地址,它的掩码为25位长的255.255.255.128。

甚至在一些极端的情况下,地址 192.168.10.0也可以用来代表一个具体的计算机的IP地址,而不是一个网络地址。

为了指定这些非标准情况,必须使用额外的参数。

# route add -net 192.168.10.0/24 192.168.1.253

# route add -net 192.168.20.0 192.168.1.253

上面指令中的 -net参数是一个可选参数,它明确指出这个路由是通向一个网络的路由数据,否则[page]route只能从所给予的IP地址中判断它是网络还是计算 机,就有可能发生与管理员想法并不一致的设置。同样可以指定-host参数为一个单独的远程计算机指定路由。

# route add -host 192.168.20.0 192.168.1.253

非缺省网关的静态路由设置同样也需要保存在 rc.conf中,以备下次启动时自动配置。

static_routes= “ static1 static2 ”

route_static1= “ -net 192.168.10.0/24 192.168.1.253 ”

route_static2= “ -net 192.168.20.0/24 192.168.1.253 ”

保存静态路由的方法略为复杂,这是因为静态路由的数量并不确定,因此首先给静态路由确定一个名字,例如 static1、static2等,使static_routes变量中包含这些名字,然后将具体的路由设置保存在route_static1等类似的由 静态路由的名字组成的变量中。

需要注意的是,一些旧版本的 FreeBSD系统直接使用静态路由的名字作变量名字,具体设置如下:

static_routes= “ static_route1 static_route2 ”

static_route1= “ -net 192.168.10.0/24 192.168.1.253 ”

static_route2= “ -net 192.168.20.0/24 192.168.1.253 ”

  1. 查看路由信息

设置完路由表之后,可以使用 netstat -r命令来查看当前的路由表的内容。

# netstat -r

Routing tables

Internet:

Destination Gateway Flags Refs Use Netif Expire

default 192.168.1.254 UGSc 1 941 xl0

127.0.0.1 127.0.0.1 UH 1 644 lo0

192.168.1 link#1 UC 0 0 xl0

192.168.1.254 0:e0:1e:ce:85:a9 UHLW 2 0 xl0

192.168.1.64 0:90:27:4e:f6:67 UHLW 1 6 lo0

192.168.1.253 link#1 UHLW 2 0 xl0

192.168.10 192.168.1.253 UGSc 0 0 xl0

192.168.20 192.168.1.253 UGSc 0 0 xl0

该命令执行结果的第一列显示的是路由的目的,可以是一个网络地址,也可以是一个主机地址;而第二列则显示了到达该目的应使用网关地址,可以 有三种形式,对于不能直接到达的网络地址和主机地址来讲,通常使用网关的 IP地址形式,对于与本机直接相连接的网络,通常使用网络界面的来表示,如 ‘ link#1 ‘ 表示第一个网络界面,而对于可以直接到达的主机地址,则使用该地址的 MAC地址来表示网关;

第三列则为该路由属性的一些标志, ‘ U ‘ 表示路由当前可以使用, ‘ G ‘ 表示到达目的需要对 IP数据包进行专发, ‘ S ‘ 表示是手工添加的静态路由,而不是系统自动产生的路由数据, ‘ C ‘ 和 ‘ c ‘ 表示在使用中会产生新的路由,通常对网络的路由带有这个标志,因为一旦产生具体的连接,则会添加到达具体主机的路由数据, ‘ H ‘ 表示是针对独立主机地址的路由数据, ‘ L ‘ 表示使用网关地址中的 MAC地址发送数据, ‘ W ‘ 表示路由是由 ‘ C ‘ 或 ‘ c ‘ 标志指定的路由生成的。

第四列和第五列是表示该路由数据在路由处理中被引用或使用的一些数据,而第六列标识了该路由使用的网络界面,第七列则标识该路由数据的有效时间,当路由数据达到有限时间的时候,该路由数据就被自动撤消。

从这些结果来看,系统自动将可以直接达到的网络加入路由表中,就是说 ifconfig执行更改地址的同时也更改了路由,这也就解释了前面章节中使用ifconfig配置同网络IP地址带来的执行错误的问题。

同样,直接可以连接的主机也被系统自动加入路由表中,路由信息记录了详细的连接方式,包括与该地址通信的是哪个网络界面和该地址的 MAC地址。

事实上,使用 route指令也完全可以手工指定该地址应该用哪个网络界面进行通信,通信目标的MAC地址是多少。

# route add -host 192.168.30.122 -iface -link xl0:0:12:3f:2:3:4

上述指令将设置通向 192.168.30.122为通过xl0网络界面,目的MAC地址为0:12:3f:2:3:4。显然,正常情况下不需要如此设置,除非某些特殊情况 下,例如对于ATM网络界面用来设置PVC等等,这种作法也能用来支持所谓MAC地址与IP地址绑定,然而由于计算机的MAC地址可以随意改变,因此这种 使用绑定来增加网络安全的思路显然是没有什么太大的用处的。

  1. 保存配置

要想让系统重起之后配置仍然有效,就必须将上面的配置保存到配置文件 /etc/rc.conf中,通常情况下设置好了网络的这个文件应该与下面的例子相似:

hostname=”wb.example.com.cn”

ifconfig_xl0=”inet 192.168.1.64 netmask 255.255.255.0”

ifconfig_lo0=”inet 127.0.0.1”

defaultrouter= “ 192.168.1.1 ”

static_routes= “ static1 static2 ”

route_static1= “ -net 192.168.10.0/24 192.168.1.253 ”

route_static2= “ -net 192.168.20.0/24 192.168.1.253 ”

在同一个局域网上的计算机是直接连通的,但是不同的网络上的计算机并没有直接相连,只能通过一台特殊的专用计算机 -路由器来完成连通。路由器连接有多个网络界面,每一个网络界面连接到一个相应的网络上,具有一个这个网络上的IP地址,因此,网络内部的计算机可以和路 由器本身相互通信。

当网络内部的计算机要向外连接的时候,数据包实际是交给路由器的,路由器再将数据包从连接外部网络的网络界面上转发出去,数据包经过这 样一个一个的转发过程,直到到达目的地。对于网络内部的计算机来讲,没有必要了解数据包的整个转发的路径和经过的所有路由器的信息,只需要知道第一步需要 将数据包交给哪一个路由器就可以了。因此,计算机必须知道与它直接相连接的路由器的有关信息,这个过程就是路由配置的过程。

进行路由配置有两种途径,一种是由管理员设置所有的路由信息,由于数据是手工设置,因此称为静态路由设置。另一个是启动一个支持路由交换协议的进程,自动侦测网络上的所有路由器及其相关信息,这称为动态路由设置。

在 FreeBSD系统不用做专门路由器的情况下,一般地说使用静态路由设置足够满足网络通信的需要。

  1. 缺省网关

在最简单的情况下,一个网络向外通过一个路由器完成向外连接,这个路由器被称为缺省网关,它负责几乎所有的向外连接任务。假设缺省网关的地址为 192.168.1.254,则设置缺省网关的命令为:

# route add default 192.168.1.254

add net default: gateway 192.168.1.254

在 route指令中,使用default来代表全部网络,那么通向全部网络的路由器就是缺省网关,而 ” 0.0.0.0 ” 和 default有同样的含义。

如果系统已经设置了缺省网关,那么系统会报告错误,如果要改变缺省网关的设置,就需要首先清除原有配置数据。

# route add default 192.168.1.254

rotue: writing to routing socket: File exists

add net default: gateway 192.168.1.254: File exists

# route delete default

delete net default

显然 ” delete ” 参数的意思和 ” add ” 参数的意思相反,用于清除已经设置的路由数据。除了使用 ” delete ” 一个一个的删除路由之外,如果所有的静态路由设置都不再需要,可以使用 ” flush ” 清除所有设置。

# route flush

default 192.168.1.254 done

上述命令执行之后立即生效,因此,可能会影响已经建立的连接。为了保存缺省网关的配置,同样也需要将配置写入系统配置文件 rc.conf。

defaultrouter= “ 192.168.1.254 ”

仅仅配置缺省网关的大部分情况是在计算机处于整个互联网的边缘,网络中仅仅需要一个路由器接入互联网就可以了。

  1. 其他静态路由设置

更复杂的情况下,计算机所处的网络与多个网络相连接,网络中存在多个路由器,每个路由器负责到一些网络的转发任务,而不负责到全部网络的转 发任务。这种情况下,如果将所有的数据都发给一个路由器,那么原则上它只能正确转发目的是它自己负责的网络的数据。实际使用当中,路由器将使用 ICMP协议,向发送数据的主机报告路由错误。

因此,应该在计算机中配置这个网络上所有路由器及这些路由器负责的相应网络的路由数据,以便计算机选择正确的路由器转发数据包。同样,也必须使用 route命令增加到各个网络的静态路由数据。 [page]

# route add 192.168.10.0/24 192.168.1.253

# route add 192.168.20.0 192.168.1.253

# route add 192.168.30.0/25 192.168.1.253

# route add 192.168.30.128 192.168.1.253

# route add 192.168.40.0 -netmask 255.255.255.0 192.168.1.253

上面指令给出了几种不同的情况, IP地址之后的 ‘ /24 ‘ 指明子网掩码的长度是 24位,它代表二进制方式的网络掩码前面非0位的长度,24个非0位的掩码等价于255.255.255.0,也可以忽略这个部分,系统使用网络地址的缺 省掩码,例如192.168.20.0属于一个C类地址,因此网络掩码是255.255.255.0。但是,如果不是标准的A、B、C类地址,而是一个被 划分过的子网,就必须指明子网掩码,例如192.168.30.0/25,必须指明掩码长度是25位,否则系统使用缺省的掩码。如果不使用掩码长度的形 式,则可以使用 ‘ -netmask ‘ 参数的形式指明网络掩码。

即便如此,上面的指令也不是没有问题。对于标准的网络地址, route指令能确定网络地址和掩码,但是对于象192.168.30.128这样的地址,在通常情况下,它属于一个计算机的普通IP地址,route指 令也能设置通向单独计算机的路由,因此上面的命令将设置一个通向192.168.30.128这一个主机的路由。系统将返回:

# route add 192.168.30.128 192.168.1.253

add host 192.168.30.128: gateway 192.168.1.253

而其他情况下将返回 ” add net …” ,表明地址代表一个网络而不是一个单独的计算机。然而,很多情况下,这个地址被用作一个网络地址,是一个代表从 192.168.30.128到192.168.30.255整个网络的网络地址,它的掩码为25位长的255.255.255.128。

甚至在一些极端的情况下,地址 192.168.10.0也可以用来代表一个具体的计算机的IP地址,而不是一个网络地址。

为了指定这些非标准情况,必须使用额外的参数。

# route add -net 192.168.10.0/24 192.168.1.253

# route add -net 192.168.20.0 192.168.1.253

上面指令中的 -net参数是一个可选参数,它明确指出这个路由是通向一个网络的路由数据,否则[page]route只能从所给予的IP地址中判断它是网络还是计算 机,就有可能发生与管理员想法并不一致的设置。同样可以指定-host参数为一个单独的远程计算机指定路由。

# route add -host 192.168.20.0 192.168.1.253

非缺省网关的静态路由设置同样也需要保存在 rc.conf中,以备下次启动时自动配置。

static_routes= “ static1 static2 ”

route_static1= “ -net 192.168.10.0/24 192.168.1.253 ”

route_static2= “ -net 192.168.20.0/24 192.168.1.253 ”

保存静态路由的方法略为复杂,这是因为静态路由的数量并不确定,因此首先给静态路由确定一个名字,例如 static1、static2等,使static_routes变量中包含这些名字,然后将具体的路由设置保存在route_static1等类似的由 静态路由的名字组成的变量中。

需要注意的是,一些旧版本的 FreeBSD系统直接使用静态路由的名字作变量名字,具体设置如下:

static_routes= “ static_route1 static_route2 ”

static_route1= “ -net 192.168.10.0/24 192.168.1.253 ”

static_route2= “ -net 192.168.20.0/24 192.168.1.253 ”

  1. 查看路由信息

设置完路由表之后,可以使用 netstat -r命令来查看当前的路由表的内容。

# netstat -r

Routing tables

Internet:

Destination Gateway Flags Refs Use Netif Expire

default 192.168.1.254 UGSc 1 941 xl0

127.0.0.1 127.0.0.1 UH 1 644 lo0

192.168.1 link#1 UC 0 0 xl0

192.168.1.254 0:e0:1e:ce:85:a9 UHLW 2 0 xl0

192.168.1.64 0:90:27:4e:f6:67 UHLW 1 6 lo0

192.168.1.253 link#1 UHLW 2 0 xl0

192.168.10 192.168.1.253 UGSc 0 0 xl0

192.168.20 192.168.1.253 UGSc 0 0 xl0

该命令执行结果的第一列显示的是路由的目的,可以是一个网络地址,也可以是一个主机地址;而第二列则显示了到达该目的应使用网关地址,可以 有三种形式,对于不能直接到达的网络地址和主机地址来讲,通常使用网关的 IP地址形式,对于与本机直接相连接的网络,通常使用网络界面的来表示,如 ‘ link#1 ‘ 表示第一个网络界面,而对于可以直接到达的主机地址,则使用该地址的 MAC地址来表示网关;

第三列则为该路由属性的一些标志, ‘ U ‘ 表示路由当前可以使用, ‘ G ‘ 表示到达目的需要对 IP数据包进行专发, ‘ S ‘ 表示是手工添加的静态路由,而不是系统自动产生的路由数据, ‘ C ‘ 和 ‘ c ‘ 表示在使用中会产生新的路由,通常对网络的路由带有这个标志,因为一旦产生具体的连接,则会添加到达具体主机的路由数据, ‘ H ‘ 表示是针对独立主机地址的路由数据, ‘ L ‘ 表示使用网关地址中的 MAC地址发送数据, ‘ W ‘ 表示路由是由 ‘ C ‘ 或 ‘ c ‘ 标志指定的路由生成的。

第四列和第五列是表示该路由数据在路由处理中被引用或使用的一些数据,而第六列标识了该路由使用的网络界面,第七列则标识该路由数据的有效时间,当路由数据达到有限时间的时候,该路由数据就被自动撤消。

从这些结果来看,系统自动将可以直接达到的网络加入路由表中,就是说 ifconfig执行更改地址的同时也更改了路由,这也就解释了前面章节中使用ifconfig配置同网络IP地址带来的执行错误的问题。

同样,直接可以连接的主机也被系统自动加入路由表中,路由信息记录了详细的连接方式,包括与该地址通信的是哪个网络界面和该地址的 MAC地址。

事实上,使用 route指令也完全可以手工指定该地址应该用哪个网络界面进行通信,通信目标的MAC地址是多少。

# route add -host 192.168.30.122 -iface -link xl0:0:12:3f:2:3:4

上述指令将设置通向 192.168.30.122为通过xl0网络界面,目的MAC地址为0:12:3f:2:3:4。显然,正常情况下不需要如此设置,除非某些特殊情况 下,例如对于ATM网络界面用来设置PVC等等,这种作法也能用来支持所谓MAC地址与IP地址绑定,然而由于计算机的MAC地址可以随意改变,因此这种 使用绑定来增加网络安全的思路显然是没有什么太大的用处的。

  1. 保存配置

要想让系统重起之后配置仍然有效,就必须将上面的配置保存到配置文件 /etc/rc.conf中,通常情况下设置好了网络的这个文件应该与下面的例子相似:

hostname=”wb.example.com.cn”

ifconfig_xl0=”inet 192.168.1.64 netmask 255.255.255.0”

ifconfig_lo0=”inet 127.0.0.1”

defaultrouter= “ 192.168.1.1 ”

static_routes= “ static1 static2 ”

route_static1= “ -net 192.168.10.0/24 192.168.1.253 ”

route_static2= “ -net 192.168.20.0/24 192.168.1.253 ”

一、安装后配置

上次我们说到FreeBSD的安装,这次我们说FreeBSD安装后的配置和简单优化方法。

安装完BSD只是服务器提供服务这条万里长征路的开始,还需要一些基本的设定和优化。不过实际上,即便不优化,FreeBSD现在也可以很安全的提供服务,决定权在你。

1.安装及更新ports树

有些接触过FreeBSD的一定知道portsnap,这是freebsd下软件更新的利器。或者说也是唯一的途径。ports,可以理解为是FreeBSD所维护的一个庞大的应用软件列表,你所需要的和不需要的软件,几乎都可以在这个列表下找到。而portsnap,顾名思义,就是ports的快照。运行portsnap会把目前最新的远端ports树结构以及树下所有软件的最新稳定版的编译文件列入服务器的ports树中。ports如何使用,我们以后再讲,先不要着急使用portsnap。先完成以下步骤,你会发现,ports会更快,安装软件也会更快。

#cd /etc #vi portsnap.conf
找到portsnap.FreeBSD.org
将其改为portsnap3.hshh.org
保存退出

我是网通用户,所以用3号镜像。镜像列表如下

portsnap.hshh.org(电信)

portsnap2.hshh.org(电信)

portsnap3.hshh.org(网通)

portsnap4.hshh.org(电信)

这是国内的portsnap镜像,更新速度会更快。我见过无数linux装好后就再也不更新,导致漏洞一大堆,并不完全是系统管理员的问题,这跟yum或者apt的包维护也有关系。FreeBSD完全不用担心这一点,只要你自动设定portsnap,自动upgrade,即便你放在那里一年,你的软件也会是最新的。不过一般不建议这样做。后面会讲到。

然后,执行下述命令

更新你的ports树吧,国内的镜像速度飞快。大约会下载63-64M的port包。然后等待解压缩完成即可。现在,你的ports树就是最新的了,尽管去编译安装软件吧。需要更新,可以运行下述命令

portsnap采用增量更新的方式,第一次需要执行fetch extract,以后只需要执行fetch update即可,增量更新的更新量很小,速度飞快。

2.更新FreeBSD系统文件

没有人能保证操作系统完美无缺,即便是发行版也不能,但在发现补丁后及时打上,是最明智的做法。这一点上FreeBSD也做得相当人性。那么,更新系统文件之前,我们也需要改一个配置文件,会让你变得更快。

#cd /etc #vi freebsd-update.conf
找到ServerName update.FreeBSD.org
将update.freebsd.org 改为freebsd-updates.mirrors.163.com
保存退出

然后就可以了,运行下面的命令更新吧,更新之前可以看一下uname -a,以8.2为例,会显示FreeBSD 8.2-RELEASE

#freebsd-update fetch #freebsd-update install

更新完成后重启,再打uname -a,会显示FreeBSD 8.2-RELEASE-p4,显示系统补丁已经打上了。

这些命令,你都可以加入到crontab中定期自动运行。

3.软件安装源配置

编辑一个文件,这个文件在新装的freebsd系统中是不存在的,除非你用ports安装过软件,否则不会生成这个文件。所以,在新装系统中需要手动创建这个文件。

#vi /etc/make.conf
然后输入以下内容 MASTER_SITE_BACKUP?=http://mirrors.163.com/FreeBSD/distfiles/${DIST\_SUBDIR}/ MASTER_SITE_OVERRIDE?=${MASTER_SITE_BACKUP}

保存退出,这样你在用ports安装的时候,就会直接连接到163的镜像,速度会更快。不过有一个缺点,就是最新的软件发行包通常不会及时更新,大概需要3-4天或者更长的时间,163镜像才会与freebsd同步过来,不过,however,有国内镜像总比没有强。

一般不推荐用pkg_add方式直接安装二进制文件,这样不够优化,最好是通过ports树进行编译安装。除非有特殊的要求,所以我先不写PACKAGESITE变量的设置。

4.软件安装

这是我最欣赏freebsd的优点之一,软件收集全面,分类明确,安装简便,编译安装方式足够适应系统并优化。配置文件集中管理,绝对节省人类的时间,比起LINUX到处找编译文件要强太多了。

举例,比如我要需要安装nginx,我在这里假设你已经更新过ports树了,在我写这个文章的时候,最新的frebbsd nginx版本为1.0.8,1。

运行下列命令进行安装

#cd /usr/ports/www/nginx #make install clean

会弹出选项,按照需求进行选择,然后OK,等待编译完成吧,这个软件就装完了。安装过程中会自动检测依赖关系,并自动下载依赖软件编译。这比糟糕透顶yum强不知多少倍,且不论yum是安装二进制文件,而且经常找不到依赖包,装完之后你还需要find配置文件,浪费时间!freebsd的配置文件全部集中管理。无论你通过ports安装什么软件,如果他存在配置文件,请到下面这个路径里找

ubuntu好像也是这个路径,但是,我用apt-get安装后,基本这个路径里什么都没有。

4.运行你安装的软件

这里有一点小麻烦,但绝对不大,只占用你大约不到30秒的时间。如果你安装了应用软件,比如nginx,请按照下列步骤完成

#vi /etc/rc.conf
然后新起一行,输入
nginx_enable=”YES”
保存退出

然后运行下面的命令

#cd /usr/local/etc/rc.d #./nginx start

你的nginx就启动了,访问你的服务器,看看welcome to nginx吧。

一、安装后配置

上次我们说到FreeBSD的安装,这次我们说FreeBSD安装后的配置和简单优化方法。

安装完BSD只是服务器提供服务这条万里长征路的开始,还需要一些基本的设定和优化。不过实际上,即便不优化,FreeBSD现在也可以很安全的提供服务,决定权在你。

1.安装及更新ports树

有些接触过FreeBSD的一定知道portsnap,这是freebsd下软件更新的利器。或者说也是唯一的途径。ports,可以理解为是FreeBSD所维护的一个庞大的应用软件列表,你所需要的和不需要的软件,几乎都可以在这个列表下找到。而portsnap,顾名思义,就是ports的快照。运行portsnap会把目前最新的远端ports树结构以及树下所有软件的最新稳定版的编译文件列入服务器的ports树中。ports如何使用,我们以后再讲,先不要着急使用portsnap。先完成以下步骤,你会发现,ports会更快,安装软件也会更快。

#cd /etc #vi portsnap.conf
找到portsnap.FreeBSD.org
将其改为portsnap3.hshh.org
保存退出

我是网通用户,所以用3号镜像。镜像列表如下

portsnap.hshh.org(电信)

portsnap2.hshh.org(电信)

portsnap3.hshh.org(网通)

portsnap4.hshh.org(电信)

这是国内的portsnap镜像,更新速度会更快。我见过无数linux装好后就再也不更新,导致漏洞一大堆,并不完全是系统管理员的问题,这跟yum或者apt的包维护也有关系。FreeBSD完全不用担心这一点,只要你自动设定portsnap,自动upgrade,即便你放在那里一年,你的软件也会是最新的。不过一般不建议这样做。后面会讲到。

然后,执行下述命令

更新你的ports树吧,国内的镜像速度飞快。大约会下载63-64M的port包。然后等待解压缩完成即可。现在,你的ports树就是最新的了,尽管去编译安装软件吧。需要更新,可以运行下述命令

portsnap采用增量更新的方式,第一次需要执行fetch extract,以后只需要执行fetch update即可,增量更新的更新量很小,速度飞快。

2.更新FreeBSD系统文件

没有人能保证操作系统完美无缺,即便是发行版也不能,但在发现补丁后及时打上,是最明智的做法。这一点上FreeBSD也做得相当人性。那么,更新系统文件之前,我们也需要改一个配置文件,会让你变得更快。

#cd /etc #vi freebsd-update.conf
找到ServerName update.FreeBSD.org
将update.freebsd.org 改为freebsd-updates.mirrors.163.com
保存退出

然后就可以了,运行下面的命令更新吧,更新之前可以看一下uname -a,以8.2为例,会显示FreeBSD 8.2-RELEASE

#freebsd-update fetch #freebsd-update install

更新完成后重启,再打uname -a,会显示FreeBSD 8.2-RELEASE-p4,显示系统补丁已经打上了。

这些命令,你都可以加入到crontab中定期自动运行。

3.软件安装源配置

编辑一个文件,这个文件在新装的freebsd系统中是不存在的,除非你用ports安装过软件,否则不会生成这个文件。所以,在新装系统中需要手动创建这个文件。

#vi /etc/make.conf
然后输入以下内容 MASTER_SITE_BACKUP?=http://mirrors.163.com/FreeBSD/distfiles/${DIST\_SUBDIR}/ MASTER_SITE_OVERRIDE?=${MASTER_SITE_BACKUP}

保存退出,这样你在用ports安装的时候,就会直接连接到163的镜像,速度会更快。不过有一个缺点,就是最新的软件发行包通常不会及时更新,大概需要3-4天或者更长的时间,163镜像才会与freebsd同步过来,不过,however,有国内镜像总比没有强。

一般不推荐用pkg_add方式直接安装二进制文件,这样不够优化,最好是通过ports树进行编译安装。除非有特殊的要求,所以我先不写PACKAGESITE变量的设置。

4.软件安装

这是我最欣赏freebsd的优点之一,软件收集全面,分类明确,安装简便,编译安装方式足够适应系统并优化。配置文件集中管理,绝对节省人类的时间,比起LINUX到处找编译文件要强太多了。

举例,比如我要需要安装nginx,我在这里假设你已经更新过ports树了,在我写这个文章的时候,最新的frebbsd nginx版本为1.0.8,1。

运行下列命令进行安装

#cd /usr/ports/www/nginx #make install clean

会弹出选项,按照需求进行选择,然后OK,等待编译完成吧,这个软件就装完了。安装过程中会自动检测依赖关系,并自动下载依赖软件编译。这比糟糕透顶yum强不知多少倍,且不论yum是安装二进制文件,而且经常找不到依赖包,装完之后你还需要find配置文件,浪费时间!freebsd的配置文件全部集中管理。无论你通过ports安装什么软件,如果他存在配置文件,请到下面这个路径里找

ubuntu好像也是这个路径,但是,我用apt-get安装后,基本这个路径里什么都没有。

4.运行你安装的软件

这里有一点小麻烦,但绝对不大,只占用你大约不到30秒的时间。如果你安装了应用软件,比如nginx,请按照下列步骤完成

#vi /etc/rc.conf
然后新起一行,输入
nginx_enable=”YES”
保存退出

然后运行下面的命令

#cd /usr/local/etc/rc.d #./nginx start

你的nginx就启动了,访问你的服务器,看看welcome to nginx吧。

注意:本文最后更新于 1311 天前,有关的内容可能已经发生变化,请参考使用。


I. 修改IP

即时生效的修改IP

    ifconfig le0 192.168.203.33 netmask 255.255.255.0  

永久修改需要在/etc/rc.conf中添加

    ifconfig_le0=“192.168.203.33 netmask 255.255.255.0”  

II. 修改网关

即时生效

    route add default 192.168.203.255  

永久修改在/etc/rc.conf中添加

    defaultrouter=“192.168.203.255”

III. 添加和删除静态路由

    netstat -nr  

命令修改用

    route add 192.168.40.0 -netmask 255.255.255.0 192.168.1.253  
    route add -host 192.168.30.122 -iface -link xl0:0:12:3f:2:3:4 
    route add -host 192.168.20.0 192.168.1.253 

永久修改在/etc/rc.conf中添加

    static_routes= “ static1 static2 ”  
    route_static1= “ -net 192.168.10.0/24 192.168.1.253 ”  
    route_static2= “ -net 192.168.20.0/24 192.168.1.253 ”  

IV. 修改DNS服务器

    nameserver 202.101.208.3  

V. 显示当前路由表

    netstat -nr

使用微信扫描二维码完成支付


相关文章

声明:本文为本站【NASGEEK】原创文章,未经许可不得转载!

  本文开始,将介绍一下freenas11.3中几个常用插件的安装配置。今天先介绍一下nextcloud插件的安装、配置https,以及优化。

一、安装

  打开freenas的插件页面,选择nextcloud:

  点击安装,出现下面的界面:

  jail名称自己随便填一个,网络选择“DHCP”,然后点“保存”,系统会自动进行安装。安装完成后,在插件页面就会看到安装好的nextcloud插件,如下图所示:

  安装说明里面有数据库和nextcloud的管理账号和密码。点击“管理”按钮打开nextcloud页面,如果能够正常打开,输入账号密码就行了。不过我的出现了如下提示:

  提示说需要编辑“config/config.php”这个文件,这就需要进入到插件里面。可是在插件这个页面并没有什么可以操作的入口。其实,插件本身就是一个jail,安装完插件之后,我们可以在jails菜单里面找到它。

  在这里,可以点击“命令行”菜单对插件进行操作。大家可以参考《使用JAIL自建服务教程之一:JAIL创建和优化》这篇教程,开启nextcloud插件的ssh访问,之后就可以用putty等软件对插件进行操作了。

  现在我们对config.php文件进行修改:

nano /usr/local/www/nextcloud/config/config.php

nano /usr/local/www/nextcloud/config/config.php

nano /usr/local/www/nextcloud/config/config.php

  将“trusted_domains”里的地址改成你的插件IP地址,保存。再试试,发现可以打开nextcloud登录页面了。

  然后输入“安装说明”里的账号密码就可以登录使用了。

二、修改数据目录

  我的插件是放在一个SSD存储池上,容量只有240G,也就是说此nextcloud最多也只能存储240G数据,这明显不能够满足要求。因此,就需要把数据目录映射到freenas存储池里。

  先在nextcloud插件中建立一个目标目录:

mkdir /mnt/ncdata

  然后在“插件”页面中停止nextcloud,点击“挂载点”按钮,出现如下页面

  再点击右上角“动作”–“添加”,如下图

  “源”选择freenas主机中的目录,“目标”选择插件中新建立的目录“/mnt/ncdata”,保存。

  然后转到插件页面,打开nextcloud插件。使用ssh连接到nextcloud,先停止nginx服务,再将原来数据目录内的文件复制到新的数据目录:

chown www:www /mnt/ncdata

cp -rfp /usr/local/www/nextcloud/data/. /mnt/ncdata

service nginx stop chown www:www /mnt/ncdata cp -rfp /usr/local/www/nextcloud/data/. /mnt/ncdata

service nginx stop
chown www:www /mnt/ncdata
cp -rfp /usr/local/www/nextcloud/data/. /mnt/ncdata

  然后修改nextcloud的配置文件:

nano /usr/local/www/nextcloud/config/config.php

nano /usr/local/www/nextcloud/config/config.php

nano /usr/local/www/nextcloud/config/config.php

  将“datadirectory”这一项改成“/mnt/ncdata”,保存退出。

  启动nginx:

service nginx start

  然后再打开nextcloud就可以了。

  到现在为止,我们就可以正常使用nextcloud了。如果你的nextcloud仅应用于局域网内,或者你对数据传输安全不那么重视的话,那么接下来的配置ssl就不需要了。

三、配置SSL

  1、用WinSCP等工具将证书文件到“/usr/local/etc/ssl/”目录下,我的证书是在“ssl for free”网站上申请的,如下图

  2、编辑配置文件。

  先将原先的nginx配置文件复制一份,并将原来的文件改名:

cp /usr/local/etc/nginx/conf.d/nextcloud.conf /usr/local/etc/nginx/conf.d/nextcloud-ssl.conf

mv /usr/local/etc/nginx/conf.d/nextcloud.conf /usr/local/etc/nginx/conf.d/nextcloud.conf.bak

cp /usr/local/etc/nginx/conf.d/nextcloud.conf /usr/local/etc/nginx/conf.d/nextcloud-ssl.conf mv /usr/local/etc/nginx/conf.d/nextcloud.conf /usr/local/etc/nginx/conf.d/nextcloud.conf.bak

cp /usr/local/etc/nginx/conf.d/nextcloud.conf /usr/local/etc/nginx/conf.d/nextcloud-ssl.conf
mv /usr/local/etc/nginx/conf.d/nextcloud.conf /usr/local/etc/nginx/conf.d/nextcloud.conf.bak

  然后修改nextcloud-ssl.conf文件,因为文件比较长,建议使用winscp等工具进行修改。找到左边以下几个地方,改成右边的样子。其中“server_name”、“ssl_certificate”、“ssl_certificate_key”这几个地方要按照你自己的实际情况修改。

  然后重启nginx服务:

service nginx restart

  现在我在浏览器中输入https://域名,就可以使用ssl传输了,证书也显示正常。这里提一下,你还需要按第一步中的方法将你的域名添加到nextcloud的配置文件config.php中的“trusted_domains”里才可以正常访问。

四、优化

  现在我们在nextcloud中打开“设置”–“概览”,会看到一些安全与设置警告

  下面我们一项一项来消除它们。

  1.解决getenv(“PATH”)为空的问题

  用winscp打开“/usr/local/etc/php-fpm.d/nextcloud.conf”这个文件,在最后加上一句:

env[PATH] = /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

env[PATH] = /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

env[PATH] = /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

  然后重启php-fpm:

service php-fpm restart

  刷新页面,发现第一个错误已经没有了。

  2.解决“数据库丢失了一些索引”的问题

  先安装sudo工具:

pkg install sudo

  再运行修复命令:

sudo -u www php /usr/local/www/nextcloud/occ db:add-missing-indices

sudo -u www php /usr/local/www/nextcloud/occ db:add-missing-indices

sudo -u www php /usr/local/www/nextcloud/occ db:add-missing-indices

  3.解决“数据库中的一些列由于进行长整型转换而缺失”的问题

  运行修复命令:

sudo -u www php /usr/local/www/nextcloud/occ db:convert-filecache-bigint

sudo -u www php /usr/local/www/nextcloud/occ db:convert-filecache-bigint

sudo -u www php /usr/local/www/nextcloud/occ db:convert-filecache-bigint

  提示“Continue with the conversion (y/n)? [n]”时,输入“y”确定。

  4.解决“该实例缺失了一些推荐的 PHP 模块”的问题

  提示缺少“imagick”模块,我们就安装这个模块:

pkg install php74-pecl-imagick

pkg install php74-pecl-imagick

pkg install php74-pecl-imagick

  这里需要注意一下,安装的模块版本要与你php版本一致。可以用“php -v”查看一下你的php版本。

  重启php-fpm

service php-fpm restart

  现在刷新一下管理页面,发现所有检查已通过。