3 ms·
> No. The file system, is the abstraction. Adding /proc onto it is a use of that abstraction. Agree that the file system is an abstraction. Makes us think in t
by useerup 11y ago
> No. The file system, is the abstraction. Adding /proc onto it is a use of that abstraction.
Agree that the file system is an abstraction. Makes us think in terms of directories (containers) and files (items). Everything in the file system is designed around the idea of files and directories. Permissions (rwx), operations (create, move, copy, append, delete).
However, already adding /proc challenges that. What does it mean to have "execute" right to a process? It is already running? What does it mean to append to a process? to move it? If processes are "files", why can I not kill the process by deleting the file? Processes are not naturally files. Yes, it makes somewhat sense if you think of /proc as status information being maintained for each process, i.e. they are extracts, owned by the OS.
But UEFI vars makes absolutely no sense. It is a true leaky abstraction. If one need to be able to write to UEFI vars, then create an API for it, possibly some utilities. That way I need not risk altering fundamental firmware settings by performing seemingly file system operations whose effect I expect to be limited to the hierarchy!
> The great thing about having a unified file hierarchy in the (b) abstraction is that tooling works on all of these different classes of objects different. It's really just the "CRUD" idiom, and normally it allows things to interoperate quite smoothly. I can write a bash script that draws a progress bar of my battery, and it requires no knowledge other than where in the file hierarchy the battery is.
But it actually just sweeping complexity under the rug. I need documentation for what the file contains on each "line" - what it means to write to it, etc. It is not discoverable at all. If you expose system resources as actual resources and do not try to map them onto files, you can actually make a discoverable system. An example of such a regime is CIM. On Windows, PowerShell (or Python or VBScript or ...) can be used to interact with such fundamental system resources. To use your example of a progress bar of the battery, here is an example of how the entire process from discovering the correct ressource (the battery) to displaying a progress bar on Windows without consulting documentation:
PS C:\> #there's probably some class for batteries. let's look for it by name
PS C:\> get-cimclass *battery*
NameSpace: ROOT/cimv2
CimClassName CimClassMethods CimClassProperties
------------ --------------- ------------------
CIM_Battery {SetPowerState, R... {Caption, Description, InstallDate, Name...}
Win32_Battery {SetPowerState, R... {Caption, Description, InstallDate, Name...}
Win32_PortableBattery {SetPowerState, R... {Caption, Description, InstallDate, Name...}
CIM_AssociatedBattery {} {Antecedent, Dependent}
PS C:\> # the Win32_Battery probably offers the most specific information
PS C:\> Get-CimInstance Win32_Battery
Caption : Internal Battery
Description : Internal Battery
Name : DELL 1C75X31
Status : OK
Availability : 2
CreationClassName : Win32_Battery
DeviceID : 647Samsung SDIDELL 1C75X31
PowerManagementCapabilities : {1}
PowerManagementSupported : False
SystemCreationClassName : Win32_ComputerSystem
...
BatteryStatus : 2
Chemistry : 6
DesignCapacity :
DesignVoltage : 12992
EstimatedChargeRemaining : 94
EstimatedRunTime : 71582788
ExpectedLife :
MaxRechargeTime :
...
ExpectedBatteryLife :
PS C:\> # yep - that's it. lets save this instance in a variable
PS C:\> $bat = Get-CimInstance Win32_Battery
PS C:\> # display a progress bar and update it continually every 10 secs
PS C:\> for(){ Write-Progress Battery -PercentComplete $bat.EstimatedChargeRemaining -Status "Charge remaining"; sleep 10 }
> This is, of course, a case where the power is somewhat biting us.
No, what biting us is a leaky abstraction that surprises us: We can accidentally delete firmware variables because file system operations are not constrained to the directories/files they operate on.
> That doesn't make the abstraction wrong
It is an abuse of the abstraction.
> Any other implementation of UEFI variables is going to have a "delete" call, AFAICT.
Indeed. In PowerShell you can discover the commands for manipulating by
gcm UEFI
> What bit us here is that all the objects are in one bucket together, and thus rm -rf / removes more than just files.
No, what bit us is the broken expectation (a surprise) that a higher-level resource was mapped below some file system directory.
- stinos 11y agoOff-topic, but imo HN needs more PS-promoting posts like this. I have the impression there are still tons of people out there who're stuck in the 'windows has no proper command line so administration means ugly batch files and registry hacks' mindset. Examples like this should open their eyes. Sure you can't pipe text around (and go through hoops to parse it corectly) like in bash so it takes some getting used to depending on your background, but one you get a hold of it you realize it really is powershell.
- mjhoy 11y agoI still am not convinced it is a leaky abstraction because of this. Perhaps it is a surprising one, it certainly took me a while to learn about it, I don't think I really appreciated universal file I/O until I worked through a bit of The Linux Programming Interface (recommended!). I see the filesystem now as a standard interface to many parts of the system (including hardware, processes, kernel state, etc) through the kernel. I don't think that /proc/1 is a process, it is an interface to information about a process. It makes sense to me UEFI variables are exposed this way. In fact if anything I'd say the abstraction is not leaky enough here: deleting the files deletes information on firmware, isn't that the promise of a "regular" file? :) Again, I am not defending the current behavior! There's nothing about the abstraction that says such a file must obey to `rm` in this way. I recently ran into a funny bug, however, that makes me more sympathetic to your point. In Emacs a version of TRAMP mode (which is used to connect to remote servers or to connect locally as a different user) would try to cleanup itself by deleting some sort of tramp history file after a session. And if the history file didn't exist to begin with (or if a setting disabled it, I'm not sure exactly) someone thought it appropriate to simply open up "/dev/null", throwing away all writes to the file -- OK, makes sense so far. But in TRAMP I often connect as root to my own machine -- it makes it easy to edit files as root, or run a shell in root. And as root you have the power to delete /dev/null! So, TRAMP would delete it without my knowledge... what's odd is that it quickly gets created again (perhaps by Emacs) so that it appears to exist, except that suddenly a) it's a regular file and b) it's owned as root without world write/read permission, so that suddenly all sorts of things start to fail because they can't open /dev/null. Fun.