最近对git很感兴趣。gistore是基于git的数据备份工具,比较好的一点是可以配置多少条历史备份之后回滚,把旧的历史抛弃。有意思的是,它有历史分支。
我们的mongo数据出了replicaset之外,没有做数据备份,在数据误操作的情况下就危险,所以我希望可以每天备份。
看看实际用起来如何。
LINUX是自由开源软件,在LINUX里一切都是文件,不管是命令,操作等等都是以文件形式保存,这篇博客来记录LINUX启动时的引导流程是通过哪写文件来完成的.
使用的LINUX版本是CentOS5,CentOS和Ubuntu都是自己联系使用时的较理想版本.
下面以CentOS5.5版本为例,介绍LINUX的引导流程,具体流程如下:
下面详细介绍每一步:
1)第一步firmware固件自检,主要是进行CMOS/BIOS对硬件进行POST加电自检,在物理层次上对硬件进行检测是否正常。例如检查硬盘是否插好等。
2)第二步读取硬盘中MBR的BootLoader,自启动程序,Linux下常用的自启动程序是GRUB。这一步主要的功能是载入内核。内核存放在/boot目录下
3)第三步就是载入的内核Kernel的过程,
主要功能是:1、驱动硬件,Kernel中含有大量驱动程序。2、启动init进程。
4)init进程,主要是读取/etc/inittab文件,执行缺省运行级别,从而继续引导。需要注意的是init京城的PID恒为1,是所有进程的父进程,而init进程的负景程是0,为内核调度器Kernel scheduler。
5)/etc/inittab 定义了初始化的操作。
inittab文件内容:
命令主要格式是:id: runlevels : action : process
其中,如上图红框中所示
1、run-levels运行级别有7个,0—6分别如下:
0 —— halt 关机
1 —— Single user mode 单用户模式
2 —— Multiuser,withoutNFS 多用户模式但不带网络(text模式)
3 —— Full multiuser mode 完整功能的多用户模式(text模式)
4 —— unused 预留
5 —— X11 图形化多用户模式
6 —— reboot 重启
可以根据这7个运行级别来进行切换
命令为:查看当前运行级别 #runlevel、 切换运行级别 #init[0 |1 |2 |3 |4 |5 |6]
2、而acion中也有几个比较重要的取值:
1 initdefault:指定系统缺省启动的运行级别,如上图中标出,通常用于修复,比如我们要进入单用户模式,则可以将其设置为1,不可将默认设置为0或6,否则无法启动.
2sysinit:系统启动执行process中指定的命令
由inittab文件内容可以看出,没有设置运行级别,即为无论是哪个运行级别,都会执行/etc/rc.d/rc.sysinit
6)initdefault,如第五步所说到的,主要是读取/etc/inittab中的信息,判断缺省的运行级别是什么。
7)/etc/rc.d/rc.sysinit
在inittab文件中运行到第21行,变是启动这个脚本。完成系统服务程序的启动,如系统环境变量的设置、设置系统时钟、加载字体、检查加载文件系统、生成系统启动信息日志文件等。由于是基础服务,因为其run-level设置为空::即任何级别,action设置为sysinit。即该脚本在任何运行级别下都要启动,以完成基础服务的启动
8)基础服务启动后,会执行/etc/rc.d/rc这个脚本
HTML:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Source.aspx.cs" Inherits="DzPlatForm.CRM.Property.Source" %>
<%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>来源配置</title>
<link rel="stylesheet" type="text/css" href=/blog_article/"resources/css/main.css" />
<ext:ResourcePlaceHolder ID="ResourcePlaceHolder1" runat="server" Mode="Script" />
<ext:ResourcePlaceHolder ID="ResourcePlaceHolder2" Mode="Style" runat="server">
<script src=/blog_article/Scripts/am.js" type="text/javascript"></script>
</ext:ResourcePlaceHolder>
</head>
<body>
<form id="form1" runat="server">
<ext:ResourceManager ID="ResourceManager1" runat="server" />
<ext:TreeGrid ID="TreeGrid1" runat="server" UseArrows="true" Animate="true" AutoHeight="true"
AutoScroll="true" ForceLayout="true" Collapsed="false">
<Columns>
<ext:TreeGridColumn Header="来源名称" Width="300" DataIndex="Name">
</ext:TreeGridColumn>
<ext:TreeGridColumn Header="父节点" DataIndex="ParentId" Hidden="true" >
</ext:TreeGridColumn>
</Columns>
<TopBar>
<ext:Toolbar ID="Toolbar1" runat="server">
<Items>
<ext:SplitButton ID="SplitButton1" runat="server" Text="新建来源" Icon="Add">
<Menu>
<ext:Menu ID="Menu1" runat="server">
<Items>
<ext:MenuItem ID="menuAdd" runat="server" Text="新建顶层来源" Icon="Add">
<DirectEvents>
<Click OnEvent="Menu_Click">
<EventMask ShowMask="true" />
<ExtraParams>
<ext:Parameter Name="Item" Value="menuAdd" Mode="Value" />
</ExtraParams>
</Click>
</DirectEvents>
</ext:MenuItem>
<ext:MenuItem ID="menuAddSubitem" runat="server" Text="新建当前选中子来源" Icon="DatabaseAdd">
<DirectEvents>
<Click OnEvent="Menu_Click">
<EventMask ShowMask="true" />
<ExtraParams>
<ext:Parameter Name="Item" Value="menuAddSubitem" Mode="Value" />
</ExtraParams>
</Click>
</DirectEvents>
</ext:MenuItem>
</Items>
</ext:Menu>
</Menu>
</ext:SplitButton>
<ext:Button ID="Button1" runat="server" Text="修改" Icon="DatabaseEdit">
<DirectEvents>
<Click OnEvent="Menu_Click">
<EventMask ShowMask="true" Msg="修改..." MinDelay="500" />
<ExtraParams>
<ext:Parameter Name="Item" Value="menuEdit" Mode="Value" />
</ExtraParams>
</Click>
</DirectEvents>
</ext:Button>
<ext:Button ID="Button3" runat="server" Text="删除" Icon="DatabaseDelete">
<Listeners>
<Click Handler="DeleteNodeForTree2(#{TreeGrid1},#{txtValue});" />
</Listeners>
</ext:Button>
</Items>
</ext:Toolbar>
</TopBar>
<Listeners>
<Click Handler="Ext.net.DirectMethods.ClickCurrentNode(node.attributes.Id+'|'+node.attributes.Name+'|'+node.attributes.ParentId)" />
</Listeners>
</ext:TreeGrid>
<ext:Window ID="winMenuAdd" runat="server" Icon="Table" Closable="true" Title=""
AutoHeight="true" Width="450" Resizable="false" BodyStyle="background-color:#fff;"
Padding="15" Layout="FormLayout" ForceLayout="true" Hidden="true" Modal="true">
<Items>
<ext:TextField ID="txt_Menu_Name_varchar2" runat="server" Width="220" FieldLabel="来源名称"
LabelStyle="margin:5px 0 5 0;" StyleSpec="margin:5px 0 5 0;" />
<ext:TextField ID="txt_Menu_ParentID_number" runat="server" Enabled="false" Width="220"
FieldLabel="父节点编号" LabelStyle="margin:5px 0 5 0;" StyleSpec="margin:5px 0 5 0;"
Text="-1" Hidden="true" />
<ext:Hidden ID="txtValue" runat="server" Text="" />
<ext:Hidden ID="txtType" runat="server" Text="add" />
</Items>
<Buttons>
<ext:Button ID="btn_save" runat="server" Text="保存" Icon="Disk">
<Listeners>
<Click Handler="AddNodeForTree(#{TreeGrid1});" />
</Listeners>
</ext:Button>
</Buttons>
</ext:Window>
</form>
</body>
</html>
CS:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Ext.Net;
using DzPlatForm.Control;
using System.Data;
using DzPlatForm.DBUtility;
namespace DzPlatForm.CRM.Property
{
public partial class Source : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!X.IsAjaxRequest)
{
Session["utype"] = 1;
this.BuildTree(TreeGrid1.Root);
}
}
/// <summary>
/// 初始化树形列表
/// </summary>
/// <param name="nodes"></param>
/// <returns></returns>
private Ext.Net.TreeNodeCollection BuildTree(Ext.Net.TreeNodeCollection nodes)
{
if (Session["utype"] == null)
{
Response.Redirect("Login.aspx");
return null;
}
else
{
string sql = "SELECT [Id],[ParentId],[Name] FROM [OA].[dbo].[CustomerSource] ";
TreeTableControl treeTable = new TreeTableControl();
DataTable dt = DbHelperSQL.ExecuteDT(sql, null);
Ext.Net.TreeNode tvn = treeTable.BindTableTree(dt);
nodes.Add(tvn);
return nodes;
}
}
/// <summary>
/// 刷新树形列表
/// </summary>
/// <returns></returns>
[DirectMethod]
public string RefreshMenu()
{
TreeGrid1.Root.Clear();
Ext.Net.TreeNodeCollection nodes = this.BuildTree(TreeGrid1.Root);
return nodes.ToJson();
}
/// <summary>
/// 操作集合
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Menu_Click(object sender, DirectEventArgs e)
{
string item = e.ExtraParams.GetParameter("Item").Value;
string[] strValue = txtValue.Text.Split('|');
switch (item)
{
case "menuAddSubitem":
if (strValue.Length <= 1)
Notification.Show(new NotificationConfig
{