systemd 下开机启动的优化,删除无用的systemd服务

一般情况下,常规用途的 Linux 发行版在开机启动时拉起各种相关服务进程,包括许多你可能无需使用的服务,例如蓝牙bluetooth、Avahi、 调制解调管理器ModemManager、ppp-dns(LCTT 译注:此处作者笔误 ppp-dns 应该为 pppd-dns) 等服务进程,这些都是什么东西?用于哪里,有何功能?

Systemd 提供了许多很好的工具用于查看系统启动情况,也可以控制在系统启动时运行什么。在这篇文章中,我将说明在 Systemd 类发行版中如何关闭一些令人讨厌的进程。

查看开机启动项

在过去,你能很容易通过查看 /etc/init.d 了解到哪些服务进程会在引导时启动。Systemd 以不同的方式展现,你可以使用如下命令罗列允许开机启动的服务进程。

$ systemctl list-unit-files --type=service | grep enabled
accounts-daemon.service                    enabled
anacron-resume.service                     enabled
anacron.service                            enabled
bluetooth.service                          enabled
brltty.service                             enabled
[...]

在此列表顶部,对我来说,蓝牙服务是冗余项,因为在该电脑上我不需要使用蓝牙功能,故无需运行此服务。下面的命令将停止该服务进程,并且使其开机不启动。

$ sudo systemctl stop bluetooth.service
$ sudo systemctl disable bluetooth.service

你可以通过下面命令确定是否操作成功。

$ systemctl status bluetooth.service
 bluetooth.service - Bluetooth service
  Loaded: loaded (/lib/systemd/system/bluetooth.service; disabled; vendor preset: enabled)
  Active: inactive (dead)
    Docs: man:bluetoothd(8)

停用的服务进程仍然能够被另外一个服务进程启动。如果你真的想在任何情况下系统启动时都不启动该进程,无需卸载该它,只需要把它掩盖起来就可以阻止该进程在任何情况下开机启动。

$ sudo systemctl mask bluetooth.service
 Created symlink from /etc/systemd/system/bluetooth.service to /dev/null.

一旦你对禁用该进程启动而没有出现负面作用感到满意,你也可以选择卸载该程序。

通过执行命令可以获得如下服务列表:

$ systemctl list-unit-files --type=service                       
UNIT FILE                                  STATE   
accounts-daemon.service                    enabled
acpid.service                              disabled
alsa-restore.service                       static    
alsa-utils.service                         masked

你不能启用或禁用静态服务,因为静态服务被其他的进程所依赖,并不意味着它们自己运行。

哪些服务能够禁止?

如何知道你需要哪些服务,而哪些又是可以安全地禁用的呢?它总是依赖于你的个性化需求。

这里举例了几个服务进程的作用。许多服务进程都是发行版特定的,所以你应该看看你的发行版文档(比如通过 google 或 StackOverflow)。

  • accounts-daemon.service 是一个潜在的安全风险。它是 AccountsService 的一部分,AccountsService 允许程序获得或操作用户账户信息。我不认为有好的理由能使我允许这样的后台操作,所以我选择掩盖mask该服务进程。
  • avahi-daemon.service 用于零配置网络发现,使电脑超容易发现网络中打印机或其他的主机,我总是禁用它,别漏掉它。
  • brltty.service 提供布莱叶盲文设备支持,例如布莱叶盲文显示器。
  • debug-shell.service 开放了一个巨大的安全漏洞(该服务提供了一个无密码的 root shell ,用于帮助 调试 systemd 问题),除非你正在使用该服务,否则永远不要启动服务。
  • ModemManager.service 该服务是一个被 dbus 激活的守护进程,用于提供移动宽频broadband(2G/3G/4G)接口,如果你没有该接口,无论是内置接口,还是通过如蓝牙配对的电话,以及 USB 适配器,那么你也无需该服务。
  • pppd-dns.service 是一个计算机发展的遗物,如果你使用拨号接入互联网的话,保留它,否则你不需要它。
  • rtkit-daemon.service 听起来很可怕,听起来像是 rootkit。 但是你需要该服务,因为它是一个实时内核调度器real-time kernel scheduler。
  • whoopsie.service 是 Ubuntu 错误报告服务。它用于收集 Ubuntu 系统崩溃报告,并发送报告到 https://daisy.ubuntu.com 。 你可以放心地禁止其启动,或者永久的卸载它。
  • wpa_supplicant.service 仅在你使用 Wi-Fi 连接时需要。

系统启动时发生了什么?

Systemd 提供了一些命令帮助调试系统开机启动问题。该命令会重演你的系统启动的所有消息。

$ journalctl -b

-- Logs begin at Mon 2016-05-09 06:18:11 PDT,
end at Mon 2016-05-09 10:17:01 PDT. --
May 16 06:18:11 studio systemd-journal[289]:
Runtime journal (/run/log/journal/) is currently using 8.0M.
Maximum allowed usage is set to 157.2M.
Leaving at least 235.9M free (of currently available 1.5G of space).
Enforced usage limit is thus 157.2M.
[...]

通过命令 journalctl -b -1 可以复审前一次启动,journalctl -b -2 可以复审倒数第 2 次启动,以此类推。

该命令会打印出大量的信息,你可能并不关注所有信息,只是关注其中问题相关部分。为此,系统提供了几个过滤器,用于帮助你锁定目标。让我们以进程号为 1 的进程为例,该进程是所有其它进程的父进程。

$ journalctl _PID=1

May 08 06:18:17 studio systemd[1]: Starting LSB: Raise network interfaces....
May 08 06:18:17 studio systemd[1]: Started LSB: Raise network interfaces..
May 08 06:18:17 studio systemd[1]: Reached target System Initialization.
May 08 06:18:17 studio systemd[1]: Started CUPS Scheduler.
May 08 06:18:17 studio systemd[1]: Listening on D-Bus System Message Bus Socket
May 08 06:18:17 studio systemd[1]: Listening on CUPS Scheduler.
[...]

这些打印消息显示了什么被启动,或者是正在尝试启动。

一个最有用的命令工具之一 systemd-analyze blame,用于帮助查看哪个服务进程启动耗时最长。

$ systemd-analyze blame
         8.708s gpu-manager.service
         8.002s NetworkManager-wait-online.service
         5.791s mysql.service
         2.975s dev-sda3.device
         1.810s alsa-restore.service
         1.806s systemd-logind.service
         1.803s irqbalance.service
         1.800s lm-sensors.service
         1.800s grub-common.service

这个特定的例子没有出现任何异常,但是如果存在系统启动瓶颈,则该命令将能发现它。

PostgreSQL两个库间迁移文件

用pg_dump但不产生中间文件,直接在2个数据库之间导数据。

本机执行从本地库导出数据到远程库

pg_dump -h 本地库IP -U postgres dbname | psql -h 目标库IP -U postgres dbname

本机执行从远程数据库导入数据到本地库

pg_dump -h 目标库IP -U postgres dbname | psql -h 本地库IP -U postgres dbname

mysql-物理备份-Percona xtrabackup

xtrabackup是percona公司开发的一个用于mysql物理热备的备份工具。

软件安装后一共有4个可执行文件:

  • innobackupex:perl脚本,用来备份非innodb表,同时会调用xtrabackup来备份innodb表,会和mysql server进行交互。如:加读锁(FTWRL),获取位点(show slave status)等。即封装了xtrabackup

  • xbcrypt:用来解密

  • xbstream:类似tar,一种支持并发写的流文件格式。和xbcrypt都在备份和解压会用到

  • xtrabackup:c/c++编译的二进制,用来备份innodb表,和mysql server没有交互

原理

通信方式:xtrabackup和innobackupex之间的交互和协调是通过控制文件的创建和删除来实现的。

主要文件:

    xtrabackup_suspended_1
    xtrabackup_suspended_2
    xtrabackup_log_copied

例:看看备份时xtrabackup_suspended_2是怎么协调2个工具进程的:

  1. innobackupex在启动xtrabackup进程后,会一直等xtrabackup备份完innodb文件,方式就是等待xtrabackup_suspended_2被创建出

  2. xtrabackup备份完innodb数据后,就在指定目录下创建出xtrabackup_suspended_2,然后等到这个文件被innobackupex删除,

  3. innobackupex 检测到文件 xtrabackup_suspended_2 被创建出来后,就继续往下走;

  4. innobackupex 在备份完非 InnoDB 表后,删除 xtrabackup_suspended_2 这个文件,这样就通知 xtrabackup 可以继续了,然后等 xtrabackup_log_copied 被创建;

  5. xtrabackup 检测到 xtrabackup_suspended_2 文件删除后,就可以继续往下了。

未分类

备份过程图

未分类

说明:

  1. innobackupex 在启动后,会先 fork 一个进程,启动 xtrabackup进程,然后就等待 xtrabackup 备份完 ibd 数据文件;

  2. xtrabackup 在备份 InnoDB 相关数据时,是有2种线程的,1种是 redo 拷贝线程,负责拷贝 redo 文件,1种是 ibd 拷贝线程,负责拷贝 ibd 文件;redo 拷贝线程只有一个,在 ibd 拷贝线程之前启动,在 ibd 线程结束后结束。xtrabackup 进程开始执行后,先启动 redo 拷贝线程,从最新的 checkpoint 点开始顺序拷贝 redo 日志;然后再启动 ibd 数据拷贝线程,在 xtrabackup 拷贝 ibd 过程中,innobackupex 进程一直处于等待状态(等待文件被创建)。

  3. xtrabackup 拷贝完成idb后,通知 innobackupex(通过创建文件),同时自己进入等待(redo 线程仍然继续拷贝);

  4. innobackupex 收到 xtrabackup 通知后,执行FLUSH TABLES WITH READ LOCK (FTWRL),取得一致性位点,然后开始备份非 InnoDB 文件(包括 frm、MYD、MYI、CSV、opt、par等)。拷贝非 InnoDB 文件过程中,因为数据库处于全局只读状态,如果在业务的主库备份的话,要特别小心,非 InnoDB 表(主要是MyISAM)比较多的话整库只读时间就会比较长,这个影响一定要评估到。

  5. 当 innobackupex 拷贝完所有非 InnoDB 表文件后,通知 xtrabackup(通过删文件) ,同时自己进入等待(等待另一个文件被创建);

  6. xtrabackup 收到 innobackupex 备份完非 InnoDB 通知后,就停止 redo 拷贝线程,然后通知 innobackupex redo log 拷贝完成(通过创建文件);

  7. innobackupex 收到 redo 备份完成通知后,就开始解锁,执行 UNLOCK TABLES;

  8. 最后 innobackupex 和 xtrabackup 进程各自完成收尾工作,如资源的释放、写备份元数据信息等,innobackupex 等待 xtrabackup 子进程结束后退出。

在备份进程中都是直接通过操作系统读取数据文件的,只在执行SQL命令时和数据库有交互,基本不会影响数据库的运行,在备份非innodb时会有一段时间只读,对备份innodb表时完全没有影响。

备份innodb文件和非innodb都是通过拷贝文件,但实现的方式不一样,innodb是以page粒度(xtrabackup),在读取每个page时会检验checksum值,保证数据块是一致的;非innodb是cp或者tar(innobackupex),由于对文件做了FTWRL,磁盘上的文件也是完整的,备份的数据也是完整的。

Ubuntu配置SVN,完成自动部署

下面简单记录设置SVN和部署的操作:

1. 安装

apt-get install subversion libapache2-svn

我的服务器上Apache老早就安装过了。如果你的服务器上还没有安装,可以执行:

apt-get install apache2

完成安装之后,Apache的mod_dav_svn默认就是已经启用的了。

2. 创建代码仓库文件夹

这里我把代码集中放在了/var/svn/,先创建这个文件夹:

cd /var/
mkdir svn

3. 修改dav_svn模块配置文件

cd /etc/apache2/mods-enabled/

编辑文件dav_svn.conf ,去掉一些注释符号,修改SVNParentPath路径为上面我们创建的/var/svn/:

vi dav_svn.conf

最终的内容大约是:

<Location /svn>
DAV svn
SVNParentPath /var/svn/
AuthType Basic
AuthName “Subversion Repository”
AuthUserFile /etc/apache2/dav_svn.passwd
Require valid-user
</Location>

4. 生成认证所需要的密钥文件

上面的AuthUserFile选项对应的文件需要我们自己创建。
我为自己和小连各创建一个账号:

sudo htpasswd -cm /etc/apache2/dav_svn.passwd someone
sudo htpasswd /etc/apache2/dav_svn.passwd someone-else

完成上面的操作之后,让apache重新读入一下配置:

service apache2 reload

这个时候,直接访问http://www.fachun.net/svn,就可以看到要求输入用户名、密码了。
认证之后,会出现一个403 Forbidden,因为我们还未创建repository。

5. 创建repository

cd切换到/var/svn/目录下,再执行:

svnadmin create musicapp

就会在目录下生成musicapp文件夹,这个文件夹下包含了.svn子文件夹。接着修改musicapp文件夹属主,让www-data可读写:

chown -R www-data musicapp
chmod -R g+rws musicapp

好了,现在已经可以开始使用svn了。

6. 安装客户端,checkout到本地

现在我的开发环境是windows,下载安装客户端:
http://tortoisesvn.net/downloads.zh.html
将 http://www.fachun.net/svn/musicapp/ checkout到 E:Pythondjangomusicmusicapp
结束后,添加原有的代码文件再commit。
如此,代码库中就拥有了我最新的完整源代码。

7. 简单的自动部署

我的要求不多,当有人修改或提交了文件,能立即在web上生效。
可以通过在版本库中创建post-commit脚本来实现。
每次我们提交了更改,post-commit脚本都会被自动执行。
比如在我的版本库中,该文件就应该位于 /var/svn/musicapp/hooks/文件夹下,它的内容是:

#!/bin/bash
svn export –force –no-auth-cache –username=someone –password=hispassword <a href="http://www.fachun.net/svn/musicapp" target="_blank">http://www.fachun.net/svn/musicapp</a> /var/www/somewhere/to/place/musicapp
exit 0

http://www.fachun.net/svn/musicapp是repository的地址。
/var/www/somewhere/to/place/musicapp是web应用的存放路径。
–no-auth-cache选项是必须的,否则脚本无法执行成功,svn命令会询问你是否保存密码。
在上传这个post-commit文件之后,请记得为其添加权限:

chmod +x post-commit
chown www-data post-commit

脚本中还可以添加其他内容,比如service apache2 reload,在部署django代码的时候,就可以让修改立即生效。

ubuntu下安裝nodejs最省心的方法

ubuntu的方法很多,apt里面非常旧里,还是4.x的;

源码解压编译其实并不省心,

我是这么安装

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs

如果安装nodejs 9.x版本

curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash -
sudo apt-get install -y nodejs

1感觉这种方法还是非常ok的r;

首先需要下载WebStrom的Linux安装包,地址如下:

https://www.jetbrains.com/webstorm/download/
然后运行如下命令解压并安装并运行WebStorm:

1、解压缩

sudo tar xfz ~/Downloads/WebStorm-16.2.3.tar.gz

2、解压文件移动到/opt下

sudo mv ~/Downloads/WebStorm-162.2228.20 /opt/

3、进入到此文件夹中:

cd /opt/WebStorm-162.2228.20/bin/

4、启动webstorm:

sudo sh webstorm.sh

参考

注册时,在打开的License Activation窗口中选择“License server”,在输入框输入下面的网址:

http://idea.codebeta.cn

Ubuntu安装php curl扩展

1、使用apt-cache搜索curl

sudo apt-cache search curl

在搜索结果里找到类似:

php5.6-curl - CURL module for PHP
php7.1-curl - CURL module for PHP

2、使用apt-get安装

选择php对应版本的curl,使用apt-get安装:

sudo apt-get install php7.1-curl

3、安装完成后重启相关服务,如php,apache

keepalived + haproxy + mysql 构建高可用数据库

keepalived + haproxy + mysql 构建高可用

  • keepalived 的高可用是主备,有一台作为备用
  • keepalived + haproxy 搭建的高可用是可以两台都会调度的高可用

拓扑图:

未分类

keepalived:负责抢占虚拟ip,使用vrrp协议
haproxy:负责做访问调度,减轻单点压力,单独监听一个端口,这里用23306

1、安装mysql

分别在两台机器上面搭建mysql,并做主从配置,这里不做介绍

2、搭建haproxy

  1. download 源码包,下载地址:http://www.haproxy.org/#down
  2. 在81.128和81.129解压缩安装
tar xf haproxy-1.8.4.tar.gz
cd haproxy-1.8.4
yum install -y gcc
make TARGET=linux310 ARCH=x86_64 # uname -a查看主机信息填写
make install SBINDIR=/usr/sbin/ MANDIR=/usr/share/man/ DOCDIR=/usr/share/doc/

3、提供启动脚本

#!/bin/sh
#
# haproxy
#
# chkconfig:   - 85 15
# description:  HAProxy is a free, very fast and reliable solution 
#               offering high availability, load balancing, and 
#               proxying for TCP and  HTTP-based applications
# processname: haproxy
# config:      /etc/haproxy/haproxy.cfg
# pidfile:     /var/run/haproxy.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

exec="/usr/sbin/haproxy"
prog=$(basename $exec)

[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

cfgfile=/etc/haproxy/haproxy.cfg
pidfile=/var/run/haproxy.pid
lockfile=/var/lock/subsys/haproxy

check() {
    $exec -c -V -f $cfgfile $OPTIONS
}

start() {
    $exec -c -q -f $cfgfile $OPTIONS
    if [ $? -ne 0 ]; then
        echo "Errors in configuration file, check with $prog check."
        return 1
    fi

    echo -n $"Starting $prog: "
    # start it up here, usually something like "daemon $exec"
    daemon $exec -D -f $cfgfile -p $pidfile $OPTIONS
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    # stop it here, often "killproc $prog"
    killproc $prog
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    $exec -c -q -f $cfgfile $OPTIONS
    if [ $? -ne 0 ]; then
        echo "Errors in configuration file, check with $prog check."
        return 1
    fi
    stop
    start
}

reload() {
    $exec -c -q -f $cfgfile $OPTIONS
    if [ $? -ne 0 ]; then
        echo "Errors in configuration file, check with $prog check."
        return 1
    fi
    echo -n $"Reloading $prog: "
    $exec -D -f $cfgfile -p $pidfile $OPTIONS -sf $(cat $pidfile)
    retval=$?
    echo
    return $retval
}

force_reload() {
    restart
}

fdr_status() {
    status $prog
}

case "$1" in
    start|stop|restart|reload)
        $1
        ;;
    force-reload)
        force_reload
        ;;
    check)
        check
        ;;
    status)
        fdr_status
        ;;
    condrestart|try-restart)
        [ ! -f $lockfile ] || restart
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|try-restart|reload|force-reload}"
        exit 2
esac

4、提供配置文件

mkdir /etc/haproxy
mkdir /var/lib/haproxy
useradd -r haproxy
vim /etc/haproxy/haproxy.cfg
global

    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    stats socket /var/lib/haproxy/stats

defaults
    mode                    tcp
    log                     global
    option                  dontlognull
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 600

listen stats
    mode http
    bind :6677 
    stats enable
    stats hide-version              
    stats uri     /haproxyadmin?stats
    stats realm   Haproxy Statistics
    stats auth    admin:admin
    stats admin if TRUE 

frontend  main 
    bind  *:23306
    default_backend             mysql

backend mysql
    balance     leastconn
    server m1 192.168.81.128:3306 check port 3306 maxconn 300
    server m2 192.168.81.129:3306 check port 3306 maxconn 300

5、修改日志系统

###Provides UDP syslog reception //去掉下面两行注释,开启UDP监听

$ModLoad imudp
$UDPServerRun 514

local2.* /var/log/haproxy.log //添加此行
service rsyslog restart

6、启动测试haproxy

service haproxy start 
chkconfig --add haproxy
chkconfig haproxy on
netstat -tnlp
mysql -P23306 -uroot -p123456 -h192.168.81.129 # 查看

server_id,判断是否成功

7、搭建keepalived

1、download 源码包,下载地址:http://www.keepalived.org/download.html

2、在81.128和81.129解压缩安装

tar xf keepalived-1.2.7.tar.gz 
cd keepalived-1.2.7
./configure --prefix=/usr/local/keepalived --sbindir=/usr/sbin/ --sysconfdir=/etc/ --mandir=/usr/local/share/man/
make && make install
chkconfig --add keepalived
chkconfig keepalived on

3、提供配置文件

vim /etc/keepalived/keepalived.conf # 两个机器配置文件不同

! Configuration File for keepalived

global_defs {           
notification_email {          # 忽略
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_haproxy {
    script "/etc/keepalived/chk.sh"     # 检查haproxy的脚本
    interval 2                          # 每两秒检查一次
}

vrrp_instance VI_1 {
    state BACKUP                        # 定义为BACKUP节点
    nopreempt                           # 开启不抢占,另一个不写
    interface ens33
    virtual_router_id 51
    priority 100                        # 开启了不抢占,所以此处优先级必须高于另一台,另一个写99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass abcd
    }
    virtual_ipaddress {
        192.168.81.150                  # 配置VIP
    }
    track_script {
        chk_haproxy                     # 调用检查脚本
    }

    notify_backup "/etc/init.d/haproxy restart"
    notify_fault "/etc/init.d/haproxy stop"
} 

4、创建check文件

vim /etc/keepalived/chk.sh
#!/bin/bash

if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
       /etc/init.d/keepalived stop
fi
chmod +x /etc/keepalived/chk.sh 
service keepalived start

5、测试

ip addr # 查看是否绑定了虚ip
tcpdump -nn -i ens33 vrrp # 抓包查看
http://192.168.81.128:6677/haproxyadmin?stats # 通过haproxy查看状态

Ubuntu设置Grub2密码的方法

Grub是一个来自Gnu项目的启动引导程序,它是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。在Ubuntu系统中,很多用户都会给Grub2设置密码,但具体该怎么操作呢?(以下操作在Ubuntu 17.10中有效)

操作步骤:

leekwen@leekwen:~# grub-mkpasswd-pbkdf2

Enter password:    <<<这里输入你的grub密码
Reenter password:  <<<这里输入你的grub密码

Your PBKDF2 is grub.pbkdf2.sha512.10000.BCxxxxxxxxxxxxx45572D3B4E40500CE

leekwen@leekwen:~# vim /etc/grub.d/40_custom  <<<这是您应该放置自己的自定义设置的地方

在40_custom文件末尾添加如下两行:

set superusers="leekwen"
password_pbkdf2 leekwen grub.pbkdf2.sha512.10000.BCxxxxxxxxxxxxx45572D3B4E40500CE

第二行的格式为:password_pbkdf2 user1 EncryptedPasswordOfUser1

leekwen@leekwen:/etc/grub.d# update-grub  <<<运行此命令才可以生效

  Generating grub.cfg ...
  Found linux image: /boot/vmlinuz-3.11.0-15-generic
  Found initrd image: /boot/initrd.img-3.11.0-15-generic
  Found memtest86+ image: /memtest86+.bin
  done

这样重启后,在grub启动菜单,启动操作系统,编辑引导项,或进入命令行时,都会让你输入:

  username:
  password:

只有用户名(比如我刚刚设置的用户名为:leekwen)及密码正确后(刚刚用grub-mkpasswd-pbkdf2生成的密码),才可以进入启动项的编辑菜单,启动项这一步倒是安全了,记住,修改40_custom后一定要运行“update-grub”命令,这样才能生效!

以上就是Ubuntu中设置Grub2密码的方法,不清楚的用户可以参考上面介绍的操作步骤来设置密码,有需要的用户赶紧试试吧!

使用centos系统中的crontab命令对mongodb定时备份恢复

通过centos脚本来执行备份操作,使用crontab命令实现定时备份与恢复功能,并删除指定天数前的备份

具体操作:

1、创建Mongodb数据库备份目录

mkdir -p /home/backup/mongod_bak/mongod_bak_now
mkdir -p /home/backup/mongod_bak/mongod_bak_list

2、新建Mongodb数据库备份脚本

vi /home/crontab/mongod_bak.sh #新建文件,输入以下代码
#!/bin/sh
DUMP=/usr/local/mongodb/bin/mongodump #mongodump备份文件执行路径
OUT_DIR=/home/backup/mongod_bak/mongod_bak_now #临时备份目录
TAR_DIR=/home/backup/mongod_bak/mongod_bak_list #备份存放路径
DATE=`date +%Y_%m_%d` #获取当前系统时间
DB_USER=username #数据库账号
DB_PASS=123456 #数据库密码
DAYS=7 #DAYS=7代表删除7天前的备份,即只保留最近7天的备份
TAR_BAK="mongod_bak_$DATE.tar.gz" #最终保存的数据库备份文件名
cd $OUT_DIR
rm -rf $OUT_DIR/*
mkdir -p $OUT_DIR/$DATE
$DUMP -u $DB_USER -p $DB_PASS -o $OUT_DIR/$DATE #备份全部数据库
tar -zcvf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE #压缩为.tar.gz格式
find $TAR_DIR/ -mtime +$DAYS -delete #删除7天前的备份文件

3、修改文件属性,使其可执行

chmod +x /home/crontab/mongod_bak.sh

4、修改/etc/crontab #添加计划任务

crontab -e

在下面添加

30 1 * * * root /home/crontab/mongod_bak.sh #表示每天凌晨1点30执行备份

5、重新启动crond使设置生效

/sbin/service crond reload #重新载入配置
chkconfig --level 35 crond on #加入开机自动启动:
/sbin/service crond start  #启动服务
crontab -l #列出crontab文件

每天在/home/backup/mongod_bak/mongod_bak_list目录下面可以看到mongod_bak_2017_02_28.tar.gz这样的压缩文件。

至此,Linux下自动备份Mongodb数据库并删除指定天数前的备份完成。

Mongodb定时恢复备份

恢复全部数据库:

mongorestore Cdrop Cdirectoryperdb 
/home/backup/mongod_bak/mongod_bak_now/2017_02_28/

恢复单个数据库:

mongorestore Cdrop -d dataname Cdirectoryperdb 
/home/backup/mongod_bak/mongod_bak_now/2017_02_28/dataname

Cdrop参数:恢复数据之前删除原来数据库数据,避免数据重复。

Cdirectoryperdb参数:数据库备份目录

-d参数:后面跟要恢复的数据库名称

crontab命令:

crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρ?νο?),原意是时间。

通常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。

安装crontab:

[root@CentOS ~]# yum install vixie-cron
[root@CentOS ~]# yum install crontabs

说明:
vixie-cron软件包是cron的主程序;
crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。

cron 是linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:

/sbin/service crond start #启动服务
/sbin/service crond stop #关闭服务
/sbin/service crond restart #重启服务
/sbin/service crond reload #重新载入配置

查看crontab服务状态:

service crond status

手动启动crontab服务:

service crond start

其他命令:

#查看crontab服务是否已设置为开机启动,执行命令:
ntsysv

#加入开机自动启动:
chkconfig --level 35 crond on

#列出crontab文件
crontab -l

#编辑crontab文件
crontab -e

#删除crontab文件
$ crontab -r

#恢复丢失的crontab文件
#假设你在自己的$HOME目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/<username>,其中<username >是用户名
#或者使用如下命令其中,<filename>是你在$HOME目录中副本的文件名
crontab <filename>

如何在Ubuntu系统中格式化优盘

2 种方法:

  • 使用磁盘实用程序
  • 使用终端

Ubuntu Linux系统中有多个实用程序,允许你对优盘进行格式化。你可以使用Ubuntu系统自带的磁盘实用程序,或使用终端格式化优盘。不论哪种方法,都可以在几分钟内完成格式化。

一、使用磁盘实用程序

未分类

1、点击Dash按钮,搜索“磁盘”。 在应用程序搜索结果中能看到“磁盘”程序。

未分类

2、从搜索结果中打开磁盘程序。左侧窗格中会出现已连接的设备列表。

未分类

3、从设备列表中选择优盘。它的详细情况会罗列在右侧面板中。

未分类

4、至少选中优盘上的一卷。大部分优盘上只有一卷,如果优盘上有很多卷,你可以选中一卷或全选。

未分类

5、点击右上方的齿轮按钮,选择“格式化”。 打开格式化选项。

未分类

6、选择你想要抹除的数据。快速格式化不会覆盖已存在的数据,而慢速格式化则会零覆盖已存在的数据,删除所有数据并查找错误。

未分类

7、选择文件类型。有多种不同的文件类型可供你选择。

  • 和其它设备兼容性最强的是“FAT”(FAT32)。它基本上适用于所有可使用优盘的电脑和设备。
  • 如果只想用于Linux电脑,请选择“ext3”。这允许你使用Linux高级文件权限。

未分类

8、格式化优盘。点击格式化按钮,等待优盘完成格式化。如果优盘上内容很多,需要抹除的数据很多,那么格式化需要花费一段时间。

二、使用终端

未分类

1、打开终端。可以从Dash上打开终端,或同时按下Ctrl+Alt+T组合键。

未分类

2、输入.lsblk ,按下 回车键。 接着会打开电脑已连接的存储设备列表。

未分类

3、找到优盘。使用 大小 一栏,在列表中找到优盘。

未分类

4、卸载优盘分区。你需要在格式化前卸载优盘。输入以下命令,按下优盘分区标签sdb1。

·sudo umount /dev/sdb1·

未分类

5、抹除设备上所有数据(可选)。你可以输入以下命令,删除所有数据。用优盘标签代替 sdb。

sudo dd if=/dev/zero of=/dev/sdb bs=4k && sync
这个过程会花费一点时间,并且可能出现卡顿现象。

未分类

6、创建一个新的分区表。这个分区表会控制驱动器上的卷。输入以下命令,用优盘标签代替 sdb。

输入·sudo fdisk /dev/sdb· ,按下回车键。按下O创建空白分区表。

未分类

7、按下.N 创建新分区。 输入你想要创建的分区大小。如果想要创建单独的分区,请输入整个优盘的大小。

未分类

8、按下.W 书写表格并退出。 这会花费一会时间。

未分类

9、再次运行.lsblk ,浏览新分区。 它会被列在游览标签的下方。

未分类

10、格式化新卷。此时已创建新卷,你可以将它格式化成选择的文件类型。输入以下命令,将它格式化成兼容性最强的FAT32文件系统。用分区标签代替sdb1。

sudo mkfs.vfat /dev/sdb1

未分类

11、完成后,安全弹出优盘。完成格式化后,安全弹出优盘:

sudo eject /dev/sdb

来源和引文

  • http://askubuntu.com/questions/198065/how-to-format-a-usb-drive
  • http://askubuntu.com/questions/22381/how-to-format-a-usb-flash-drive