Blog Archives

Nov 13

C:\ProgramData\Package Cache 目录一直作为基于 Wix 打包的 msi 格式的软件安装包自动备份目录,但是这会大幅占用 C 盘空间,目前网上的做法普遍使用 mklink 创建目录符号链接,但这种方法有一个 bug,因为 Wix 并不支持符号链接,在每次卸载的时候,会自动清除符号链接,这样导致系统找不到真实的 Package Cache 目录,从而不能卸载其他 msi 格式的软件。

实际上,2015 年时官方给了另一个解决方案,可以通过修改注册表来修改 Package Cache 目录(以修改到D盘为例,目录自行修改,注意目录必须要用双斜杠\\

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\WiX\Burn]
"PackageCache"="D:\\ProgramData\\Package Cache"

不过这个方法也具有一定的局限性,就是对基于旧版 Wix 的 msi 安装包无效(大约 2015 年之前的),不过相比较不能识别 mklink 软连接的大 bug,这是一个很好的解决方案

powered by
https://devblogs.microsoft.com/setup/redirect-the-package-cache-using-registry-based-policy/

Tags:

Mar 30

NFS 比 SAMBA 稳定,速度也快,所以决定用 NFS 取代 PHICOMM N1上的 SAMBA 共享。

一. 服务端,N1 运行 Ubuntu 18.04 版本,IP 为 192.168.2.20。

1. 首先停用 SAMBA。

sudo systemctl stop smbd
sudo systemctl disable smbd

2. 安装 NFS 服务组件:

sudo apt-get install nfs-kernel-server

3. 配置 NFS:

sudo nano /etc/exports

添加需要共享的目录,例如:

#共享目录 #允许的客户端网段(挂载选项)
/sync 192.168.2.0/24(rw,sync,no_subtree_check)

如果要为 Android 系统(例如电视盒子等)或者 OSX 等提供服务,需要加 insecure 参数:

#共享目录 #允许的客户端网段(挂载选项)
/sync 192.168.2.0/24(rw,async,insecure,no_subtree_check)

4. 重启 NFS 服务即可:

sudo systemctl restart nfs-server

二. 客户端,Windows 10,需要企业版。

1. 首先启用 NFS 客户端:控制面板\程序\程序和功能 - 启用或关闭 Windows 功能,选中 NFS 服务 下的 NFS 客户端

2. 此时进入 CMD 命令行可以测试连接:

showmount -e 192.168.2.20

完整用法

showmount -e [server] 显示 NFS 服务器导出的所有共享。
showmount -a [server] 列出客户端主机名或 IP 地址,以及使用“主机:目录”格式显示的安装目录。
showmount -d [server] 显示 NFS 服务器上当前由某些 NFS 客户端安装的目录。

3. 此时挂载后只能读不能写,如需读写,需要修改注册表:
通过修改注册表将 Windows 10 访问 NFS 时的 UID 和 GID 改成 0 即可(其实就是 Linux 下的 root),步骤如下:
a、在运行中输入 regedit,打开注册表编辑器;
b、进入 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default 条目;
c、选择新建 DWORD 值,新建 AnonymousUid,AnonymousGid 两个值,值为 0;
d、重启系统;

4. 如临时使用,可用命令行挂载:

mount \\192.168.2.20\sync S:

注意,如果挂载后在我的电脑里不显示盘符,请退出管理员权限的 CMD,卸载后在普通权限的 CMD 下重新挂载!

完整用法:

用法: mount [-o options] [-u:username] [-p: ] <\\computername\sharename>

-o rsize=size 设置读取缓冲区的大小(以 KB 为单位)。
-o wsize=size 设置写入缓冲区的大小(以 KB 为单位)。
-o timeout=time 设置 RPC 调用的超时值(以秒为单位)。
-o retry=number 设置软装载的重试次数。
-o mtype=soft|hard 设置装载类型。
-o lang=euc-jp|euc-tw|euc-kr|shift-jis|big5|ksc5601|gb2312-80|ansi
指定用于文件和目录名称的编码。
-o fileaccess=mode 指定文件的权限模式。
这些模式用于在 NFS 服务器上创建的
新文件。使用 UNIX 样式模式位指定。
-o anon 作为匿名用户装载。
-o nolock 禁用锁定。
-o casesensitive=yes|no 指定在服务器上执行区分大小写的文件查找。
-o sec=sys|krb5|krb5i|krb5p

5. 如需要重启后自动挂载,可以向添加 SAMBA 共享一样使用磁盘映射,格式也一样,但需要注意:卸载时不要使用资源管理器的 “断开网络驱动器”,要去命令行用:

umount S:

卸载,如果要卸载全部 NFS 网络驱动器,用:

umount -f -a


Mar 25

Windows 7 豪华中文版,在线安装英文语言包失败,用 Vistalizator 安装也失败。

查看出错代码 0x80070052。

原来是我把系统临时目录设到了内存盘,而这个内存盘为了性能我使用的是 FAT32 格式~ 安装语言包时它会解压 N 多个小文件/文件夹到临时目录,可能就是这出了问题。重新格式化内存盘为 NTFS 格式,安装成功!

FAT32 标称为65534,实际到2万+时已不稳定。
NTFS 似乎没有明确限制单目录文件数量,但有人反应在生成10万+ 文件的目录时遇到报错,想来应该是和文件属性(文件名等)、磁盘使用状况相关,至于对效率的影响,可以参考以下内容,以下内容为转载

似乎 FAT32 文件系统下的单一目录下的文件数限制在 20000 -30000 之间的一个数字。。。

具体就不知道是哪个了。。因为我在 解压一个有 30000 多个文件的 rar 文件到 fat32 目录的时候出现 磁盘满的提示。。但是磁盘并没有满。。。 每个目录都要描述它的内容所在的磁盘位置,名字等信息。这些信息是连续存放的,而且空间有限,用完了就不能再加了。改进的文件系统,目录信息自身也是在磁盘上不连续分布的,就没有这个问题了。不过一般来讲这个都不是问题。在文件很多的系统中,往往会自己创建子目录进行分类。比如VSS.
对于FAT16文件系统,可以保存的文件体积最大值是 4 GB - 1 byte (2^32 bytes - 1 byte);卷的最大体积是4GB;每个卷上最多可以保存的文件数量是65,536个 (2^16);根目录下可以保存的文件和文件夹数量最大值是512个(如果使用了长文件名,该数字还会减小)

对于FAT32文件系统, 可以保存的文件体积最大值是 4 GB - 1 byte (2^32 bytes - 1 byte);Windows自带的工具可以创建的卷的最大体积是32GB;每个卷中最多可以保存的文件数量是4,177,920个;一个特定文件夹中最多可以保存的子文件夹和文件的数量是65,534(如果使用了长文件名,那么该数字会减小)

对于NTFS文件系统,可以保存的文件的大小的最大值,理论上是16EB - 1 KB (2^64 bytes - 1 KB)(1EB=1024PB=1024TB=1024GB) ,实际实现过的最大值是16TB - 64 KB (2^44 bytes - 64 KB);卷的体积最大值,理论上可以达到2^64个簇 - 1个簇,实际实现过的最大值是2^56 TB - 64 KB ( 2^32 个簇 - 1个簇);每个卷可以包含的文件个数的最大值是4,294,967,295个 (2^32 - 1)

理论上FAT32单个目录下,最多可以包括65534个子目录或者文件。但是如果采用长文件名命名的话,实际可以容纳的文件数目会远远小于6万多。2万多属于正常现象。

NTFS克服了这个问题,但是对于单个目录下多文件的操作(拷贝,移动或者删除),比如说几万个小文件,每个十几k大,仍然十分头疼,个人觉得是死穴,也是正常现象。


Aug 30

之前类似:

user_pref("dom.ipc.plugins.enabled", false);

的方法已经失效。

新方法:

1. about:config 新加个布尔值(boolean):

dom.ipc.plugins.unloadASAP 设成 true

有插件的时候有进程,没插件就没进程,14.0.1上正常;

2. 完全禁用:

在 Vista ~ Windows 8 系统,我的电脑,属性中,添加“环境变量”

MOZ_DISABLE_OOP_PLUGIN 值设为 YES

这样有没有插件都不会启动 plugin-container.exe。


Aug 09

家中或者公司使用了 Tomato 或者 DD-WRT 固件路由器的同学可能想分享他们的“私密” Hosts 文件,但是又不方便拷贝到每台机器,那么把这个 Hosts 文件内容放到路由器上是最方便的,不过 DNSMasq 的 Hosts 文件与 Windows 的 Hosts 文件格式不同,需要做一个转换,于是有了下面这个 HTML 文件,其实就是一个简单的 Javascript 转换。复制所有内容,存为任意命名的 HTML 文件,用浏览器打开,然后点击转换按钮,把转换后的数据贴到路由器 DNS 设置界面就行了。


<!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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Hosts2DNSMasq</title>
<script type="text/javascript">
//类似 PHP 中的 trim
    function trim(str) {
        var str = str.replace(/^\s\s*/, ''),
            ws = /\s/,
            i = str.length;
        while (ws.test(str.charAt(--i)));
        return str.slice(0, i + 1);
    }
//转换 Hosts 文件格式到 DNSMasq 的格式
    function htol(el) {
        var i;
        var localz = new Array();
        var hosts = document.getElementById(el).value;
        var localzs='';
        hostdomain = hosts.split("\n");
        for (i=0;i<hostdomain.length;i++) {
            if (trim(hostdomain[i]) != '') {
                localz[i] = hostdomain[i].split("\t");
                if (localz[i][1] != undefined && localz[i][0].indexOf("#") == -1) {
                    localzs += 'address=/'+localz[i][1]+'/'+localz[i][0]+'\n';
                } else {
                    localzs += hostdomain[i]+'\n';
                }
            }
        }
        document.getElementById(el).value = localzs;
    }
</script>
</head>
<body>
    <div style="width:1024px; margin:0 auto;">
            <h2>HOSTS</h2>
            <div style="margin: 5px auto; display: block;">
            <button type="button" id="hosttolocal" onclick="htol('hostsMap');">ConventerToDNSMASQ</button>
            </div>
            <textarea id="hostsMap" onclick="this.focus();this.select()" style="width:98%;height:550px;margin:0;padding:3px;display:block;"></textarea>
    </div>
</body>
</html>

例如以下的 Hosts 数据:


203.208.45.200	base0.googlehosted.com
203.208.45.200	base1.googlehosted.com
203.208.45.200	base2.googlehosted.com
203.208.45.200	base3.googlehosted.com
203.208.45.200	base4.googlehosted.com
203.208.45.200	base5.googlehosted.com
203.208.45.200	bks0.books.google.com
203.208.45.200	bks1.books.google.com

会被转换成:


address=/base0.googlehosted.com/203.208.45.200
address=/base1.googlehosted.com/203.208.45.200
address=/base2.googlehosted.com/203.208.45.200
address=/base3.googlehosted.com/203.208.45.200
address=/base4.googlehosted.com/203.208.45.200
address=/base5.googlehosted.com/203.208.45.200
address=/bks0.books.google.com/203.208.45.200
address=/bks1.books.google.com/203.208.45.200

注意,只是做了简单的格式转换,没有利用 DNSMasq 的(泛域名)特性优化。 :shock:


[2/7]  < 1 2 3 4 5 6 7 >