Linux 工具安装失败,为什么不把检查提前到写文件之前?

本文探讨Linux工具安装失败的根本原因,提出将兼容性检查(平台、架构、空间)提前至写文件前的预检机制。强调包清单需明确声明前提,目标标识需归一化处理,空间检查须针对实际文件系统,预检结果需有时效性与可追溯性。指出预检不能替代安装后探针,二者证据互补。所有验证基于Python标准库接口,聚焦可重复、只读、受控的判定逻辑。

安装之前,先把不兼容说清楚

安装程序复制了一半文件,才发现目标架构不支持;或者替换了入口,随后才报告空间不足。使用者面对的是半成品状态,恢复成本比一句明确的不兼容提示高得多。

安装前检查可以先完成只读判断,保留不通过原因,再进入受控安装。本文使用合成包清单和目标记录验证判定,没有安装软件、修改权限或探测真实二进制兼容性。

包本身先声明前提

清单至少说明操作系统、支持架构、必要运行时、配置格式与空间预算来源。没有这些要求,检查程序只能猜测。不能把“支持 Linux”当成所有发行版、内核与库版本都可运行。

空间预算也不只是最终程序大小,还包括暂存解包、旧版本保留和失败恢复需要的余量。示例中的数字仅用于检查逻辑,不是工具真实占用。

检查项预检需要的事实不通过时的结果
平台与架构包要求、目标标准化标识明确列出不匹配字段
运行条件依赖版本与功能支持提示缺失前提,不自动安装
空间目标与暂存位置的预算停止,不留下半成品
既有配置格式版本、迁移与回退条件先要求处理不兼容配置
当前状态是否已有安装或任务运行按既定升级流程处理

未知与不匹配应分开。读取失败不能默认填一个“支持”的值,再继续执行。

先用目标记录测试判定

下面省略清单类型校验,只保留平台、架构和空间判定:

def preflight(package, target):
    failures = []
    if target.get("os") != package["os"]:
        failures.append("os mismatch")
    if target.get("arch") not in package["arches"]:
        failures.append("arch mismatch")
    if target.get("free_bytes") is None:
        failures.append("space unknown")
    elif target["free_bytes"] < package["required_bytes"]:
        failures.append("space insufficient")
    return failures

本地验证用一个声明支持 Linux、aarch64、需要 10 MiB 的合成包:兼容且空间充足的记录通过;Darwin 记录、空间只有一个字节的记录及空间字段缺失的记录,都得到对应失败原因。这里没有真实包,也没有据此确认某个目标能安装。

函数没有检查内核、libc、动态加载器、CPU 特性或文件系统能力,不能作为完整兼容性检查。它的作用是让判定路径先有可重复的反例。

采集标识时别直接比较展示字符串

Python 的 platform 文档说明机器类型名称具有平台差异,无法确定时也可能为空。人类可读的平台长字符串更不适合直接拿来做精确匹配。

实际适配器需要把受支持的别名归一化到明确集合,未知值保留失败;架构标识匹配也不证明二进制所需指令或 ABI 兼容。应把静态判断和受控运行探针分别登记。

空间采集可以参考 shutil.disk_usage,但必须查实际写入所在文件系统。解包和最终目录如果不在同一处,要分别检查。本文只核对接口文档,没有采集本机剩余空间或执行安装探针。

预检结果需要有有效范围

平台不匹配、空间不足和材料未知时停止说明,预检通过后仍需安装探针

检查通过只是某个时刻、某份包、某个目标的判断。之后空间可能变化,配置也可能被维护流程更新。安装开始前应重新核对关键状态,并在每次写入或切换时处理失败,不能依赖旧预检结果承诺完成。

保留包摘要、清单版本、目标信息来源和检查时间,便于说明“当时为什么允许继续”。不要采集与安装无关的机器信息;诊断记录也不应顺带包含凭据或完整用户环境。

对已有安装,先识别是首次安装、修复还是升级。预检不应自动覆盖旧配置,更不该为了让结果通过而改权限。缺少前提就报告缺少什么,让维护流程决定下一步。

安装后的探针仍然不能省

文件复制成功后,还要确认实际程序能启动、读取允许配置并完成一个有限任务。预检识别平台,探针验证具体执行,两者证据不同。

若探针失败,按已定义的回退流程恢复并再次核对;如果恢复也失败,就明确停在失败状态。本文没有实现安装器或恢复器,因此不提供完整安装命令,也不写“检查通过即可放心安装”。

第一版可以先交付一个只读预检命令,输出通过项、失败项与未知项。它能把明显问题提前说清楚,但真正可维护的安装流程,还需要目标设备上的失败演练。

资料与验证范围

  • 官方依据:Python platform、shutil.disk_usage。
  • 已执行:合成包与目标记录的通过、平台不匹配、空间不足和未知空间断言。
  • 未执行:真实平台采集、二进制探针、安装、权限修改、配置迁移、浏览器、真实 API 和生产构建。示例空间不代表实测要求。
深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值