Git 入门

一、诞生

很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。

Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?

事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!

你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。

不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。

安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。

Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:

Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。

Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。

二、安装

请参考 Github 上的教程。

三、配置

Git 提供了 git config 工具,专门用来配置或读取相应的工作环境变量。这些变量可以存放在以下三个不同的地方:

  • /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 –system 选项,读写的就是这个文件。
  • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 –global 选项,读写的就是这个文件。
  • 工作目录中的 .git/config 文件:这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。

配置用户信息

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
$ git config --global core.editor emacs
$ git config --global merge.tool vimdiff

查看配置信息

要检查已有的配置信息,可以使用 git config –list 命令:

$ git config --list
user.name=Scott Chacon
user.email=schacon@gmail.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...

有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如 /etc/gitconfig 和 ~/.gitconfig),不过最终 Git 实际采用的是最后一个。

也可以直接查阅某个环境变量的设定。

$ git config user.name
Scott Chacon

设置快捷键

$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
$ git config --global alias.unstage 'reset HEAD --'
$ git config --global alias.last 'log -1 HEAD'

自动补全

wget https://raw.github.com/git/git/master/contrib/completion/git-completion.bash
mv git-completion.bash /etc/bash_completion.d/

四、初始化

以下内容过多,详细内容请查看这本教程:《Pro Git 2nd Edition》

配置与 github 的连接

ssh-agent bash
ssh-agent -s
ssh-add ~/.ssh/xxx@xxx.com
ssh -T git@github.com

配置代理

参考这篇文章 —— 《git 国内加速代理》

初始化设置

git config --global user.name "xxx"
git config --global user.email "xxx@xxx.com"
git config --global pull.rebase true # 设置默认使用 rebase 而不用 merge
git branch --set-upstream master origin/master # 设置默认分支
git push --set-upstream origin master # 设置默认分支

拉取全新新项目

git clone xxx.git
cd test
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master

已有文件夹中创建项目

cd existing_folder
git init
git remote add origin xxx.git
git add .
git commit -m "Initial commit"
git push -u origin master

关联已有项目

cd existing_repo
git remote add origin xxx.git
git push -u origin --all
git push -u origin --tags

取消关联

git remote remove origin

重新设置远程仓库并关联新分支

方法一 直接修改
git remote xxx 查看指定远程仓库地址
git remote set-url origin git@github.com:kelvinblood/KeluLinuxKit.git
方法二 先删除再添加
git remote rm origin
git remote add origin git@github.com:kelvinblood/KeluLinuxKit.git
方法三 修改配置文件

进入git_test/.git 文件夹

[core] 
repositoryformatversion = 0 
filemode = true 
logallrefupdates = true 
precomposeunicode = true 
[remote "origin"] 
url = git@github.com:kelvinblood/KeluLinuxKit.git
fetch = +refs/heads/*:refs/remotes/origin/* 
[branch "master"] 
remote = origin 
merge = refs/heads/master
关联本地分支与远程分支
git branch --set-upstream-to=origin/remote_branch  your_branch

.gitignore

# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
# ignore all .txt files in the doc/ directory
doc/**/*.txt

克隆指定深度

git clone --depth=1 git://someserver/somerepo

depth 用于指定克隆深度,为1即表示只克隆最近一次commit.

创建新的空白分支(孤儿分支)

创建为孤儿分支:

git checkout --orphan <branchname>

然后清除仓库中的缓存:

git rm --cached -r .

删除所有文件:

rm -rf *
echo '' > .gitignore

初始化提交

touch readme
git add .
git commit -m "init"

push

git push --set-upstream origin <branchname>

五、编辑操作

拉新分支

git checkout --track -b komachi origin/komachi

追加提交

$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

撤销提交

$ git checkout -- benchmarks.rb
$ git reset HEAD benchmarks.rb
$ git reset --soft xxx
$ git reset --hard xxx

文件对比

$ git diff		# 看暂存前后的变化
$ git diff --cached # 查看已经暂存起来的变化:
$ git rm 记录此次移除文件
$ git mv file_from file_to

查看一个文件的修改历史

$ git log [file_name]

查看文件每一行的提交记录

当事情出错时,先去指责别人是人类的天性之一。如果你的产品服务器挂了,使用git blame命令可以很容易找出罪魁祸首。这个命令可以将文件中的每一行的作者、最新的变更提交和提交时间展示出来。

$ git blame [file_name]

提交历史

$ git log -p -2			# 最近的两次更新
$ git log --pretty=format:"%h %cr %s" --graph
	--oneline- 压缩模式,以一行显示
	--graph- 图形模式
	--all- 显示所有
$ git log -n 1 --stat 	# 查看上次提交影响的文件
$ git reflog 			# 本地的历史节点

git reflog列出了head曾经指向过的一系列commit。要明白它们只存在于你本机中;而不是你的版本仓库的一部分,也不包含在push和merge操作中。

log的一些选项以及释义

选项	说明
-p	按补丁格式显示每个更新之间的差异。
--word-diff	按 word diff 格式显示差异。
--stat	显示每次更新的文件修改统计信息。
--shortstat	只显示 --stat 中最后的行数修改添加移除统计。
--name-only	仅在提交信息后显示已修改的文件清单。
--name-status	显示新增、修改、删除的文件清单。
--abbrev-commit	仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
--relative-date	使用较短的相对时间显示(比如,“2 weeks ago”)。
--graph	显示 ASCII 图形表示的分支合并历史。
--pretty	使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。
--oneline	--pretty=oneline --abbrev-commit 的简化用法。

六、打包导出

标签

$ git tag v1.4-lw # 创建tag
$ git tag -n # 显示已有tag

$ git ls-remote --tags origin # 显示远端tag
$ git fetch --all --tags # 拉取最新tag

$ git checkout tags/v1.20.2 # 切换到tag
$ git checkout -b v1.20.2 tags/v1.20.2 # 切换到tag并创建分支

冲突

如果合并出现冲突,则修改冲突文件,并删除 «««<,======= 和 »»»> 这些行。在解决了所有文件里的所有冲突后,运行 git add 将把它们标记为已解决状态,再运行一次 git status 来确认所有冲突都已解决.

导出

Git提供了archive命令,可以导出一个干净的项目文档,不包括版本控制文件。

git archive --format zip -o kelu.zip HEAD
git archive -–format zip -o site-$(git log –pretty=format:”%h” -1).zip HEAD

git archive --format zip --output /path/to/file.zip master # 将 master 以zip格式打包到指定文件

导出最近一次提交的 Git 变更文件

这个命令是和gpt讨论出来的。

git archive -o "$(basename "$(pwd)").zip" HEAD $(git diff --name-only HEAD^ HEAD)

七、分支相关

本地分支

$ git branch testing 	# 新建分支	
$ git checkout testing 	# 切换分支
$ git checkout -b iss53 # 新建并切换到分支
$ git branch -d hotfix  # 删除分支
$ git merge iss53		# 合并分支到当前分支

远程分支

$ git push origin dev  # 生成远程dev分支
$ git push origin feature
$ git branch -r 		# 查看远程分支
$ git checkout --track origin/dev		# 从远程拉取并切换到dev分支
$ git checkout -b develop origin/dev	# 从远程拉取dev命名为develop,并切换
$ git push origin dev:dev				# 提交本地分支,如果在dev分支下工作,可直接git push
$ git push origin :dev				# 删除远程分支
$ git fetch origin					# 同步本地远程分

现场存储

当你正在开发一个功能时,突然boss让你尽快修改一个bug,此时最紧急的是fix bug. 而正开发的功能尚未完善还不能提交,这个时候就会想到能不能将手头的工作隔离开,去单单解决bug,然后提交bug,然后在进行手头工作。

$ git stash  #把当前工作现场“储藏”起来	
$ git stash pop # 还原成最新的现场,并删除stash列表里的这个存储
$ git stash apply #重新回来原来的工作时,只需把Stash区域的内容取出来应用到当前工作目录就行
$ git stash apply stash@{1} #应用某一个队列
$ git stash list #查看所有stash列表
$ git stash show #显示stash的内容具体是什么,同git stash apply一样,可以选择指定stash的名字。

git stash apply之后再git stash list会发现,apply后的stash还在stash列表中,如果要将其从stash列表中删除可以用:

$ git stash drop	#丢弃这个stash,stash的命令参数都可选择指定stash名字,否则就是最新的stash。
$ git stash pop #是应用与删除的快捷,一个命令即可
$ git stash apply --index #维持原来的样子,原来暂存的文件仍然是暂存状态,可以加上--index参数,否则都将变成未暂存状态

分支衍合merge

把一个分支整合到另一个分支有两种方法:merge和rebase(衍合) merge是把两个分支最新的快照和二者最新的共同祖先进行三方合并,产生一个新的提交对象。

$ git merge issueFix

如果没有冲突的话,merge完成。有冲突的话,git会提示那个文件中有冲突,比如有如下冲突:

	<<<<<<< HEAD:test.c	
	printf (“test1″);
	=======
	printf (“test2″);
	>>>>>>> issueFix:test.c

merge有两个参数,

git merge --no-ff指的是强行关闭fast-forward方式。

fast-forward方式就是当条件允许的时候,git直接把HEAD指针指向合并分支的头,完成合并。属于“快进方式”,有个地方不好的就是不能显示历史信息,在以后开发中我不知道有哪些分支曾经合并过,所以最好使用 no-ff:no fast forward的合并方式,这种方式在合并的同时会生成一个新的commit,这样,从分支历史上就可以看出分支信息。

$ git merge --no-ff -m "merge with no-ff" dev

git merge --squash 是用来把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,于是使用–squash进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。需要进行一次额外的commit来“总结”一下,然后完成最终的合并。

总结: –no-ff:不使用fast-forward方式合并,保留分支的commit历史 –squash:使用squash方式合并,把多次分支commit历史压缩为一次

image

分支衍合cherry-pick

ps:Cherry-pick的内容转载自Git笔记(三) - 进击的马斯特

cherry-pick其实在工作中还挺常用的,一种常见的场景就是,比如我在A分支做了几次commit以后,发现其实我并不应该在A分支上工作,应该在B分支上工作,这时就需要将这些commit从A分支复制到B分支去了,这时候就需要cherry-pick命令了,B分支指着这些commit说:妈妈,我也要!

比如说,我们在master分支上继续做两次提交,第一次添加一行”test 10”,git commit -am "commit 10",第二次添加“test 11”,到达如下图的状态:

图25

这个时候我们发现,哦NO,我们不应该直接更改master分支,我们应该在自己的分支上做提交。这个时候先新建一个分支git checkout -b branch3 1a222c3,注意这里的最后一个参数是新分支的起点,也就是说,新的分支branch3是从“commit 8,9”开始的,现在我们需要把刚才的两次提交移动到新的分支上。运行git cherry-pick 0bda20e 1a04d5f,命令行会给出提示两个commit被复制到了当前分支上,此时SourceTree的状态如下图:

图26 确定这两个commit被复制到指定分支以后,在master分支上将这两个commit删除。先切回master分支:git checkout master,运行git reset --hard 1a222c3,此时SourceTree的状态图为:

图27 两个commit被成功的从master分支移动到了branch3分支。

分支衍合rebase

rebase是回到两个分支的共同祖先,根据要进行衍合的分支dev的历次提交对象,生成一系列文件补丁,然后以主干分支master的最后一个提交对象为新的出发点,逐个应用dev分支准备好的补丁文件,生成一个新的提交对象,改写dev的提交历史,使dev成为master的直接下游。然后回到master分支,进行一次快进合并。这样能够保持更加清晰的提交记录,就像没有使用过分支一样。

$ git checkout dev
$ git rebase master

分支策略

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

八、常用配置

git config --global user.name "kelu"
git config --global user.email admin@kelu.org
git config --global core.editor vim
git config --global merge.tool vimdiff
git config --global core.quotepath false
git config --global i18n.commitencoding utf-8
git config --global i18n.logoutputencoding utf-8
git config --global http.https://github.com.proxy 'socks5://xxx:1080'

git config --edit
git config --list

ssh的一些介绍

很久没有写blog了,刚刚想找一下markdown快捷键的文档都找不到了Orz。果然是逆水行舟,很久没磨练技术,技能都已经生疏了。于是从今天开始,针对每天开发时遇到的一些小问题,记录一篇(希望如此)。

前言

SSH全称Secure SHell,SSH协议是IETF(Internet Engineering Task Force)的Network Working Group所制定的一种协议。SSH的主要目的是用来取代传统的telnet和R系列命令(rlogin,rsh,rexec等)远程登陆和远程执行命令的工具,实现对远程登陆和远程执行命令加密。防止由于网络监听而出现的密码泄漏,对系统构成威胁。

在出现SSH之前,系统管理员需要登入远程服务器执行系统管理任务时,都是用telnet来实现的,telnet协议采用明文密码传送,在传送过程中对数据也不加密,很容易被不怀好意的人在网络上监听到密码。同样,在SSH工具出现之前R系列命令也很流行(由于这些命令都以字母r开头,故把这些命令合称为R系列命令R是remote的意思),比如rexec是用来执行远程服务器上的命令的,和telnet的区别是telnet需要先登陆远程服务器再实行相关的命令,而R系列命令可以把登陆和执行命令并登出系统的操作整合在一起。这样就不需要为在远程服务器上执行一个命令而特地登陆服务器了。

ssh协议目前有SSH1和SSH2,SSH2协议兼容SSH1。目前实现SSH1和SSH2协议的主要软件有OpenSSH和SSH Communications Security Corporation 公司的SSH Communications 软件。前者是OpenBSD组织开发的一款免费的SSH软件,后者是商业软件,因此在linux、FreeBSD、OpenBSD、NetBSD等免费类UNIX系统种,通畅都使用OpenSSH作为SSH协议的实现软件。需要注意的是OpenSSH和SSH Communications的登陆公钥/私钥的格式是不同的,如果想用SSH Communications产生的私钥/公钥对来登入到使用OpenSSH的linux系统需要对公钥/私钥进行格式转换。

OpenSSH的命令

sshd ―― SSH服务端程序
sftp-server ―― SFTP服务端程序(类似FTP但提供数据加密的一种协议)
scp ―― 非交互式sftp-server的客户端,用来向服务器上传/下载文件
sftp ―― 交互式sftp-server客户端,用法和ftp命令一样。
slogin ―― ssh的别名
ssh ―― SSH协议的客户端程序,用来登入远程系统或远程执行命令
ssh-add ――    SSH代理相关程序,用来向SSH代理添加dsa key
ssh-agent ――    ssh代理程序
ssh-keyscan ―― ssh public key 生成器

SSH最常用的使用方式是代替telnet进行远程登陆。不同于telnet的密码登陆,SSH还同时支持Publickey、Keybord Interactive、GSSAPI等多种登入方式,不像telnet那样只有输入系统密码一种途径。目前最常用的登陆方式还是传统的Password方式和Publickey方式登陆。

生成公钥私钥

首先在本地生成密钥

# ssh-keygen -b 1024 -t rsa -C your.email -f ~/.ssh/your.email

产生的公钥/私钥文件在用户home目录的.ssh目录下,其中xxx.pub是公钥,把产生的公钥上传到需要登陆的服务器的对应用户目录的home目录的.ssh目录下,.ssh目录的权限必须是700,否则ssh服务器会拒绝登陆。ssh默认的公钥文件是用户home目录下的.ssh目录下的authorized_keys文件,因此需要把产生的公钥以这个文件名放到服务器的/root/.ssh/目录下,这个文件中可以存放多个客户端的公钥文件.

私钥必须是600权限,否则ssh服务器会拒绝用户登陆。

本地配置

如果拥有多个 ssh 账号,要记住每个ssh 账号的参数,还是非常麻烦的事情。ssh 提供一种优雅且灵活的方式来解决这个问题,就是利用 ssh 的用户配置文件 config 管理 ssh 会话。ssh 的用户配置文件是放在当前用户根目录下的 .ssh 文件夹里(~/.ssh/config,不存在则新创建一个),其配置写法如下:

Host    别名
    HostName        主机名
    Port            端口
    User            用户名
    IdentityFile    密钥文件的路径

有了这些配置,就可以这样用 ssh 登陆服务器了:

ssh 别名

登录命令

# ssh hostname
# ssh -p xxx username@hostname
# ssh 别名

服务器配置

一共有两个配置文件 /etc/ssh/ssh_config 和 /etc/ssh/sshd_config


中华人民共和国网络安全法(草案)

第一章 总则
第二章 网络安全战略、规划与促进
第三章 网络运行安全
第四章 网络信息安全
第五章 监测预警与应急处置
第六章 法律责任
第七章 附则

第一章 总  则

  第一条 为了保障网络安全,维护网络空间主权和国家安全、社会公共利益,保护公民、法人和其他组织的合法权益,促进经济社会信息化健康发展,制定本法。
  第二条 在中华人民共和国境内建设、运营、维护和使用网络,以及网络安全的监督管理,适用本法。
  第三条 国家坚持网络安全与信息化发展并重,遵循积极利用、科学发展、依法管理、确保安全的方针,推进网络基础设施建设,鼓励网络技术创新和应用,建立健全网络安全保障体系,提高网络安全保护能力。
  第四条 国家倡导诚实守信、健康文明的网络行为,采取措施提高全社会的网络安全意识和水平,形成全社会共同参与促进网络安全的良好环境。
  第五条 国家积极开展网络空间治理、网络技术研发和标准制定、打击网络违法犯罪等方面的国际交流与合作,推动构建和平、安全、开放、合作的网络空间。
  第六条 国家网信部门负责统筹协调网络安全工作和相关监督管理工作。国务院工业和信息化、公安部门和其他有关部门依照本法和有关法律、行政法规的规定,在各自职责范围内负责网络安全保护和监督管理工作。
  县级以上地方人民政府有关部门的网络安全保护和监督管理职责按照国家有关规定确定。
  第七条 建设、运营网络或者通过网络提供服务,应当依照法律、法规的规定和国家标准、行业标准的强制性要求,采取技术措施和其他必要措施,保障网络安全、稳定运行,有效应对网络安全事件,防范违法犯罪活动,维护网络数据的完整性、保密性和可用性。
  第八条 网络相关行业组织按照章程,加强行业自律,制定网络安全行为规范,指导会员依法加强网络安全保护,提高网络安全保护水平,促进行业健康发展。
  第九条 国家保护公民、法人和其他组织依法使用网络的权利,促进网络接入普及,提升网络服务水平,为社会提供安全、便利的网络服务,保障网络信息依法有序自由流动。
  任何个人和组织使用网络应当遵守宪法和法律,遵守公共秩序,尊重社会公德,不得危害网络安全,不得利用网络从事危害国家安全、宣扬恐怖主义和极端主义、宣扬民族仇恨和民族歧视、传播淫秽色情信息、侮辱诽谤他人、扰乱社会秩序、损害公共利益、侵害他人知识产权和其他合法权益等活动。
第十条 任何个人和组织都有权对危害网络安全的行为向网信、工业和信息化、公安等部门举报。收到举报的部门应当及时依法作出处理;不属于本部门职责的,应当及时移送有权处理的部门。

第二章 网络安全战略、规划与促进

  第十一条 国家制定网络安全战略,明确保障网络安全的基本要求和主要目标,提出完善网络安全保障体系、提高网络安全保护能力、促进网络安全技术和产业发展、推进全社会共同参与维护网络安全的政策措施等。
  第十二条 国务院通信、广播电视、能源、交通、水利、金融等行业的主管部门和国务院其他有关部门应当依据国家网络安全战略,编制关系国家安全、国计民生的重点行业、重要领域的网络安全规划,并组织实施。
  第十三条 国家建立和完善网络安全标准体系。国务院标准化行政主管部门和国务院其他有关部门根据各自的职责,组织制定并适时修订有关网络安全管理以及网络产品、服务和运行安全的国家标准、行业标准。
  国家支持企业参与网络安全国家标准、行业标准的制定,并鼓励企业制定严于国家标准、行业标准的企业标准。
  第十四条 国务院和省、自治区、直辖市人民政府应当统筹规划,加大投入,扶持重点网络安全技术产业和项目,支持网络安全技术的研究开发、应用和推广,保护网络技术知识产权,支持科研机构、高等院校和企业参与国家网络安全技术创新项目。
  第十五条 各级人民政府及其有关部门应当组织开展经常性的网络安全宣传教育,并指导、督促有关单位做好网络安全宣传教育工作。
  大众传播媒介应当有针对性地面向社会进行网络安全宣传教育。
  第十六条 国家支持企业和高等院校、职业学校等教育培训机构开展网络安全相关教育与培训,采取多种方式培养网络安全技术人才,促进网络安全技术人才交流。

第三章 网络运行安全

第一节 一般规定
第十七条 国家实行网络安全等级保护制度。网络运营者应当按照网络安全等级保护制度的要求,履行下列安全保护义务,保障网络免受干扰、破坏或者未经授权的访问,防止网络数据泄露或者被窃取、篡改:
  (一)制定内部安全管理制度和操作规程,确定网络安全负责人,落实网络安全保护责任;
  (二)采取防范计算机病毒和网络攻击、网络入侵等危害网络安全行为的技术措施;
  (三)采取记录、跟踪网络运行状态,监测、记录网络安全事件的技术措施,并按照规定留存网络日志;
  (四)采取数据分类、重要数据备份和加密等措施;
  (五)法律、行政法规规定的其他义务。
  网络安全等级保护的具体办法由国务院规定。
  第十八条 网络产品、服务应当符合相关国家标准、行业标准。网络产品、服务的提供者不得设置恶意程序;其产品、服务具有收集用户信息功能的,应当向用户明示并取得同意;发现其网络产品、服务存在安全缺陷、漏洞等风险时,应当及时向用户告知并采取补救措施。
  网络产品、服务的提供者应当为其产品、服务持续提供安全维护;在规定或者当事人约定的期间内,不得终止提供安全维护。
  第十九条 网络关键设备和网络安全专用产品应当按照相关国家标准、行业标准的强制性要求,由具备资格的机构安全认证合格或者安全检测符合要求后,方可销售。国家网信部门会同国务院有关部门制定、公布网络关键设备和网络安全专用产品目录,并推动安全认证和安全检测结果互认,避免重复认证、检测。
  第二十条 网络运营者为用户办理网络接入、域名注册服务,办理固定电话、移动电话等入网手续,或者为用户提供信息发布服务,应当在与用户签订协议或者确认提供服务时,要求用户提供真实身份信息。用户不提供真实身份信息的,网络运营者不得为其提供相关服务。
  国家支持研究开发安全、方便的电子身份认证技术,推动不同电子身份认证技术之间的互认、通用。
  第二十一条 网络运营者应当制定网络安全事件应急预案,及时处置系统漏洞、计算机病毒、网络入侵、网络攻击等安全风险;在发生危害网络安全的事件时,立即启动应急预案,采取相应的补救措施,并按照规定向有关主管部门报告。
  第二十二条 任何个人和组织不得从事入侵他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动;不得提供从事入侵网络、干扰网络正常功能、窃取网络数据等危害网络安全活动的工具和制作方法;不得为他人实施危害网络安全的活动提供技术支持、广告推广、支付结算等帮助。
  第二十三条 为国家安全和侦查犯罪的需要,侦查机关依照法律规定,可以要求网络运营者提供必要的支持与协助。
  第二十四条 国家支持网络运营者之间开展网络安全信息收集、分析、通报和应急处置等方面的合作,提高网络运营者的安全保障能力。
  有关行业组织建立健全本行业的网络安全保护规范和协作机制,加强对网络安全风险的分析评估,定期向会员进行风险警示,支持、协助会员应对网络安全风险。
第二节 关键信息基础设施的运行安全
  第二十五条 国家对提供公共通信、广播电视传输等服务的基础信息网络,能源、交通、水利、金融等重要行业和供电、供水、供气、医疗卫生、社会保障等公共服务领域的重要信息系统,军事网络,设区的市级以上国家机关等政务网络,用户数量众多的网络服务提供者所有或者管理的网络和系统(以下称关键信息基础设施),实行重点保护。关键信息基础设施安全保护办法由国务院制定。
  第二十六条 国务院通信、广播电视、能源、交通、水利、金融等行业的主管部门和国务院其他有关部门(以下称负责关键信息基础设施安全保护工作的部门)按照国务院规定的职责,分别负责指导和监督关键信息基础设施运行安全保护工作。
  第二十七条 建设关键信息基础设施应当确保其具有支持业务稳定、持续运行的性能,并保证安全技术措施同步规划、同步建设、同步使用。
  第二十八条 除本法第十七条的规定外,关键信息基础设施的运营者还应当履行下列安全保护义务:
  (一)设置专门安全管理机构和安全管理负责人,并对该负责人和关键岗位的人员进行安全背景审查;
  (二)定期对从业人员进行网络安全教育、技术培训和技能考核;
  (三)对重要系统和数据库进行容灾备份;
  (四)制定网络安全事件应急预案,并定期组织演练;
  (五)法律、行政法规规定的其他义务。
  第二十九条 关键信息基础设施的运营者采购网络产品和服务,应当与提供者签订安全保密协议,明确安全和保密义务与责任。
  第三十条 关键信息基础设施的运营者采购网络产品或者服务,可能影响国家安全的,应当通过国家网信部门会同国务院有关部门组织的安全审查。具体办法由国务院规定。
  第三十一条 关键信息基础设施的运营者应当在中华人民共和国境内存储在运营中收集和产生的公民个人信息等重要数据;因业务需要,确需在境外存储或者向境外的组织或者个人提供的,应当按照国家网信部门会同国务院有关部门制定的办法进行安全评估。法律、行政法规另有规定的从其规定。
  第三十二条 关键信息基础设施的运营者应当自行或者委托专业机构对其网络的安全性和可能存在的风险每年至少进行一次检测评估,并对检测评估情况及采取的改进措施提出网络安全报告,报送相关负责关键信息基础设施安全保护工作的部门。
  第三十三条 国家网信部门应当统筹协调有关部门,建立协作机制。对关键信息基础设施的安全保护可以采取下列措施:
  (一)对关键信息基础设施的安全风险进行抽查检测,提出改进措施,必要时可以委托专业检验检测机构对网络存在的安全风险进行检测评估;
  (二)定期组织关键信息基础设施的运营者进行网络安全应急演练,提高关键信息基础设施应对网络安全事件的水平和协同配合能力;
  (三)促进有关部门、关键信息基础设施运营者以及网络安全服务机构、有关研究机构等之间的网络安全信息共享;
  (四)对网络安全事件的应急处置与恢复等,提供技术支持与协助。

第四章 网络信息安全

  第三十四条 网络运营者应当建立健全用户信息保护制度,加强对用户个人信息、隐私和商业秘密的保护。
  第三十五条 网络运营者收集、使用公民个人信息,应当遵循合法、正当、必要的原则,明示收集、使用信息的目的、方式和范围,并经被收集者同意。
  网络运营者不得收集与其提供的服务无关的公民个人信息,不得违反法律、行政法规的规定和双方的约定收集、使用公民个人信息,并应当依照法律、行政法规的规定或者与用户的约定,处理其保存的公民个人信息。
  网络运营者收集、使用公民个人信息,应当公开其收集、使用规则。
  第三十六条 网络运营者对其收集的公民个人信息必须严格保密,不得泄露、篡改、毁损,不得出售或者非法向他人提供。
  网络运营者应当采取技术措施和其他必要措施,确保公民个人信息安全,防止其收集的公民个人信息泄露、毁损、丢失。在发生或者可能发生信息泄露、毁损、丢失的情况时,应当立即采取补救措施,告知可能受到影响的用户,并按照规定向有关主管部门报告。
  第三十七条 公民发现网络运营者违反法律、行政法规的规定或者双方的约定收集、使用其个人信息的,有权要求网络运营者删除其个人信息;发现网络运营者收集、存储的其个人信息有错误的,有权要求网络运营者予以更正。
  第三十八条 任何个人和组织不得窃取或者以其他非法方式获取公民个人信息,不得出售或者非法向他人提供公民个人信息。
  第三十九条 依法负有网络安全监督管理职责的部门,必须对在履行职责中知悉的公民个人信息、隐私和商业秘密严格保密,不得泄露、出售或者非法向他人提供。
  第四十条 网络运营者应当加强对其用户发布的信息的管理,发现法律、行政法规禁止发布或者传输的信息的,应当立即停止传输该信息,采取消除等处置措施,防止信息扩散,保存有关记录,并向有关主管部门报告。
  第四十一条 电子信息发送者发送的电子信息,应用软件提供者提供的应用软件不得设置恶意程序,不得含有法律、行政法规禁止发布或者传输的信息。
  电子信息发送服务提供者和应用软件下载服务提供者,应当履行安全管理义务,发现电子信息发送者、应用软件提供者有前款规定行为的,应当停止提供服务,采取消除等处置措施,保存有关记录,并向有关主管部门报告。
  第四十二条 网络运营者应当建立网络信息安全投诉、举报平台,公布投诉、举报方式等信息,及时受理并处理有关网络信息安全的投诉和举报。
  第四十三条 国家网信部门和有关部门依法履行网络安全监督管理职责,发现法律、行政法规禁止发布或者传输的信息的,应当要求网络运营者停止传输,采取消除等处置措施,保存有关记录;对来源于中华人民共和国境外的上述信息,应当通知有关机构采取技术措施和其他必要措施阻断信息传播。

第五章 监测预警与应急处置

  第四十四条 国家建立网络安全监测预警和信息通报制度。国家网信部门应当统筹协调有关部门加强网络安全信息收集、分析和通报工作,按照规定统一发布网络安全监测预警信息。
  第四十五条 负责关键信息基础设施安全保护工作的部门,应当建立健全本行业、本领域的网络安全监测预警和信息通报制度,并按照规定报送网络安全监测预警信息。
  第四十六条 国家网信部门协调有关部门建立健全网络安全应急工作机制,制定网络安全事件应急预案,并定期组织演练。
  负责关键信息基础设施安全保护工作的部门应当制定本行业、本领域的网络安全事件应急预案,并定期组织演练。
  网络安全事件应急预案应当按照事件发生后的危害程度、影响范围等因素对网络安全事件进行分级,并规定相应的应急处置措施。
  第四十七条 网络安全事件即将发生或者发生的可能性增大时,县级以上人民政府有关部门应当依照有关法律、行政法规和国务院规定的权限和程序,发布相应级别的预警信息,并根据即将发生的事件的特点和可能造成的危害,采取下列措施:
  (一)要求有关部门、机构和人员及时收集、报告有关信息,加强对网络安全事件发生、发展情况的监测;
  (二)组织有关部门、机构和专业人员,对网络安全事件信息进行分析评估,预测事件发生的可能性、影响范围和危害程度;
  (三)向社会发布与公众有关的预测信息和分析评估结果;
  (四)按照规定向社会发布可能受到网络安全事件危害的警告,发布避免、减轻危害的措施。
  第四十八条 发生网络安全事件,县级以上人民政府有关部门应当立即启动网络安全事件应急预案,对网络安全事件进行调查和评估,要求网络运营者采取技术措施和其他必要措施,消除安全隐患,防止危害扩大,并及时向社会发布与公众有关的警示信息。
  第四十九条 因网络安全事件,发生突发事件或者安全生产事故的,应当依照《中华人民共和国突发事件应对法》、《中华人民共和国安全生产法》等有关法律的规定处置。
  第五十条 因维护国家安全和社会公共秩序,处置重大突发社会安全事件的需要,国务院或者省、自治区、直辖市人民政府经国务院批准,可以在部分地区对网络通信采取限制等临时措施。

第六章 法律责任

  第五十一条 网络运营者不履行本法第十七条、第二十一条规定的网络安全保护义务的,由有关主管部门责令改正,给予警告;拒不改正或者导致危害网络安全等后果的,处一万元以上十万元以下罚款;对直接负责的主管人员处五千元以上五万元以下罚款。
  关键信息基础设施的运营者不履行本法第二十七条至第二十九条、第三十二条规定的网络安全保护义务的,由有关主管部门责令改正,给予警告;拒不改正或者导致危害网络安全等后果的,处十万元以上一百万元以下罚款;对直接负责的主管人员处一万元以上十万元以下罚款。
  第五十二条 网络产品、服务的提供者,电子信息发送者,应用软件提供者违反本法规定,有下列行为之一的,由有关主管部门责令改正,给予警告;拒不改正或者导致危害网络安全等后果的,处五万元以上五十万元以下罚款;对直接负责的主管人员处一万元以上十万元以下罚款:
  (一)设置恶意程序的;
  (二)其产品、服务具有收集用户信息功能,未向用户明示并取得同意的;
  (三)对其产品、服务存在的安全缺陷、漏洞等风险未及时向用户告知并采取补救措施的;
  (四)擅自终止为其产品、服务提供安全维护的。
  第五十三条 网络运营者违反本法规定,未要求用户提供真实身份信息,或者对不提供真实身份信息的用户提供相关服务的,由有关主管部门责令改正;拒不改正或者情节严重的,处五万元以上五十万元以下罚款,并可以由有关主管部门责令暂停相关业务、停业整顿、关闭网站、撤销相关业务许可或者吊销营业执照;对直接负责的主管人员和其他直接责任人员处一万元以上十万元以下罚款。
  第五十四条 网络运营者违反本法规定,侵害公民个人信息依法得到保护的权利的,由有关主管部门责令改正,可以根据情节单处或者并处警告、没收违法所得、处违法所得一倍以上十倍以下罚款,没有违法所得的,处五十万元以下罚款;情节严重的,可以责令暂停相关业务、停业整顿、关闭网站、撤销相关业务许可或者吊销营业执照;对直接负责的主管人员和其他直接责任人员处一万元以上十万元以下罚款。
  违反本法规定,窃取或者以其他方式非法获取、出售或者非法向他人提供公民个人信息,尚不构成犯罪的,由公安机关没收违法所得,并处违法所得一倍以上十倍以下罚款,没有违法所得的,处五十万元以下罚款。
  第五十五条 关键信息基础设施的运营者违反本法第三十条规定,使用未经安全审查或者安全审查未通过的网络产品或者服务的,由有关主管部门责令停止使用,处采购金额一倍以上十倍以下罚款;对直接负责的主管人员和其他直接责任人员处一万元以上十万元以下罚款。
  第五十六条 关键信息基础设施的运营者违反本法规定,在境外存储网络数据,或者未经安全评估向境外的组织或者个人提供网络数据的,由有关主管部门责令改正,给予警告,没收违法所得,处五万元以上五十万元以下罚款,并可以责令暂停相关业务、停业整顿、关闭网站、撤销相关业务许可或者吊销营业执照;对直接负责的主管人员和其他直接责任人员处一万元以上十万元以下罚款。
  第五十七条 网络运营者违反本法规定,对法律、行政法规禁止发布或者传输的信息未停止传输、采取消除等处置措施、保存有关记录的,由有关主管部门责令改正,给予警告,没收违法所得;拒不改正或者情节严重的,处十万元以上五十万元以下罚款,并可以责令暂停相关业务、停业整顿、关闭网站、撤销相关业务许可或者吊销营业执照;对直接负责的主管人员和其他直接责任人员处二万元以上二十万元以下罚款。
  电子信息发送服务提供者、应用软件下载服务提供者,未履行本法规定的安全义务的,依照前款规定处罚。
  第五十八条 发布或者传输法律、行政法规禁止发布或者传输的信息的,依照有关法律、行政法规的规定处罚。
  第五十九条 网络运营者违反本法规定,有下列行为之一的,由有关主管部门责令改正;拒不改正或者情节严重的,处五万元以上五十万元以下罚款;对直接负责的主管人员和其他直接责任人员,处一万元以上十万元以下罚款:
  (一)未将网络安全风险、网络安全事件向有关主管部门报告的;
  (二)拒绝、阻碍有关部门依法实施的监督检查的;
  (三)拒不提供必要的支持与协助的。
  第六十条 有本法第二十二条规定的危害网络安全的行为,尚不构成犯罪的,或者有其他违反本法规定的行为,构成违反治安管理行为的,依法给予治安管理处罚。
  第六十一条 国家机关政务网络的运营者不履行本法规定的网络安全保护义务的,由其上级机关或者有关机关责令改正;对直接负责的主管人员和其他直接责任人员依法给予处分。
  第六十二条 依法负有网络安全监督管理职责的部门的工作人员,玩忽职守、滥用职权、徇私舞弊,尚不构成犯罪的,依法给予行政处分。
  第六十三条 违反本法规定,给他人造成损害的,依法承担民事责任。
  第六十四条 违反本法规定,构成犯罪的,依法追究刑事责任。

第七章 附  则

  第六十五条 本法下列用语的含义:
  (一)网络,是指由计算机或者其他信息终端及相关设备组成的按照一定的规则和程序对信息进行收集、存储、传输、交换、处理的网络和系统。
  (二)网络安全,是指通过采取必要措施,防范对网络的攻击、入侵、干扰、破坏和非法使用以及意外事故,使网络处于稳定可靠运行的状态,以及保障网络存储、传输、处理信息的完整性、保密性、可用性的能力。
  (三)网络运营者,是指网络的所有者、管理者以及利用他人所有或者管理的网络提供相关服务的网络服务提供者,包括基础电信运营者、网络信息服务提供者、重要信息系统运营者等。
  (四)网络数据,是指通过网络收集、存储、传输、处理和产生的各种电子数据。
  (五)公民个人信息,是指以电子或者其他方式记录的公民的姓名、出生日期、身份证件号码、个人生物识别信息、职业、住址、电话号码等个人身份信息,以及其他能够单独或者与其他信息结合能够识别公民个人身份的各种信息。
  第六十六条 存储、处理涉及国家秘密信息的网络的运行安全保护,除应当遵守本法外,还应当遵守保密法律、行政法规的规定。
  第六十七条 军事网络和信息安全保护办法,由中央军事委员会制定。
  第六十八条 本法自  年 月 日起施行。

BeagleBone Black的一些资料

前段时间在胡乱捣弄bbb,最后的结果反正是,bbb没办法从eMMC启动了。之前不确定是什么问题,从网上买了Micro HDMI转HDMI的线,忘了自己的显示器是DP口了,只好又买了个HDMI转DVI的线😂。

看了屏幕才想起来了,之前在配置启动自动加载外置硬盘时候,随手写了个,“外接硬盘必须正常挂载才能启动”的配置,于是,再也启动不起来了😂。最近暂时不管了,晾一边了。不过也找到了一些bbb的资料,顺道记录一下。

启动模式

四种引导模式:

  • eMMC引导:这是默认启动模式,启动时间最短。不需要一个含有OS镜像的TF卡,也不需要购买TF卡以及读卡器

  • SD引导:此模式将从TF卡插槽引导开机。这个模式可以用来重写eMMC。再生产或者现场更新时,可用来升级eMMC。

  • 串口引导模式:这个模式可以利用串口直接下载软件。需要准备一个USB转TTL的线。

  • USB引导模式:这个模式支持通过USB口引导。

可以通过一个开关来切换引导模式————断电情况下按住BOOT按钮,重新上电会,如果没有TF卡插入,会强制从USB口引导,如果USB口不能引导,会从串口引导。

如果没有按住BOOT按钮 ,板子会按照eMMC->TF卡->串口->USB口的顺序进行引导。如果按住BOOT按钮重新上电,并且插有含有可启动映像的TF卡的话,会从TF卡引导。

注:按主板上的RESET按钮,将不会导致引导模式的改变。必须切断电源并重新接通电源来更改引导模式。启动引脚上电时采样上电复位从PMIC到处理器。电路板上的复位按钮只有一个热复位并不会强制引导模式转变。

macroSD卡启动及恢复

BeagleBone Black的macroSD卡启动及恢复

  • 将BBB flash(emmc)上的bootloader(MLO文件)更名
  • 在macro SD卡上安装新的系统,使用SD启动新系统,例如我安装ubuntu系统
    在BBB上插入SD卡,由于BBB eMMC已经没有bootloader文件,BBB就直接从SD卡启动ubuntu,这避免了40多分钟的SD卡烧写eMMC的问题。
  • 修复emmc上的MLO,以便能够恢复从BBB flash中启动
    用SD启动进入ubuntu系统,sudo到root权限,查看系统分区fdisk -l
    看到两个mmc磁盘/dev/mmcblk0, /dev/mmcblk1,找到那个size为2G的磁盘,这就是BBB的flash, mount这个盘上的boot分区,恢复MLO的文件名

      #mount /dev/mmcblk1p1 /mnt/tmp
      #cd /mnt/tmp
      #mv MLO.rename MLO
    

参考资料: