最近对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 {