idk what it even means to "have disk space"
Essa é uma metaquestão perspicaz, porque é subjacente à sua questão.
Para entender o que significa "desvincular" um arquivo, é útil entender o que significa "vincular" um arquivo e o que "um arquivo" é. Acredite ou não, "um arquivo" é, como os três homens cegos e um elefante, coisas diferentes para pessoas diferentes.
A resposta depende do sistema de arquivos. No Windows, você provavelmente usou o NTFS; no Linux você pode usar o ext3. Vou restringir minha resposta ao lado do Linux, e ainda aos sistemas de arquivos (como ext3) que usam inodes para descrever arquivos, que a maioria dos nativos faz.
Esses filesytems organizam o espaço em disco bruto em termos de blocos. Espalhados entre os blocos estão alguns que contêm inodes. Cada inode contém informações sobre um arquivo: propriedade, permissões e o local & tamanho dos dados que está usando.
O sistema de arquivos está cheio de inodes, apenas esperando para serem usados. Antigamente, o número de inodes era fixo quando o sistema de arquivos era criado e, se você ficou sem inodes, "ficou sem espaço" porque não foi possível criar novos arquivos. Hoje em dia, isso geralmente é tratado dinamicamente.
O sistema de arquivos monitora onde estão todos os inodes, quais estão em uso e quais blocos permanecem não atribuídos. Para "ter espaço em disco" é ter blocos que não estão alocados para qualquer inode.
Quando você cria um novo arquivo, você realmente faz duas coisas:
- pegue um inode dos não usados
- atribua um nome
O primeiro passo não pode ser feito separadamente. Você não pode manipular o inode diretamente. O sistema operacional não tem funções para isso. Criamos e abrimos arquivos pelo nome; os detalhes o inode fica no kernel.
O segundo passo pode ser repetido com ln (1): você pode atribuir tantos nomes a um inode quanto desejar. Chamamos essa etapa de "vinculação" porque você vincula um nome ao arquivo. Você inverte o processo removendo o link com rm (1). Há ainda outro nome para isso: unlink (1). E agora você sabe por que é chamado "rm" e não "del": estamos removendo um link, não excluindo um arquivo.
Quando um arquivo é excluído, então? Qual é o oposto de criar um arquivo?
- remova o link do inode para seu nome
- renunciar ao inode
Remover o link é realizado primeiro. Antes que o inode seja então colocado na pilha não utilizada, duas restrições devem ser satisfeitas:
- Como um inode possui mais de um nome, ele permanece em uso até que nenhum nome seja vinculado a ele. Isso é o que significa quando os links caem para zero em alguma documentação que você possa encontrar.
- Como um inode pode estar aberto - um programa o está usando - o SO não colocará o inode na pilha não usada até que nenhum descritor de arquivo faça referência a ele (quando nenhum programa tiver o arquivo aberto).
Uma vez que um inode não tem nenhum nome vinculado a ele, é apenas uma questão de tempo antes de ser abandonado. Como um inode pode ser referido apenas por um nome vinculado a ele, é impossível criar um novo link ou abrir um arquivo sem um nome. Qualquer tentativa de abrir um arquivo com o mesmo nome apenas resultará em um novo arquivo: aloque um inode diferente e vincule o nome a ele.
Muitas pessoas acham esse comportamento confuso quando o encontram pela primeira vez e frustram quando não conseguem liberar espaço em disco "excluindo um arquivo grande" que está sendo usado por um processo em execução. Faz mais sentido se você tentar imaginar o que aconteceria com um programa se um arquivo que ele estava usando desaparecesse de repente. Ou se você já experimentou o erro inescrutável do Windows, "o arquivo não pode ser excluído porque está aberto em outro programa". Com inodes, você nunca recebe essa mensagem porque nenhum arquivo é excluído enquanto está aberto em outro programa.